You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:54:01