Python发送邮件特殊字符编码异常问题求助
解决Python发送邮件特殊字符乱码问题
这个乱码问题我太熟了!本质是你手动拼接的邮件内容和头信息没有明确指定UTF-8编码,导致收件端用了错误的编码解析像ã这类特殊字符,才会出现decisão这种乱码。给你两种解决方案,从快速修复到更规范的写法都有:
方案一:手动修复邮件头与编码声明
直接修改你原来的代码,添加编码相关的头信息,同时确保内容以UTF-8编码发送:
if myresult > 0: import smtplib from email.header import Header remetente = 'xxxxxxxx@gmail.com' senha = 'xxxxx' destinatario = ['xxxxx@xxxxxxx.xx'] assunto = Header('Encomendas', 'utf-8').encode() texto = 'Existem Encomendas na plataforma aguardar decisão.' # 修正邮件头,添加编码声明,同时把收件人列表转成字符串格式 msg = '\r\n'.join([ 'From: %s' % remetente, 'To: %s' % ', '.join(destinatario), 'Subject: %s' % assunto, 'Content-Type: text/plain; charset=utf-8', 'Content-Transfer-Encoding: 8bit', '', texto ]) server = smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(remetente, senha) # 发送时将整个邮件内容编码为UTF-8 server.sendmail(remetente, destinatario, msg.encode('utf-8')) server.quit()
关键改动点:
- 用
Header类处理邮件主题,确保主题的编码正确 - 添加
Content-Type头明确指定内容为UTF-8编码 - 将收件人列表转为逗号分隔的字符串,避免To字段显示异常
- 发送时把整个邮件内容编码为UTF-8后再传输
方案二:使用Python内置email库(推荐)
手动拼接邮件很容易遗漏格式细节,Python内置的email库能帮你规范处理邮件结构和编码,后续扩展HTML邮件、附件等也更方便:
if myresult > 0: import smtplib from email.mime.text import MIMEText from email.header import Header remetente = 'xxxxxxxx@gmail.com' senha = 'xxxxx' destinatario = ['xxxxx@xxxxxxx.xx'] assunto = 'Encomendas' texto = 'Existem Encomendas na plataforma aguardar decisão.' # 构造MIMEText对象,直接指定内容格式和编码 msg = MIMEText(texto, 'plain', 'utf-8') # 分别设置发件人、收件人、主题的编码 msg['From'] = Header(remetente, 'utf-8') msg['To'] = Header(', '.join(destinatario), 'utf-8') msg['Subject'] = Header(assunto, 'utf-8') server = smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(remetente, senha) # 转成字符串发送即可,库会自动处理编码细节 server.sendmail(remetente, destinatario, msg.as_string()) server.quit()
这个方案更健壮,MIMEText会自动帮你生成正确的Content-Type和编码声明,不用再手动拼接复杂的邮件头,出错概率低很多。
另外提一句:如果后续遇到Gmail登录失败的情况,检查下是否开启了两步验证,要是开了的话需要用应用专用密码代替原密码登录SMTP服务。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

