Python调用Gmail SMTP发亚马逊价格提醒邮件出现ASCII编码错误
问题定位
报错的核心原因是SMTP协议默认使用ASCII编码传输内容,而你爬取的亚马逊商品字段(标题、属性等)包含大量非ASCII字符(特殊符号、多语言字符、emoji等),编码不匹配触发错误。
修复方案
推荐使用Python标准email库构造标准邮件,明确指定UTF-8编码,兼容性更好,修改后的代码如下:
import smtplib from email.mime.text import MIMEText from email.header import Header def create_message(): message = "" for title in j: cr_price = j[title] cr_rating = title_rating[title] cr_reviews = title_num_reviews[title] cr_avail = title_avail[title] str1 = f"Product Title = {title}\n" str2 = f"{str1}Product Price = {cr_price}\n" str3 = f"{str2}Product Rating = {cr_rating}\n" str4 = f"{str3}Number of Product Reviews = {cr_reviews}\n" str5 = f"{str4}Availability = {cr_avail}\n\n" message += str5 print("message generated") return message def send_email(message_content, sender_email, sender_password, receiver_email): # 构造MIME格式邮件,指定编码为UTF-8 message = MIMEText(message_content, 'plain', 'utf-8') message['From'] = Header("Amazon Price Monitor", 'utf-8') message['To'] = Header("Receiver", 'utf-8') message['Subject'] = Header("Monitored Product Price Changed", 'utf-8') s = smtplib.SMTP('smtp.gmail.com', 587) s.starttls() s.login(sender_email, sender_password) s.sendmail(sender_email, receiver_email, message.as_string()) s.quit()
- 临时快速修复也可以直接在调用
sendmail前对内容编码:message = message.encode('utf-8'),但该方案容易出现收件端乱码问题,不推荐长期使用。 - 额外注意:当前Gmail已不支持直接用账号密码调用SMTP服务,你需要先开启谷歌账号的两步验证,生成应用专用密码替换代码中的
sender_password才可正常发信。
内容的提问来源于stack exchange,提问作者JackLalane1
相关产品推荐
相关产品推荐

