許多公司定期需要將不同部門或客戶的報告發送給指定人員。手動操作容易出錯、耗時且繁瑣。今天這篇文章教你如何利用 Python 實現:
-
🧩 從 Excel 中讀取“收件人 + 抄送人 + 附件文件路徑”;
-
📤 使用
win32com.client
調用 Outlook 自動生成并發送郵件; -
? 附加模板正文,并保持批量發送規范無需手工操作。
📥 從 Excel 中讀取部門、收件人與附件路徑
from openpyxl import load_workbookwb = load_workbook("郵件地址.xlsx")
ws = wb.active
address = {}
for i in range(2, ws.max_row + 1):dept = ws[f"A{i}"].valueto_add = ws[f"B{i}"].valuecc_add = ws[f"C{i}"].valueaddress[dept] = [to_add, cc_add]
-
使用
openpyxl
讀取 Excel; -
構建鍵為 “部門名”,值為
[收件人, 抄送人]
的字典,方便后續遍歷映射。
?? 使用 Outlook 發送郵件函數封裝
import win32com.client as win32def Send_mail(to_add, cc_add, file_path, dept):outlook = win32.Dispatch('Outlook.Application')mail = outlook.CreateItem(0)mail.To = to_addmail.CC = cc_addmail.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 osfor 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),都可以繼續告訴我,我可以為你定制更全面的自動化腳本!
?
?