使用smtplib发送含特殊字符邮件时遇UnicodeEncodeError问题求助
解决smtplib发送含特殊字符邮件时的UnicodeEncodeError问题
问题背景
使用smtplib发送包含Unicode特殊字符(如弯引号\u2018/\u2019)的邮件时,触发UnicodeEncodeError,错误提示ASCII编码无法处理超出范围的字符;若直接对内容执行.encode('utf-8'),邮件内容会以字节串格式(如b"Headline: The \xe2\x80\x98New\xe2\x80\x99...")显示,无法正常阅读。
错误根源
smtplib的sendmail方法默认会将传入的字符串消息用ASCII编码,遇到非ASCII字符时直接报错;若传入字节串,邮件客户端不会自动解码为可读文本,因此显示原始字节格式。
解决方案
使用Python标准库email模块构建MIME格式的邮件消息,明确指定UTF-8编码,既能兼容Unicode字符,又能让邮件客户端正确解析内容。
修改后的完整代码
import smtplib from email.mime.text import MIMEText from email.header import Header # 假设my_email和my_passwd已定义 # my_email = "your_email@gmail.com" # my_passwd = "your_app_password" data = response.json()["articles"] messsage = data[:3] headline = [f"Headline: {i['title']}" for i in messsage] brief = [i['description'].split('.')[:2] for i in messsage] ha = [] for i in range(3): joined = ".".join(brief[i]) ha.append(joined) for i in range(3): # 构建邮件内容 email_content = f"{headline[i]}\n{ha[i]}" msg = MIMEText(email_content, 'plain', 'utf-8') # 设置邮件头 msg['From'] = Header(my_email, 'utf-8') msg['To'] = Header(my_email, 'utf-8') msg['Subject'] = Header('Stock Update', 'utf-8') with smtplib.SMTP("smtp.gmail.com", 587) as connection: connection.starttls() connection.login(user=my_email, password=my_passwd) # 使用send_message发送MIME对象,无需手动编码 connection.send_message(msg)
关键说明
- MIMEText对象:通过指定
_charset='utf-8',自动将Unicode内容编码为UTF-8格式,避免ASCII编码错误。 - Header类:用于处理邮件头(如发件人、收件人、主题)的编码,确保特殊字符在邮件头中也能正常显示。
- send_message方法:替代
sendmail,直接发送MIME消息对象,无需手动拼接邮件头字符串,更简洁可靠。
内容的提问来源于stack exchange,提问作者Kustaff Alexandrite
相关产品推荐
相关产品推荐

