どのように私はPythonのimaplibを使用して電子メールに返信すると、元のメッセージを含めるのですか?

StackOverflow https://stackoverflow.com/questions/2182196

質問

私は現在、サーバーやプロセスから電子メールメッセージを取得するために imaplib に使用しています内容や添付ます。

私は、彼らが処理できる場合は、ステータス/エラーメッセージが表示され、自分のサイト上の結果として生成されたコンテンツへのリンクを含むメッセージに返信したいと思います。これは、元のメッセージを含める必要がありますが(大きくなります)すべての添付ファイルをドロップすると、好ましくは、ちょうど彼らのファイル名/サイズでそれらを交換する必要があります。

私はすでにMIMEメッセージ部分を歩いているので、

は、私は添付ファイルノードを元のメッセージのコピーを含む新しいMIMEメッセージツリーを構築し、削除/置き換えされて何をする必要があるかと仮定しています。

私はその道を開始する前に、

、私は期待していた誰かが私にいくつかのヒントを与えることができます。これを行うには、ライブラリ関数のいずれかの種類がありますか?私はに固執すべき標準的な動作のいずれかの種類?

私は現在/ imaplibsmtplibemailモジュールを使用していますを知っているが、そこでは何かを明らかに見逃している可能性があります。これは、それはそれが容易になりますので、もしdjango.core.emailに何かを使用することができ、あまりにもジャンゴで実行されます。

役に立ちましたか?

解決

次のように着信メッセージの元のMIMEツリー構造は、(email.iterators._structure(msg)を使用して)である

multipart/mixed
    text/html                (message)
    application/octet-stream (attachment 1)
    application/octet-stream (attachment 2)

次の構造でGmailの結果を介して返信

multipart/alternative
    text/plain
    text/html

すなわち。私が思ったとして、彼らはただのテキストとHTMLのバージョンを添付ファイル(良い)を破棄し、提供し、スマートとされていないことを明示的に再構築「引用されたコンテンツを。」

私は、元のメッセージを維持するのに多くのポイントが存在しない添付ファイルを破棄した後のような単純なメッセージで応答し、それは私があまりにも行う必要があり、すべてだと思うし始めています。

私は考え出したので、

それでも、同様に私の元の質問に答えるかもしれない方法になりましたとにかくます。

まず、text / plainのプレースホルダを元のメッセージのすべての添付ファイルを置き換えます:

import email

original = email.message_from_string( ... )

for part in original.walk():
    if (part.get('Content-Disposition')
        and part.get('Content-Disposition').startswith("attachment")):

        part.set_type("text/plain")
        part.set_payload("Attachment removed: %s (%s, %d bytes)"
                         %(part.get_filename(), 
                           part.get_content_type(), 
                           len(part.get_payload(decode=True))))
        del part["Content-Disposition"]
        del part["Content-Transfer-Encoding"]

は、次に返信メッセージを作成します

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.message import MIMEMessage

new = MIMEMultipart("mixed")
body = MIMEMultipart("alternative")
body.attach( MIMEText("reply body text", "plain") )
body.attach( MIMEText("<html>reply body text</html>", "html") )
new.attach(body)

new["Message-ID"] = email.utils.make_msgid()
new["In-Reply-To"] = original["Message-ID"]
new["References"] = original["Message-ID"]
new["Subject"] = "Re: "+original["Subject"]
new["To"] = original["Reply-To"] or original["From"]
new["From"] = "me@mysite.com"

次に、元のMIMEメッセージオブジェクト及び送信を添付

new.attach( MIMEMessage(original) )

s = smtplib.SMTP()
s.sendmail("me@mysite.com", [new["To"]], new.as_string())
s.quit()

得られた構造である

multipart/mixed
    multipart/alternative
        text/plain
        text/html
    message/rfc822
        multipart/mixed
            text/html
            text/plain
            text/plain

それとも、ジャンゴを使用して少し簡単です。

from django.core.mail import EmailMultiAlternatives
from email.mime.message import MIMEMessage

new = EmailMultiAlternatives("Re: "+original["Subject"],
                             "reply body text", 
                             "me@mysite.com", # from
                             [original["Reply-To"] or original["From"]], # to
                             headers = {'Reply-To': "me@mysite.com",
                                        "In-Reply-To": original["Message-ID"],
                                        "References": original["Message-ID"]})
new.attach_alternative("<html>reply body text</html>", "text/html")
new.attach( MIMEMessage(original) ) # attach original message
new.send()
私が後だったものはかなりではありません。

(少なくとも、Gmailの)結果が終了し、元のメッセージを示す「----転送されたメッセージを----」が、一般的なアイデアの作品と私はこの答えは役に立てば幸いMIMEメッセージをいじるする方法を把握しようと、誰かます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top