解析器创建的邮件消息有问题
Problem with a mail message created by a parser
如果我这样创建消息(当然使用真实地址):
msg = email.message.EmailMessage()
msg['From'] = "sender@example.com"
msg['To'] = "recipient@example.com"
msg['Subject'] = "Ayons asperges pour le déjeuner"
msg.set_content("Cela ressemble à un excellent recipie déjeuner.")
我可以使用smtplib
成功发送。 body 中的 Unicode 字符没有问题。收到的消息有这些 headers:
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
如果我尝试以这种替代方式创建相同的消息:
msgsource = """\
From: sender@example.com
To: recipient@example.com
Subject: Ayons asperges pour le déjeuner
Cela ressemble à un excellent recipie déjeuner.
"""
msg = email.parser.Parser(policy=email.policy.default).parsestr(msgsource)
无法发送。来自 smtplib
的 send_message()
因
而失败
UnicodeEncodeError: 'ascii' codec can't encode character '\xe0' in position 15: ordinal not in range(128)
并且显然需要 ascii,而不是 Unicode。造成差异的原因是什么以及如何正确解决?
(代码基于这些examples)
可以通过编码 msgsource
然后解析结果字节来避免错误:
msgsource = msgsource.encode('utf-8')
msg = email.message_from_bytes(msgsource, policy=policy.default)
print(msg)
产出
From: sender@example.com
To: recipient@example.com
Subject: Ayons asperges pour le =?unknown-8bit?q?d=C3=A9jeuner?=
Cela ressemble �� un excellent recipie d��jeuner.
将其发送到 Python 的 SMTP DebuggingServer 生成
b'From: sender@example.com'
b'To: recipient@example.com'
b'Subject: Ayons asperges pour le d\xc3\xa9jeuner'
b'X-Peer: ::1'
b''
b'Cela ressemble \xc3\xa0 un excellent recipie d\xc3\xa9jeuner.'
请注意,未写入任何编码 headers:我猜测解析器试图尽可能忠实地从源字符串或字节重现消息,尽可能少地进行额外假设。解析器 docs
[Parser is] an API that can be used to parse a message when the complete contents of the message are available in a [string/bytes/file]
在我看来支持这种解释。
如果我这样创建消息(当然使用真实地址):
msg = email.message.EmailMessage()
msg['From'] = "sender@example.com"
msg['To'] = "recipient@example.com"
msg['Subject'] = "Ayons asperges pour le déjeuner"
msg.set_content("Cela ressemble à un excellent recipie déjeuner.")
我可以使用smtplib
成功发送。 body 中的 Unicode 字符没有问题。收到的消息有这些 headers:
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
如果我尝试以这种替代方式创建相同的消息:
msgsource = """\
From: sender@example.com
To: recipient@example.com
Subject: Ayons asperges pour le déjeuner
Cela ressemble à un excellent recipie déjeuner.
"""
msg = email.parser.Parser(policy=email.policy.default).parsestr(msgsource)
无法发送。来自 smtplib
的 send_message()
因
UnicodeEncodeError: 'ascii' codec can't encode character '\xe0' in position 15: ordinal not in range(128)
并且显然需要 ascii,而不是 Unicode。造成差异的原因是什么以及如何正确解决?
(代码基于这些examples)
可以通过编码 msgsource
然后解析结果字节来避免错误:
msgsource = msgsource.encode('utf-8')
msg = email.message_from_bytes(msgsource, policy=policy.default)
print(msg)
产出
From: sender@example.com
To: recipient@example.com
Subject: Ayons asperges pour le =?unknown-8bit?q?d=C3=A9jeuner?=
Cela ressemble �� un excellent recipie d��jeuner.
将其发送到 Python 的 SMTP DebuggingServer 生成
b'From: sender@example.com'
b'To: recipient@example.com'
b'Subject: Ayons asperges pour le d\xc3\xa9jeuner'
b'X-Peer: ::1'
b''
b'Cela ressemble \xc3\xa0 un excellent recipie d\xc3\xa9jeuner.'
请注意,未写入任何编码 headers:我猜测解析器试图尽可能忠实地从源字符串或字节重现消息,尽可能少地进行额外假设。解析器 docs
[Parser is] an API that can be used to parse a message when the complete contents of the message are available in a [string/bytes/file]
在我看来支持这种解释。