如何在Python中发送带有某些非ASCII字符的电子邮件?

时间:2019-06-25 17:31:57

标签: python email ascii

我正在使用Python 3.7,并尝试使用smtplib发送电子邮件。只要消息中不包含任何土耳其语字符(如“ş,ı,İ,ç,ö”),我的脚本就可以正常工作。到目前为止,我发现唯一可行的解​​决方案是使用"string=string.encode('ascii', 'ignore').decode('ascii')"行,但是当我这样做时,字符串“ İşlem tamamlanmıştır."变成"lem tamamlanmtr."。 那么如何保留原始字符串并绕过此错误?

代码的相关部分:

import smtplib
server = smtplib.SMTP_SSL(r'smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
message = 'Subject: {}\n\n{}'.format(subject, text)
server.sendmail(from, to, message)
server.close()

2 个答案:

答案 0 :(得分:2)

SMTP要求正确封装和标记所有非ASCII内容。如果您知道自己在做什么,那么手工并不难,但是简单且可扩展的解决方案是使用Python email库来构建有效的消息以传递给sendmail。 / p>

这是从Python email example开始几乎逐字改编的。它使用EmailMessage类,该类在3.5版中成为正式版本,但应该最早在Python 3.3上运行。

from email.message import EmailMessage

# Create a text/plain message
msg = EmailMessage()
msg.set_content(text)

msg['Subject'] = subject
msg['From'] = from
msg['To'] = to

答案 1 :(得分:0)

import smtplib
from email.mime.text import MIMEText

text_type = 'plain' # or 'html'
text = 'Your message body'
msg = MIMEText(text, text_type, 'utf-8')
msg['Subject'] = 'Test Subject'
msg['From'] = gmail_user
msg['To'] = 'user1@x.com,user2@y.com'
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login(gmail_user, gmail_password)
server.send_message(msg)
# or server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()