gpt4 book ai didi

Python 3 电子邮件正文编码

转载 作者:太空狗 更新时间:2023-10-30 01:22:01 26 4
gpt4 key购买 nike

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

这是我现在拥有的:

我阅读了来自 stdin 的电子邮件(这就是 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 表示)

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

最佳答案

问题是许多电子邮件客户端(包括 Gmail)在 base64 中发送非 ascii 电子邮件。另一方面,stdin 将所有内容传递到一个字符串中。如果您使用 Parser.parse() 解析它,它会返回一个内部带有 base64 的字符串类型。

取而代之的是,可选的decode 参数应该用在get_payload() 方法上。设置后,该方法返回字节类型。之后,您可以使用内置的 decode() 方法来获取 utf-8 字符串,如下所示:

body = payload.get_payload(decode=True)
body = body.decode('utf-8')

Ned Batchelder's talk. 中对 utf-8 和 python 有很好的洞察力

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

关于Python 3 电子邮件正文编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26997371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com