Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何向国际地址发送电子邮件_Python_Python 2.7_Email_Unicode - Fatal编程技术网

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

Python 如何向国际地址发送电子邮件,python,python-2.7,email,unicode,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'] =

如何在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
将电子邮件作为目标地址(发送至电子邮件):

输出

“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服务器发送这些电子邮件

我怎样才能修好它

提前感谢。

声明服务器端:

必须使用SMTP中继

  • 或者明确承认格式,并同意通过 ESMTP选项,或
  • 拒绝邮件,或在必要时返回未送达邮件 通知消息,以便发件人可以进行另一次 计划
及 表示为精度(摘录):

  • 与此扩展关联的EHLO关键字值为 “SMTPUTF8”
  • MAIL命令中添加了一个可选参数SMTPUTF8
  • 如果要发送的信封或消息需要 SMTPUTF8扩展,SMTPUTF8感知SMTP客户端必须提供 SMTPUTF8参数与MAIL命令一起使用
由于使用GMail SMTP服务器进行交换的跟踪证明它宣布自己是一个兼容SMTPUTF8的服务器,因此您只需要求
smtplib
在mail命令中提供
SMTPUTF8
选项。您只需将
sendmail
命令更改为:

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

由于您已经在正文中处理了最终的非ASCII字符,并使用MIMEMultipart和MIMEText设置了适当的标题,所以一切都应该正常。

试试这个:msg['To']=str(Header(To_email,'utf-8'))告诉我这是否有效。@Prav001不幸的是,它不起作用。请注意,
sendmail
函数调用上的应用程序崩溃可能是因为您应该尝试除
utf-8
之外的其他编码方案?@Iron First utf-16也不起作用--
{'\xff\xfe\xf1\x00o\x00\xf1\x00\x00\x03\x001\x002\x003\x004\x00@\x00s\x00e\x00r\x00v\x00e\x00r\x00.\x00c\x00o\x00':(555,'5.5.2语法错误.qp7sm484744lbc.24-gsmtp'))
国际化地址是一个特殊的用例,根据RFC 6530,服务器应该宣布SMTPUTF8功能,客户端在其
MAIL
命令中传递SMTPUTF8选项。如果服务器宣布SMTPUTF8选项,并且程序员要求,Python smtplib可以传递SMTPUTF8选项。您应该添加
服务器。设置调试级别(7)
server=smtplib.SMTP(SMTP\u服务器)之后立即报告会话记录。
server.sendmail(from_email, to_email.encode('utf-8'), msg.as_string(), ['SMTPUTF8'])