Python SMTP lib需要SMTPUTF8用于来自地址显示名称的非ASCI字符

时间:2017-02-22 08:13:58

标签: python python-3.5 smtplib

我使用python的smtplip发送emials。除非我在地址消息中使用非ASCI字符,否则一切正常工作。

我正在使用python 3.5。

即使使用非ASCI To和Subject:

,这也能正常工作
import smtplib

from email.message import EmailMessage
from email.headerregistry import Addressmsg = EmailMessage()

msg['Subject'] = "Subject with non-asci chars like á"
msg['From'] = Address("Foo Bar", "foo.bar", "example.cz")
msg['To'] = (Address("Fóó Bár", "foo.bar", "example.cz"),
当我尝试使用非ASCI时,请发芽:

msg['Subject'] = "Subject with non-asci chars like á"
msg['From'] = Address("Fóó Bár", "foo.bar", "example.cz")
msg['To'] = (Address("Fóó Bár", "foo.bar", "example.cz"),

以上两者均发送:

with smtplib.SMTP('localhost') as s:
        s.send_message(msg)

我得到了这个例外:

smtplib.SMTPNotSupportedError: One or more source or delivery addresses require internationalized email support, but the server does not advertise the required SMTPUTF8 capability`

我知道由我们的smtp服务器引起的不支持SMTPUTF8,但仅从非ASCI显示名称引起的不应该是necesery。

3 个答案:

答案 0 :(得分:2)

如果你想使用send_message,你仍然可以通过将from地址传递给send_message函数来绕过讨厌的utf8检查。

with smtplib.SMTP('localhost') as s:
    s.send_message(msg,'foo.bar@example.cz')

答案 1 :(得分:0)

我假设您尝试使用smtplib.send_message。看起来它太聪明了,想要控制服务器是否能正确处理utf8,即使在用例中也没有必要。

你只需要恢复到好的smtplib.sendmail

serv = smtplib.SMTP(mailhost)
serv.sendmail(msg['From'], msg['To'], msg.as_string())

答案 2 :(得分:0)

我首先发送了一个' ehlo()'来欺骗send_message库,然后手动修改了这些功能:

s = smtplib.SMTP(server)
s.ehlo()
s.esmtp_features["smtputf8"] = ""
s.send_message(msg)

我还更改了邮件政策,因为我遇到了其他问题:

msg = MIMEMultipart(policy=SMTPUTF8)

希望这有帮助! (仅当您的服务器与UTF8兼容但未通过ehlo回答时才会起作用)