解析器创建的邮件消息有问题

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)

无法发送。来自 smtplibsend_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]

在我看来支持这种解释。