繁体   English   中英

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

[英]How to send an e-mail to the international address

如何在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'编解码器无法在位置9编码字符u'\\ xf1':序数不在范围内(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服务器发送这些电子邮件。

我该如何解决?

提前致谢。

RFC 6533-国际化电子邮件概述和框架指出服务器端:

SMTP中继必须

  • 明确识别格式,同意通过ESMTP选项进行识别,或者
  • 拒绝该消息,或者在必要时返回未送达通知消息,以便发件人可以制定另一个计划。

RFC 6531-国际化电子邮件的SMTP扩展表示精度(摘录):

  • 与该扩展名关联的EHLO关键字值为“ SMTPUTF8”
  • 一个可选参数SMTPUTF8被添加到MAIL命令。
  • 如果发送的信封或邮件需要SMTPUTF8扩展功能,则支持SMTPUTF8的SMTP客户端务必通过MAIL命令提供SMTPUTF8参数。

由于与GMail SMTP服务器进行的交换跟踪证明它宣布自己为SMTPUTF8兼容服务器,因此您只需要让smtplib在mail命令中提供SMTPUTF8选项即可。 您只需要将sendmail命令更改为:

server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string(), ['SMTPUTF8'])

因为您已经在主体中处理了最终的非ASCII字符,并使用MIMEMultipart和MIMEText设置了适当的标头,所以都应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM