使用 python 3.4 回复电子邮件 [英] Reply to email using python 3.4
问题描述
我正在尝试使用 Python 3.4 回复电子邮件.电子邮件的收件人将使用 Outlook(不幸的是),Outlook 识别回复并正确显示线程非常重要.
I am trying to reply to an email using Python 3.4. The recipient of the email will be using Outlook (unfortunately) and it is important that Outlook recognizes the reply and displays the thread properly.
我目前拥有的代码是:
def send_mail_multi(headers, text, msgHtml="", orig=None):
"""
"""
msg = MIMEMultipart('mixed')
# Create message container - the correct MIME type is multipart/alternative.
body = MIMEMultipart('alternative')
for k,v in headers.items():
if isinstance(v, list):
v = ', '.join(v)
msg.add_header(k, v)
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
body.attach(MIMEText(text, 'plain'))
if msgHtml != "": body.attach(MIMEText(msgHtml, 'html'))
msg.attach(body)
if orig is not None:
msg.attach(MIMEMessage(get_reply_message(orig)))
# Fix subject
msg["Subject"] = "RE: "+orig["Subject"].replace("Re: ", "").replace("RE: ", "")
msg['In-Reply-To'] = orig["Message-ID"]
msg['References'] = orig["Message-ID"]+orig["References"].strip()
msg['Thread-Topic'] = orig["Thread-Topic"]
msg['Thread-Index'] = orig["Thread-Index"]
send_it(msg['From'], msg['To'], msg)
- 函数
get_reply_message
正在删除任何附件,如 这个答案. send_it
函数设置 Message-ID 标头并使用正确的 SMTP 配置.然后它调用smtplib.sendmail(fr, to, msg.as_string())
- Outlook 收到电子邮件,但无法识别/显示线程.但是,该线程似乎是消息的附件(可能由
msg.attach(MIMEMessage(...))
- The function
get_reply_message
is removing any attachments as in this answer. send_it
function sets the Message-ID header and uses the proper SMTP configuration. Then it callssmtplib.sendmail(fr, to, msg.as_string())
- Outlook receives the email but does not recognize/display the thread. However, the thread seems like being an attachment to the message (probably caused by
msg.attach(MIMEMessage(...))
关于如何做到这一点的任何想法?我错过了任何标题吗?
Any ideas on how to do this? Have I missed any headers?
干杯,
安德烈亚斯
推荐答案
花了我一段时间,但以下似乎有效:
Took me a while but the following seems working:
def send_mail_multi(headers, text, msgHtml="", orig=None):
"""
"""
msg = MIMEMultipart('mixed')
# Create message container - the correct MIME type is multipart/alternative.
body = MIMEMultipart('alternative')
for k,v in headers.items():
if isinstance(v, list):
v = ', '.join(v)
msg.add_header(k, v)
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
if orig is not None:
text, msgHtml2 = append_orig_text(text, msgHtml, orig, False)
# Fix subject
msg["Subject"] = "RE: "+orig["Subject"].replace("Re: ", "").replace("RE: ", "")
msg['In-Reply-To'] = orig["Message-ID"]
msg['References'] = orig["Message-ID"]#+orig["References"].strip()
msg['Thread-Topic'] = orig["Thread-Topic"]
msg['Thread-Index'] = orig["Thread-Index"]
body.attach(MIMEText(text, 'plain'))
if msgHtml != "":
body.attach(MIMEText(msgHtml2, 'html'))
msg.attach(body)
send_it(msg)
def append_orig_text(text, html, orig, google=False):
"""
Append each part of the orig message into 2 new variables
(html and text) and return them. Also, remove any
attachments. If google=True then the reply will be prefixed
with ">". The last is not tested with html messages...
"""
newhtml = ""
newtext = ""
for part in orig.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"]
if part.get_content_type().startswith("text/plain"):
newtext += "
"
newtext += part.get_payload(decode=False)
if google:
newtext = newtext.replace("
","
> ")
elif part.get_content_type().startswith("text/html"):
newhtml += "
"
newhtml += part.get_payload(decode=True).decode("utf-8")
if google:
newhtml = newhtml.replace("
", "
> ")
if newhtml == "":
newhtml = newtext.replace('
', '<br/>')
return (text+'
'+newtext, html+'<br/>'+newhtml)
代码需要稍微整理一下,但 Outlook 可以正确显示它(使用下一个/上一个选项).无需手动创建 From、Send、To、Subject
标头,附加有效的内容.
The code needs a little bit tiding up but as is Outlook displays it correctly (with Next/Previous options). There was no need to create From, Send, To, Subject
headers by hand, appending the content worked.
希望这能节省别人的时间
Hope this saves someone else's time
这篇关于使用 python 3.4 回复电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!