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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:06:01