如何通过Python中的smtplib
向国际地址发送电子邮件?
如果我使用以下代码
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ñó1234@server.com
电子邮件作为目标地址(to_email)调用此代码时,脚本在以下行失败:
server.sendmail(from_email, to_email, msg.as_string())
输出
' ASCII'编解码器不能对字符u' \ xf1'进行编码。位置9:序数不在范围内(128)
但是,如果我将sendmail
函数调用更改为以下
server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string())
失败并出现以下错误:
{' \ xc3 \ xb1o \ xc3 \ xb1 \ xc3 \ xb31234@server.com' :( 555,' 5.5.2语法 错误。 i7sm368361lbo.39 - gsmtp')}
我使用GMail的SMTP服务器发送这些电子邮件。
我该如何解决?
提前致谢。
答案 0 :(得分:3)
RFC 6533 - Overview and Framework for Internationalized Email 表示服务器端:
SMTP中继必须
- 明确识别格式,同意通过 ESMTP选项,或
- 拒绝邮件,或者,如有必要,退回未送达邮件 通知消息,以便发件人可以制作另一个 计划。
和 RFC 6531 - SMTP Extension for Internationalized Email 表示精确度(摘录):
- 与此扩展名相关联的EHLO关键字值为 “SMTPUTF8”
- 一个可选参数SMTPUTF8被添加到MAIL命令。
- 如果发送的信封或消息需要具备以下功能 SMTPUTF8扩展,支持SMTPUTF8的SMTP客户端必须提供 带有MAIL命令的SMTPUTF8参数。
由于与GMail SMTP服务器的交换跟踪证明它宣称自己是兼容SMTPUTF8的服务器,因此您只需要smtplib
在邮件命令中提供SMTPUTF8
选项。您只需将sendmail
命令更改为:
server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string(), ['SMTPUTF8'])
由于您已经处理了正文中的最终非ASCII字符并使用MIMEMultipart和MIMEText设置了适当的标题,因此所有标题都应该是正确的。