我正在使用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()
答案 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()