许多公司定期需要将不同部门或客户的报告发送给指定人员。手动操作容易出错、耗时且繁琐。今天这篇文章教你如何利用 Python 实现:
从 Excel 中读取“收件人 + 抄送人 + 附件文件路径”;
使用 win32com.client
调用 Outlook 自动生成并发送邮件;
✅ 附加模板正文,并保持批量发送规范无需手工操作。
from openpyxl import load_workbook
wb = load_workbook("邮件地址.xlsx")
ws = wb.active
address = {}
for i in range(2, ws.max_row + 1):
dept = ws[f"A{i}"].value
to_add = ws[f"B{i}"].value
cc_add = ws[f"C{i}"].value
address[dept] = [to_add, cc_add]
使用 openpyxl
读取 Excel;
构建键为 “部门名”,值为 [收件人, 抄送人]
的字典,方便后续遍历映射。
import win32com.client as win32
def Send_mail(to_add, cc_add, file_path, dept):
outlook = win32.Dispatch('Outlook.Application')
mail = outlook.CreateItem(0)
mail.To = to_add
mail.CC = cc_add
mail.Subject = f"{dept}年假情况"
mail.Attachments.Add(file_path)
mail.Body = (
f"Dear All,\n这是{dept}的年假情况,请查收!谢谢。\n\n"
"Best regards!\n人事部 小李"
)
mail.Send()
借助 CreateItem(0)
新建邮件项目;
设置收件人、抄送人、主题、正文与附件 (Medium, StackOverflow);
使用 .Send()
方法发送,无需手动操作。
import os
for dept, (to_add, cc_add) in address.items():
file_path = os.path.join(
os.getcwd(),
"年假_按部门",
f"年假情况_{dept}.xlsx"
)
Send_mail(to_add, cc_add, file_path, dept)
print("邮件发送完成。")
遍历 Excel 中所有部门;
自动拼接附件路径,并调用 Send_mail()
;
最后打印“邮件发送完成”。
Windows 必须安装 Outlook,且已登录账户,才能通过 win32com
正常发送 (StackOverflow);
可设置 mail.SentOnBehalfOfName
指定发件人 (StackOverflow);
若需要发送多个附件,可多次调用 mail.Attachments.Add(...)
;
为防止安全警告,可使用 mail.Display(True)
手动确认后再发送;
可加入异常处理逻辑,避免单个失败阻断整个批量流程。
功能 | 实现建议 |
---|---|
动态正文模板 | 从 Word/HTML 模板读取正文,可支持参数化 |
✉️ 邮件保留草稿库 | 使用 .Save() 保存为草稿供审核 |
定时发送功能 | 搭配 task scheduler 实现定时运行 |
执行日志写入 | 记录邮件发送状态与时间备查 |
测试环境支持 | 可追加测试邮箱列表及时验证功能 |
通过本篇脚本,你学会了:
️ Excel 提取邮件地址与部门映射;
Outlook 自动化发送邮件,附带附件;
批量快速地处理多个邮件任务,提高办公效率。
更多实用案例,代码,素材如下:
自取链接:https://pan.quark.cn/s/a46f30accea2
如果你希望增加 HTML 正文、附件格式转换、发送失败重试机制、或多平台支持(如对接 Gmail/Exchange API),都可以继续告诉我,我可以为你定制更全面的自动化脚本!