Python smtplib发送邮件触发UnicodeDecodeError错误如何解决?
报错解决方法
根因分析
- 冗余连接实例化:你已经通过
with上下文管理器创建了SMTP连接对象,在代码块内部重新赋值connection会覆盖上下文管理器维护的连接实例,退出with块自动销毁旧连接时,读取服务端返回的非utf-8编码字节触发解码错误。 - 邮件构造不规范:直接拼接字符串作为邮件内容传递,没有明确声明编码格式,smtplib默认编解码逻辑遇到非ASCII字符时会抛出异常。
修复步骤
1. 移除冗余代码
首先删除with块内重复的connection = smtplib.SMTP("smtp.gmail.com")行,直接使用上下文管理器生成的连接对象即可。
2. 规范构造邮件(推荐)
使用Python标准库email模块构造符合RFC标准的邮件,自动处理编码问题,完整可运行代码如下:
import smtplib from email.message import EmailMessage # 替换为你的实际参数 my_email = "你的gmail地址" password = "你的gmail应用专用密码" my_rec = "收件人地址" msg = EmailMessage() msg["Subject"] = "New mail" msg["From"] = my_email msg["To"] = my_rec msg.set_content("my nis") with smtplib.SMTP("smtp.gmail.com", 587) as connection: connection.starttls() connection.login(user=my_email, password=password) connection.send_message(msg)
注意:gmail现已不支持直接用账户密码登录SMTP服务,需要先开启账户两步验证,再创建应用专用密码,用专用密码替换上述代码中的
password变量。
临时快速修复
如果不想引入email模块,可手动将邮件内容编码为utf-8格式的字节后再传递:
with smtplib.SMTP("smtp.gmail.com", 587) as connection: connection.starttls() connection.login(user=my_email, password=password) connection.sendmail( from_addr=my_email, to_addrs=my_rec, msg="subject:New mail\n\nmy nis".encode("utf-8") )
内容的提问来源于stack exchange,提问作者Jos Zil
相关产品推荐
相关产品推荐

