2

電子メールがコンピューターに送信されるとき、メッセージの DATA セクションは常に文字列で終わります<CRLF>.<CRLF>( RFC 2821および関連する投稿を参照)。Python で電子メール メッセージをデコードする場合、Message.get_payload()(パッケージemail) を介してメッセージのペイロードを取得する便利な関数があります。しかし、この「ペイロード」にはまだ<CRLF>.<CRLF>シーケンスが含まれており、gmail などでメールを見ると抑制されます。

私の質問: Python に、追加の文字が切り取られた REAL メッセージを取得するための便利な関数はありますか? それとも自分でハックする必要がありますか?

4

2 に答える 2

1

メールの最後の<CRLF>.<CRLF>シーケンスは、メッセージの送信に使用されるSMTPプロセスのアーティファクトです。別の方法(POP、IMAP、ローカルメールボックスの読み取りなど)でメッセージを受信した場合、このシーケンスは存在しません。

これはコードがSMTPサーバーとして実行されている場合にのみ存在するため、emailパッケージはメッセージの取得方法を認識せず、文字をメッセージターミネータとしてではなくメッセージの一部として扱います。

SMTPサーバーコードは、メッセージをクラス.<CRLF>に渡す前に、メッセージから最後の3文字()を削除する必要があります。email.Mesasage

これにより、SMTPサーバーコードは次のようになります。

message = ""
while True:
    line = get_line()
    if line == ".\r\n":
        break
    message += line

email = Message.email(message)

これにより、メッセージを。に変換する前に、終了文字が削除されますMessage.email

于 2012-10-29T13:07:29.933 に答える
1

これを行うだけではどうですか(マルチパートメッセージではないと仮定して):

Message.get_payload().rsplit('\r\n', 2)[0]

例では:

>>> s = 'Hi,\r\n\r\nThis is my email.\r\n.\r\n'
>>> print s.rsplit('\r\n', 2)[0]
Hi,

This is my email.
>>>

気になる のだけなら、<CRLF>これほどきれいになることはありません。関数でラップして自己文書化することもできますが、私にとっては、カスタム ライブラリを含めるよりも確実に優れています。

于 2012-10-29T08:59:54.767 に答える