如何使用smtplib
Python将电子邮件发送到国际地址?
如果我使用以下代码
try:
server = None
msg = MIMEMultipart('alternative')
msg['From'] = formataddr((from_email_name, from_email))
msg['To'] = Header(to_email, 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
plain_text_part = MIMEText(plain_text_body, 'plain', _charset='utf-8')
msg.attach(plain_text_part)
html_part = MIMEText(html_body, 'html', _charset='utf-8')
msg.attach(html_part)
server = smtplib.SMTP(smtp_server)
server.starttls()
server.login(from_email, from_email_password)
server.sendmail(from_email, to_email, msg.as_string())
finally:
if server is not None:
server.quit()
然后当我使用ñoñó[email protected]
电子邮件作为目标地址(to_email)调用此代码时,脚本在以下行失败:
server.sendmail(from_email, to_email, msg.as_string())
输出
'ascii'编解码器无法在位置9编码字符u'\ xf1':序数不在范围内(128)
但是,如果我将sendmail
函数调用更改为以下内容
server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string())
它失败,并显示以下错误:
{'\ xc3 \ xb1o \ xc3 \ xb1 \ xc3 \ [email protected]':( 555,“ 5.5.2语法错误。i7sm368361lbo.39-gsmtp”)}
我正在使用GMail的SMTP服务器发送这些电子邮件。
我该如何解决?
提前致谢。
RFC 6533-国际化电子邮件概述和框架指出服务器端:
SMTP中继必须
- 明确识别格式,同意通过ESMTP选项进行识别,或者
- 拒绝邮件,或在必要时返回未送达通知邮件,以便发件人可以制定另一个计划。
和RFC 6531 - SMTP扩展国际化的电子邮件说,随着精度(摘录):
- 与该扩展名关联的EHLO关键字值为“ SMTPUTF8”
- 一个可选参数SMTPUTF8被添加到MAIL命令。
- 如果发送的信封或邮件需要SMTPUTF8扩展功能,则支持SMTPUTF8的SMTP客户端务必通过MAIL命令提供SMTPUTF8参数。
与GMail SMTP服务器进行的交换跟踪证明它已宣布自己为SMTPUTF8兼容服务器,因此您只需要在mail命令中smtplib
提供SMTPUTF8
选项即可。您只需要将sendmail
命令更改为:
server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string(), ['SMTPUTF8'])
由于您已经在主体中处理了最终的非ASCII字符,并使用MIMEMultipart和MIMEText设置了适当的标头,所以都应该没问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句