【问题标题】:Python 3 email body encodingPython 3 电子邮件正文编码
【发布时间】:2015-01-15 19:43:20
【问题描述】:

我正在设置一个脚本,将收到的邮件转发到收件人列表。

这是我现在拥有的:

我从标准输入阅读了电子邮件(这就是 postfix 传递它的方式):

email_in = sys.stdin.read()

incoming = Parser().parse(email_in)

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

我测试多部分:

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 表示)

可能是什么问题?是输入端还是输出端?

【问题讨论】:

  • 您不必为MIMEText 部分编码有效负载;它会为您编码,无论如何选择合适的字符集。并不是说这会改变输出。

标签: python email python-3.x utf-8


【解决方案1】:

问题在于许多电子邮件客户端(包括 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's talk.中有对 utf-8 和 python 的深入了解

我的最终代码有点不同,你也可以检查一下here.

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 2017-01-09
    • 2014-05-15
    • 2018-10-17
    • 1970-01-01
    • 2020-08-07
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多