12

':'私の現在のスクリプトでは、メールを正常に送信できますが、特にこのサンプルでは、​​気に入らない文字がいくつかあります。

import smtplib, sys

mensaje = sys.argv[1]
def mailto(toaddrs, msg):
    fromaddr = 'myemailblabla'

    username = 'thisismyemail'
    password = '122344'

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login(username, password)
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()

mailto('test@gmail.com', mensaje)

たとえば、正常に"Hi there\n how are you?"機能しているとしましょう。ただし、URLを送信しようとするとhttp://www.neopets.com、メールは空白で送信されます。この問題の原因だと思う':'ので、逃げようとしましたが、何もありませんでした。

4

3 に答える 3

17

問題はsmtplib、私のテストの「オリジナルを表示」形式で示されているように、メッセージヘッダーとメッセージ本文の間に空白行を入れていないことです。

Return-Path: <me@gmail.com>
Received: **REDACTED**
        Fri, 03 Aug 2012 06:56:20 -0700 (PDT)
Message-ID: <501bd884.850c320b@mx.google.com>
Date: Fri, 03 Aug 2012 06:56:20 -0700 (PDT)
From: me@gmail.com
http: //www.example.com

これは正当なメールヘッダーですが、メール転送エージェントとメールユーザーエージェントは、理解できない明らかなヘッダーフィールドを無視する必要があります。また、RFC822ヘッダーは最初の空白行まで続きhttp:、ヘッダー行のように見えるため、ヘッダーであるかのように解析されます。改行が与えられた場合:

mensaje = '\nhttp://www.example.com'

その後、期待どおりに動作します。電子メールは技術的にはメールの内容によって提供される「エンベロープ」のみを必要とsmtplibしますが、受信者(およびそのメーラー)がメッセージを適切に処理することを期待する場合は、より完全である必要がありますが、本文を生成するにはおそらく電子メールモジュールを使用する必要があります。

追加した

のdoctestに基づくと、smtplib.pyこれは意図的な機能であり、の呼び出し元がsendmail()ヘッダーに追加できるようになっているように見えます。

     >>> msg = '''\\
     ... From: Me@my.org
     ... Subject: testin'...
     ...
     ... This is a test '''
     >>> s.sendmail("me@my.org", tolist, msg)

From:Subject:行が上記の「素敵な」ヘッダーの一部である場合。

于 2012-08-03T14:08:53.810 に答える
2

適切な解決策は、Pythonemailライブラリを使用して有効なメッセージを作成することです。テキストの断片を結合して、有効なMIMEメッセージ構造を構築する方法を入念に学習する(またはランダムに推測する)のではありません。

ASCIIのみを含む簡単なRFC822メッセージは、次のコマンドで簡単に作成できます。

'From: {0}\nTo: {1}\nSubject: {2}\n\n{3}'.format(
    fromaddr, toaddr,
    'Hello, I am the exiled prince of Ubandingba',
    'http://clickme.example.net/scam/')

ただし、他の文字セット、約80文字を超える行、プレーンテキスト以外のコンテンツタイプ、または一般に1990年のように電子メールよりも高度なものが必要になるとすぐに、コードは次のようになります。

from email.message import EmailMessage

msg = EmailMessage()
msg['from'] = fromaddr
msg['to'] = toaddr
msg['subject'] = 'You have been nominated for the Nobel prize'
msg.set_content('http://scam.example.org/clickme')

これは確かに少し冗長ですが、無限に用途が広く、堅牢で、拡張性があります。

これは、EmailMessagePython3.6で正式に導入されたAPIを使用します。新しいコードは、以前のバージョンのレガシーモジュールではなく、おそらくこのプラットフォームをターゲットにするemail.Message必要がありますが、見つけることができるほとんどのオンラインコード例は、古いPythonライブラリ用です。

于 2019-03-09T15:09:34.473 に答える
0

コロンについてではないと思いますがhttp://、メッセージを始めることについてです。

mailto('test@gmail.com', 'http://www.url.com')
mailto('test@gmail.com', 'http://www.url.com that is a url')
mailto('test@gmail.com', ' http://www.url.com')

すべて失敗しますが:

mailto('test@gmail.com', 'Here is a url http://www.url.com')

うまくいきます。

于 2012-08-03T13:53:45.800 に答える