Python通过字典配置批量调用Outlook发邮件仅发单个收件人报错如何解决
问题根因
- 邮件实例仅全局初始化一次:
mail = outlook.CreateItem(constants.olMailItem)定义在全局范围,程序运行全程仅生成一个邮件对象。首次调用send_mail执行mail.Send()后,该对象就处于已提交的不可修改状态,第二次循环调用时无法再修改收件人、附件、正文等属性,也无法重复触发发送动作,因此直接报错。 - 无状态重置逻辑:即便未触发报错,多次调用
send_mail会不断往同一个邮件对象累加收件人、附件,最终发送的内容会和分组发送的预期不符。
修复方案
把邮件实例的创建逻辑移动到send_mail函数内部,每次发信都生成全新的独立邮件对象,避免状态复用冲突,同时优化了收件人解析的执行逻辑,修正后的代码如下:
from win32com.client.gencache import EnsureDispatch from win32com.client import constants # outlook应用实例可全局复用 outlook = EnsureDispatch("Outlook.Application") PATH = 'C:/Users/aoivanov/OneDrive - ArcelorMittal/Documents/MARKETING/Consolidated_stock/' def send_mail(mail_list, list_file, message): # 每次发信创建全新的邮件实例 mail = outlook.CreateItem(constants.olMailItem) mail.Subject = 'Consolidated stock' mail.Body = message attachment_list = [] for i in mail_list: samplegrp1 = mail.Recipients.Add(i) samplegrp1.Type = constants.olTo # 全部收件人添加完成后统一解析,无需循环重复执行 mail.Recipients.ResolveAll() for file in list_file: attachment = PATH + file attachment_list.append(attachment) for attachment in attachment_list: mail.Attachments.Add(attachment) mail.Send() list_file_mht = ['MHT.xlsx', 'FREE_STOCK.xlsx'] mail_list_mht = ['aaa@arcelormittal.com', 'bbb@arcelormittal.com', 'ccc@gmail.com'] message_mht = 'text1' list_file_vikant = ['VIKANT.xlsx'] mail_list_vikant = ['xxx@arcelormittal.com'] message_vikant = 'text2' list_dic = [{'list_file': list_file_mht, 'mail_list': mail_list_mht, 'message': message_mht}, {'list_file': list_file_vikant, 'mail_list': mail_list_vikant, 'message': message_vikant}] for config in list_dic: send_mail(config.get('mail_list'), config.get('list_file'), config.get('message'))
内容的提问来源于stack exchange,提问作者Алексей Иванов
相关产品推荐
相关产品推荐

