零基礎(chǔ)教你如何使用Python批量發(fā)送郵件
在日常工作和學(xué)習(xí)中,我們經(jīng)常會(huì)遇到需要向多人發(fā)送通知、邀請(qǐng)函或工資條的情況。如果手動(dòng)一封封發(fā)送,不僅耗時(shí)耗力,還容易出錯(cuò)。幸運(yùn)的是,通過(guò)Python,我們可以輕松實(shí)現(xiàn)郵件的批量、自動(dòng)化發(fā)送,甚至可以為每個(gè)人定制專(zhuān)屬的稱(chēng)呼。
本文將作為一份面向完全零基礎(chǔ)新手的系統(tǒng)性指南,帶你一步步掌握使用Python批量發(fā)送郵件的技能。
1. 引言 (Introduction)
為什么選擇用Python發(fā)郵件?
- 極速高效:幾秒鐘內(nèi)即可將上百封郵件準(zhǔn)確發(fā)送完畢。
- 高度個(gè)性化:可以結(jié)合數(shù)據(jù)(如Excel表格),讓每一封郵件擁有不同的收件人姓名和專(zhuān)屬內(nèi)容。
- 自動(dòng)化:寫(xiě)好代碼后,可以設(shè)置為定時(shí)任務(wù),完全解放雙手。
在Python中,處理郵件主要依賴(lài)兩個(gè)內(nèi)置模塊:smtplib(負(fù)責(zé)連接服務(wù)器并發(fā)送郵件)和 email(負(fù)責(zé)構(gòu)建郵件的標(biāo)題、正文等內(nèi)容)。因?yàn)樗鼈兪莾?nèi)置的,所以你不需要額外安裝任何第三方庫(kù)即可上手。
2. 準(zhǔn)備工作 (Prerequisites)
在開(kāi)始寫(xiě)代碼之前,你需要準(zhǔn)備好以下幾樣?xùn)|西:
安裝好的Python環(huán)境:確保你的電腦上已經(jīng)安裝了Python(建議版本3.6以上)。你可以使用任何代碼編輯器,如VS Code、PyCharm,甚至自帶的IDLE。
一個(gè)用于發(fā)信的郵箱賬號(hào):QQ郵箱、網(wǎng)易163郵箱、新浪郵箱等均可。
開(kāi)啟SMTP服務(wù)并獲取“授權(quán)碼”:
- 注意:為了安全,現(xiàn)在的郵箱程序不允許直接使用你的登錄密碼來(lái)通過(guò)代碼發(fā)郵件。你需要使用授權(quán)碼(App Password)。
- 獲取方法(以QQ郵箱為例):登錄網(wǎng)頁(yè)版QQ郵箱 -> 點(diǎn)擊頂部的【設(shè)置】 -> 【賬戶(hù)】 -> 找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù)】 -> 開(kāi)啟【POP3/SMTP服務(wù)】 -> 點(diǎn)擊【生成授權(quán)碼】。請(qǐng)將這串字母/數(shù)字保存好,代碼中會(huì)用到。
3. 分步指南 (Step-by-Step Guide)
我們將通過(guò)一個(gè)完整的示例,演示如何向一個(gè)名單里的所有人發(fā)送帶有專(zhuān)屬稱(chēng)呼的問(wèn)候郵件。
步驟 1:導(dǎo)入必要的庫(kù)
首先,我們需要在代碼開(kāi)頭引入Python內(nèi)置的郵件處理工具。
import smtplib # 用于發(fā)送郵件的協(xié)議模塊 from email.mime.text import MIMEText # 用于構(gòu)建純文本或HTML郵件正文 from email.header import Header # 用于處理郵件的主題(標(biāo)題)編碼 import time # 用于添加發(fā)送間隔,防止被識(shí)別為垃圾郵件
步驟 2:設(shè)置發(fā)件人信息與服務(wù)器
接下來(lái),配置你的郵箱賬號(hào)、授權(quán)碼以及對(duì)應(yīng)的SMTP服務(wù)器地址。
# 1. 郵箱基礎(chǔ)設(shè)置 smtp_server = "smtp.qq.com" # QQ郵箱的SMTP服務(wù)器地址 (163郵箱為 smtp.163.com) smtp_port = 465 # SSL安全連接的標(biāo)準(zhǔn)端口號(hào)通常是465 sender_email = "your_email@qq.com" # 替換為你的真實(shí)發(fā)件郵箱 auth_code = "abcdefghijklmnop" # 替換為剛才獲取的郵箱授權(quán)碼(非登錄密碼)
步驟 3:準(zhǔn)備收件人列表
為了演示批量發(fā)送,我們使用一個(gè)包含多個(gè)收件人信息的列表(List)。在實(shí)際應(yīng)用中,這些數(shù)據(jù)通常來(lái)自Excel表格。
# 2. 準(zhǔn)備收件人數(shù)據(jù) (包含姓名和郵箱地址)
receivers = [
{"name": "張三", "email": "zhangsan@example.com"},
{"name": "李四", "email": "lisi@example.com"},
# 你可以在這里繼續(xù)添加更多的收件人
]
步驟 4:構(gòu)建郵件內(nèi)容并批量發(fā)送
這是最核心的一步。我們需要登錄服務(wù)器,然后通過(guò)一個(gè)循環(huán)(Loop),為列表中的每個(gè)人生成專(zhuān)屬郵件并發(fā)送。
# 3. 連接服務(wù)器并批量發(fā)送
try:
# 建立安全的SSL連接
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
# 登錄郵箱
server.login(sender_email, auth_code)
print("成功登錄郵箱服務(wù)器!開(kāi)始發(fā)送郵件...\n")
# 遍歷收件人列表,逐個(gè)發(fā)送
for person in receivers:
receiver_name = person["name"]
receiver_email = person["email"]
# 構(gòu)建個(gè)性化郵件正文
mail_content = f"""
親愛(ài)的 {receiver_name}:
你好!這是一封由Python自動(dòng)發(fā)送的測(cè)試郵件。
祝你今天工作順利,學(xué)習(xí)進(jìn)步!
發(fā)件人:Python自動(dòng)化助手
"""
# 將正文轉(zhuǎn)化為郵件對(duì)象 (內(nèi)容, 格式, 編碼)
message = MIMEText(mail_content, 'plain', 'utf-8')
# 設(shè)置郵件的 發(fā)件人、收件人 和 主題
message['From'] = Header("自動(dòng)化助手", 'utf-8') # 發(fā)件人昵稱(chēng)
message['To'] = Header(receiver_name, 'utf-8') # 收件人昵稱(chēng)
message['Subject'] = Header("Python批量發(fā)送郵件測(cè)試", 'utf-8') # 郵件標(biāo)題
# 發(fā)送郵件
server.sendmail(sender_email, receiver_email, message.as_string())
print(f"? 成功發(fā)送郵件給: {receiver_name} ({receiver_email})")
# 暫停2秒,避免發(fā)送過(guò)快被封禁
time.sleep(2)
print("\n?? 所有郵件發(fā)送完畢!")
except smtplib.SMTPException as e:
print(f"? 郵件發(fā)送失敗,錯(cuò)誤信息:{e}")
finally:
# 無(wú)論成功與否,最后都要關(guān)閉服務(wù)器連接
server.quit()
4. 常見(jiàn)問(wèn)題與避坑指南 (Common Pitfalls)
在實(shí)際操作中,新手常常會(huì)遇到以下幾個(gè)“坑”,請(qǐng)務(wù)必注意:
密碼錯(cuò)誤 (Authentication failed):
避坑:絕大多數(shù)情況是因?yàn)槭褂昧肃]箱的登錄密碼而不是授權(quán)碼。請(qǐng)務(wù)必去郵箱設(shè)置中生成授權(quán)碼并填入代碼中。
被識(shí)別為垃圾郵件 (Spam / Banned):
避坑:如果你一次性發(fā)送成百上千封郵件,或者發(fā)送頻率極快,郵箱服務(wù)商會(huì)把你的賬號(hào)當(dāng)成發(fā)送垃圾郵件的機(jī)器人。解決方案是在循環(huán)中使用 time.sleep(2) 暫停幾秒鐘,并盡量避免在郵件中包含敏感或推銷(xiāo)詞匯。
端口和服務(wù)器地址錯(cuò)誤:
避坑:不同郵箱的SMTP服務(wù)器地址和端口不同。例如,網(wǎng)易163郵箱是 smtp.163.com,騰訊企業(yè)郵箱是 smtp.exmail.qq.com。使用前請(qǐng)百度查詢(xún)對(duì)應(yīng)郵箱的SMTP設(shè)置。
發(fā)件人/收件人顯示為 unknown:
避坑:這是因?yàn)闆](méi)有正確設(shè)置 message['From'] 和 message['To'] 字段。必須按照步驟4中的代碼,使用 Header 進(jìn)行規(guī)范的編碼轉(zhuǎn)換。
5. 總結(jié)與進(jìn)階資源 (Conclusion & Resources)
恭喜你!到這里你已經(jīng)掌握了使用Python批量發(fā)送郵件的基礎(chǔ)技能。這不僅能極大地提升你的工作效率,也是邁向“Python自動(dòng)化辦公”的重要一步。
下一步進(jìn)階建議:
- 結(jié)合Excel讀取數(shù)據(jù):你可以學(xué)習(xí)使用
pandas或openpyxl庫(kù)。先讓Python從Excel表格中讀取員工的姓名、郵箱和工資數(shù)據(jù),然后再結(jié)合本文的代碼,實(shí)現(xiàn)批量發(fā)送定制工資條的功能。 - 發(fā)送帶附件和HTML格式的郵件:學(xué)習(xí)
email.mime.multipart和email.mime.application模塊,可以讓你的郵件支持發(fā)送圖片、PDF附件,或者擁有精美排版的網(wǎng)頁(yè)(HTML)正文。 - 使用更高級(jí)的第三方庫(kù):當(dāng)你熟悉了底層原理后,可以嘗試使用第三方庫(kù)
yagmail。它對(duì)smtplib進(jìn)行了深度封裝,能讓你用短短三五行代碼就完成帶附件的郵件發(fā)送,語(yǔ)法更加簡(jiǎn)潔友好。
編程的樂(lè)趣在于解決實(shí)際問(wèn)題。現(xiàn)在,就打開(kāi)你的代碼編輯器,試著給自己或朋友發(fā)送第一封Python自動(dòng)化郵件吧!
到此這篇關(guān)于零基礎(chǔ)教你如何使用Python批量發(fā)送郵件的文章就介紹到這了,更多相關(guān)Python批量發(fā)送郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python郵件自動(dòng)化實(shí)戰(zhàn)之發(fā)送附件和智能處理收件箱
- Python調(diào)用Boto庫(kù)實(shí)現(xiàn)郵件自動(dòng)化發(fā)送的完整指南
- 使用Python實(shí)現(xiàn)自動(dòng)發(fā)送郵件的實(shí)戰(zhàn)指南(以QQ/163為例)
- 從入門(mén)到精通詳解Python自動(dòng)化郵件發(fā)送的完全指南
- Python實(shí)現(xiàn)批量發(fā)送郵件腳本
- Python實(shí)現(xiàn)Excel批量處理+郵件自動(dòng)發(fā)送的全流程
- Python3實(shí)現(xiàn)SMTP發(fā)送郵件的實(shí)戰(zhàn)指南
- 基于Python+smtplib實(shí)現(xiàn)郵件自動(dòng)發(fā)送功能
相關(guān)文章
Python使用textract實(shí)現(xiàn)從各種文件中提取文本信息
textract是一個(gè)強(qiáng)大的Python庫(kù),可以用于從各種文件格式中提取文本,本文將介紹textract的使用場(chǎng)景,以及一些常用的Python代碼案例,希望對(duì)大家有所幫助2024-01-01
Python代碼操作Excel條件格式的實(shí)戰(zhàn)指南
用代碼操作Excel條件格式,本質(zhì)上就是把你手動(dòng)點(diǎn)鼠標(biāo)的步驟寫(xiě)成腳本,數(shù)據(jù)更新了,腳本跑一遍,格式自動(dòng)生成,下面我們就來(lái)看看具體的實(shí)現(xiàn)方法吧2026-03-03
Python運(yùn)行錯(cuò)誤異常代碼含義對(duì)照表
這篇文章主要介紹了Python運(yùn)行錯(cuò)誤異常代碼含義對(duì)照表,需要的朋友可以參考下2021-04-04
python獲取當(dāng)前運(yùn)行函數(shù)名稱(chēng)的方法實(shí)例代碼
這篇文章主要介紹了python獲取當(dāng)前運(yùn)行函數(shù)名稱(chēng)的方法實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04
pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性
這篇文章主要為大家介紹了pytest官方文檔解讀fixtures調(diào)用fixtures及fixture復(fù)用性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python中的int32與int64區(qū)別及說(shuō)明
本文介紹了Python原生int為動(dòng)態(tài)精度類(lèi)型,無(wú)固定位寬;NumPy的int32、int64為定長(zhǎng)整數(shù),分別占用4字節(jié)和8字節(jié),適用于不同內(nèi)存和性能場(chǎng)景,在數(shù)組和科學(xué)計(jì)算中更高效2025-10-10
基于keras中的回調(diào)函數(shù)用法說(shuō)明
這篇文章主要介紹了基于keras中的回調(diào)函數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06

