许多公司定期需要将不同部门或客户的报告发送给指定人员。手动操作容易出错、耗时且繁琐。今天这篇文章教你如何利用 Python 实现:
-
🧩 从 Excel 中读取"收件人 + 抄送人 + 附件文件路径";
-
📤 使用
win32com.client
调用 Outlook 自动生成并发送邮件; -
✅ 附加模板正文,并保持批量发送规范无需手工操作。
📥 从 Excel 中读取部门、收件人与附件路径
python
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; -
构建键为 "部门名",值为
[收件人, 抄送人]
的字典,方便后续遍历映射。
✉️ 使用 Outlook 发送邮件函数封装
python
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()
方法发送,无需手动操作。
🔄 批量发邮件逻辑整合
python
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),都可以继续告诉我,我可以为你定制更全面的自动化脚本!