如何发送电子邮件到国际地址

时间:2015-12-02 10:38:30

标签: python python-2.7 email unicode

如何通过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服务器发送这些电子邮件。

我该如何解决?

提前致谢。

1 个答案:

答案 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设置了适当的标题,因此所有标题都应该是正确的。