Python使用MIMEMultipart发邮件不断累加内容/附件如何解决?
问题原因
你当前使用的MIMEMultipart实例msg是在循环逻辑之外初始化的,msg.attach()方法的作用是往实例的内容队列里追加内容,并不会自动清空上一轮循环添加的文本、附件等资源,所以每发一封邮件内容都会叠加之前的所有内容。
最优解决方案
最稳妥、不易出错的处理方式是:把MIMEMultipart实例的初始化逻辑放到循环内部,每给一个收件人发邮件就新建一个独立的msg对象,自动规避内容叠加问题,哪怕后续要加附件逻辑也能正常运行。
修正后的代码示例:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib # 邮箱服务初始化逻辑保留在循环外即可 server = smtplib.SMTP('你的SMTP服务器地址', 587) server.starttls() server.login(your_email, your_email_password) for i in range(len(emails)): # 每轮循环新建msg对象,自动清空上一轮的所有内容和配置 msg = MIMEMultipart() name = names[i] + "," email = emails[i] + "@nmamit.in" TEXT = "my message" + name msg['Subject'] = subjet_txt msg['From'] = your_email msg['To'] = email msg.attach(MIMEText(TEXT, 'plain')) # 如有附件,也在当前循环内添加即可 text = msg.as_string() server.sendmail(your_email, email, text) server.quit()
可选:重置现有MIMEMultipart对象的方案
如果你不想每次新建实例,也可以在每次发送完邮件后手动清空现有对象的内容和头部配置,但是这种方式容易遗漏配置导致异常,不推荐使用:
# 每次发送完邮件后执行 msg.set_payload([]) # 清空所有已添加的文本、附件内容 for key in list(msg.keys()): # 清空所有已设置的头部信息(收件人、发件人、主题等) del msg[key]
内容的提问来源于stack exchange,提问作者Pramath Naik
相关产品推荐
相关产品推荐

