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

Python smtplib循环逐人发邮件时To字段累加问题排查求助

问题根因

这不是服务器特性导致的,是代码逻辑问题:
你的msg对象是在循环外部初始化的MIME消息对象,Python标准库email模块的设计中,对已存在的邮件头字段执行msg[字段名] = 值操作时,不会覆盖原有同名字段,而是新增一个同名字段。因此每次循环给To头赋值都会多新增一个收件人地址,最终所有遍历过的收件人都会出现在每封邮件的收件人列表中。

修复方案

有两种常用修复方式:

方案1(更推荐):每次循环重新初始化msg对象

可以彻底避免所有旧字段残留问题,也适合每封邮件正文、主题有个性化差异的场景:

for email_to in EMAIL_TO:
    # 每次循环重新创建msg对象,替换为你原本使用的MIME类型即可(如MIMEText、MIMEMultipart)
    msg = MIMEText('邮件正文内容', 'plain', 'utf-8')
    msg['From'] = EMAIL_ADDRESS
    msg['Subject'] = '邮件主题'
    with smtplib.SMTP('wsmtp.ecounterp.com', 587) as smtp:
        try:
            smtp.starttls()
            smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)            
            msg['To'] = email_to
            smtp.sendmail(EMAIL_ADDRESS, email_to, msg.as_string())
        except Exception as e:
            print(e)

方案2:赋值To头前先删除旧的To字段

如果msg的公共字段(主题、正文、附件等)固定,不想每次重复初始化,可以在每次设置To前先删除已有的To头:

for email_to in EMAIL_TO:
    with smtplib.SMTP('wsmtp.ecounterp.com', 587) as smtp:
        try:
            smtp.starttls()
            smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD)            
            # 先删除已存在的To头,避免累加
            if 'To' in msg:
                del msg['To']
            msg['To'] = email_to
            smtp.sendmail(EMAIL_ADDRESS, email_to, msg.as_string())
        except Exception as e:
            print(e)

内容的提问来源于stack exchange,提问作者hansf14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 00:24:03