使用Python 3 smtplib发送邮件时遭遇UnicodeEncodeError错误求助
嘿,这个问题我太熟了!你遇到的UnicodeEncodeError是因为邮件内容里有ASCII编码范围之外的字符(比如中文、特殊符号这类),而smtplib默认会尝试用ASCII来编码整个邮件内容,这不就直接卡壳了嘛。
给你几个靠谱的解决办法:
1. 用MIME格式包装邮件内容(最推荐)
你需要把邮件内容转换成MIME类型的对象,明确指定UTF-8编码,这样就能完美支持非ASCII字符了。直接上代码示例:
import smtplib from email.mime.text import MIMEText from email.header import Header # 你的邮件内容,随便写中文或者其他特殊字符都没问题 email_content = "这是一封带中文的测试邮件,试试特殊符号:😎" # 创建MIMEText对象,第一个参数是内容,第二个是格式(plain纯文本/html网页),第三个是编码 msg = MIMEText(email_content, 'plain', 'utf-8') # 邮件标题也要用Header处理编码,避免标题里的非ASCII字符出问题 msg['Subject'] = Header('我的测试邮件', 'utf-8') msg['From'] = "你的邮箱@example.com" msg['To'] = "收件人邮箱@example.com" # 发送邮件的常规操作 with smtplib.SMTP('你的SMTP服务器地址', 587) as server: server.starttls() # 开启加密传输 server.login('你的邮箱@example.com', '你的邮箱授权码') server.send_message(msg)
2. 如果要发HTML格式的邮件
只需要把MIMEText的第二个参数改成'html'就行,比如:
html_content = "<h1>这是HTML邮件标题</h1><p>里面可以写<b>加粗</b>的中文内容哦</p>" msg = MIMEText(html_content, 'html', 'utf-8')
3. 为啥之前的代码会报错?
你之前应该是直接把纯字符串传给sendmail方法了,比如这种错误写法:
# 千万别这么写! server.sendmail('发件人邮箱', '收件人邮箱', "带中文的邮件内容")
这种情况下smtplib会默认用ASCII编码整个内容,一旦碰到非ASCII字符就直接抛出你看到的那个错误,所以一定要用MIME对象来替代纯字符串。
内容的提问来源于stack exchange,提问作者RobertKG
相关产品推荐
相关产品推荐

