Python发送多附件邮件时报set_content not valid on multipart错误如何解决
问题原因
- 调用
EmailMessage.add_attachment()方法后,邮件消息会自动转为multipart多部分类型,该类型消息不允许再调用set_content()方法修改正文内容 - 代码逻辑漏洞:当检测到
multiAbort_file存在时,你先添加了第二个附件,之后又调用msg.set_content()修改正文,此时消息已经是多部分类型,直接触发报错
修复方案
提前判断multiAbort_file是否存在,先确定最终的正文内容,调用set_content()设置正文后再统一添加所有附件即可,调整后的代码示例如下:
import os import smtplib from datetime import datetime from email.message import EmailMessage # 自行配置发件信息常量 SENDER_EMAIL = "你的发件邮箱地址" APP_PASSWORD = "你的邮箱应用密码" date_string = f'{datetime.now():%Y-%m-%dT%H_%M_%S%z}' def send_mail_with_excel(recipient_email, subject, content, date_time): input_file = "C:\\scripts\\mail_send\\remediated_data_" + date_time + ".csv" multiAbort_file = "C:\\scripts\\mail_send\\multi_aborts_data_"+ date_time + ".csv" msg = EmailMessage() msg['Subject'] = subject msg['From'] = SENDER_EMAIL msg['To'] = recipient_email # 先确定最终正文再设置 final_content = content if os.path.isfile(multiAbort_file): final_content += "\n Note : there is another list of items that are aborted multiple times in multi_aborts file, please restart these to continue" msg.set_content(final_content) # 再统一添加所有附件 with open(input_file, 'rb') as f: file_data = f.read() msg.add_attachment(file_data, maintype="application", subtype="csv", filename=input_file) if os.path.isfile(multiAbort_file): with open(multiAbort_file, 'rb') as f: file_data = f.read() msg.add_attachment(file_data, maintype="application", subtype="csv", filename=multiAbort_file) with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp: smtp.starttls() smtp.login(SENDER_EMAIL, APP_PASSWORD) smtp.send_message(msg) send_mail_with_excel(["abc@xyz.com"], "Remediated List of items" + date_string, "Remediated List of items " + date_string, date_string)
内容的提问来源于stack exchange,提问作者Viv
相关产品推荐
相关产品推荐

