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
相关产品推荐
相关产品推荐

