如何用Python 3给字典中同一键的多个收件人发送Outlook邮件
解决Python通过Outlook给多个收件人发送邮件的问题
问题根源
- 原代码中
dict2的定义存在语法错误:键12对应的多个邮箱没有用列表包裹,导致字典实际仅保留最后一个邮箱地址test2@gmail.com - 即使字典格式正确,直接将列表赋值给
mail.To也无效——Outlook的收件人字段要求传入分号;分隔的字符串
修正后的完整代码
# -*- coding: cp1255 -*- # encoding = utf8 import os, re, win32com.client as win32 secNum = input("请输入编号:") # 修正字典格式:多收件人/多名字用列表存储 dict1 = { '12': ['joe', 'zeelo'], '14': 'steeve' } dict2 = { '12': ['test1@gmail.com', 'test2@gmail.com'], '14': 'test1@gmail.com' } newDate = '27_06' rootdir = r'F:\desktop\Project' def format_data(data_dict, key): """将字典值格式化为字符串:邮箱用分号分隔,名字用逗号分隔""" value = data_dict[key] if isinstance(value, list): return '; '.join(value) if '@' in value[0] else ', '.join(value) return value # 仅初始化一次Outlook实例,提升效率 outlook = win32.Dispatch('outlook.application') for _, dirs, files in os.walk(rootdir): for subdir in dirs: folderPath = os.path.join(rootdir, subdir) # 合并正则匹配逻辑,简化代码 if re.search(f'report {secNum}', folderPath) and re.search(f'2022.June.{newDate}', folderPath): for fname in os.listdir(folderPath): if fname.endswith('.pdf'): filePath = os.path.join(folderPath, fname) print(filePath) mail = outlook.CreateItem(0) mail.Subject = f' report: {secNum}' # 传入格式化后的多收件人字符串 mail.To = format_data(dict2, secNum) mail.Attachments.Add(filePath) # 格式化收件人名称,优化邮件内容 recipient_names = format_data(dict1, secNum) mail.HTMLBody = f'hi {recipient_names}<br> this is report date: <br/>{newDate}' mail.Send()
核心修改说明
- 字典结构修复:将多收件人、多名字数据统一用列表存储,确保所有目标对象信息不丢失
- 格式化函数:
format_data自动处理列表/字符串类型,将列表转为Outlook可识别的分隔格式(邮箱用分号,名字用逗号) - 性能优化:提前初始化Outlook实例,避免循环中重复创建对象
- 逻辑简化:合并两次正则匹配的判断条件,让代码更简洁易读
内容的提问来源于stack exchange,提问作者newGIS
相关产品推荐
相关产品推荐

