Python 3 邮件正文编码

5

我正在设置一个脚本,将进入的邮件转发给一组收件人。

这是我现在拥有的:

我从stdin(也就是postfix传递来的方式)读取邮件:

email_in = sys.stdin.read()

incoming = Parser().parse(email_in)

sender = incoming['from']
this_address = incoming['to']

我测试multipart:

if incoming.is_multipart():
    for payload in incoming.get_payload():
        # if payload.is_multipart(): ...
        body = payload.get_payload()
else:
    body = incoming.get_payload(decode=True)`

我设置了外发消息:
msg = MIMEMultipart()
msg['Subject'] = incoming['subject']
msg['From'] = this_address
msg['reply-to'] = sender
msg['To'] = "foo@bar.com"
msg.attach(MIMEText(body.encode('utf-8'), 'html', _charset='UTF-8'))

s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

这在处理ASCII字符(英文文本)时非常有效,并将其转发。

但是,当我发送非ASCII字符时,它会返回乱码(取决于电子邮件客户端字节或utf-8字符的ASCII表示形式)。

问题可能出在哪里?是在传入方还是传出方?


1
你不需要对 MIMEText 部分进行编码;它会为你编码,选择适当的字符集。但这并不会改变输出结果。 - Martijn Pieters
1个回答

5
问题在于许多电子邮件客户端(包括 Gmail)会使用 base64 发送非 ASCII 邮件。另一方面,stdin 会将所有内容作为字符串传递。如果你使用 Parser.parse() 解析它,它会返回一个带有 base64 的字符串类型。
相反,应该在 get_payload() 方法上使用可选的 decode 参数。当设置了该参数后,该方法返回一个字节类型。之后,您可以使用内置的 decode() 方法来获取 utf-8 字符串,如下所示:
body = payload.get_payload(decode=True)
body = body.decode('utf-8')

Ned Batchelder的演讲中,有关于utf-8和python的深入见解。

我的最终代码运行方式有所不同,您可以在这里检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接