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

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,提问作者Алексей Иванов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 01:24:02