python發送郵件的核心在于利用smtplib模塊與smtp服務器通信,并用email模塊構建郵件內容。常見認證問題包括:1.密碼錯誤或未啟用授權碼,需使用郵箱生成的專用密碼;2.smtp地址或端口錯誤,應根據服務商配置正確參數;3.網絡或防火墻限制,需檢查端口訪問權限;4.ssl/tls協議不匹配,應根據端口選擇加密方式。對于html或附件郵件,需使用mimetext設置subtype為html,或通過mimemultipart組合多部分內容。整個流程需注意編碼、加密連接及郵件內容封裝。
python發送電子郵件,核心在于利用其內置的smtplib模塊與郵件服務商的SMTP服務器進行通信。它允許我們像命令行一樣,一步步地與郵件服務器“對話”,發送指令,最終把郵件送出去。同時,email模塊則負責把我們想發的內容——無論是純文本、HTML還是附件——“包裝”成郵件服務器能理解的標準格式。
要用Python發郵件,我們通常會經歷這么幾個步驟,看似繁瑣,實則邏輯清晰:連接服務器、登錄、構建郵件內容,最后發送。
最基本的純文本郵件發送流程是這樣的:
立即學習“Python免費學習筆記(深入)”;
import smtplib from email.mime.text import MIMEText from email.header import Header # 為了處理中文主題等 # 郵件配置 sender = '你的發件郵箱@example.com' # 替換為你的郵箱 password = '你的郵箱授權碼或密碼' # 替換為你的授權碼或密碼 receivers = ['收件人郵箱@example.com'] # 可以是列表,發送給多人 # 郵件服務器配置 (以Gmail為例,其他服務商請查詢其SMTP設置) # 對于Gmail,通常需要開啟兩步驗證并生成應用專用密碼 smtp_server = 'smtp.gmail.com' smtp_port = 587 # 推薦使用587端口,配合TLS加密 # 郵件內容 msg = MIMEText('這是一封由Python發送的測試郵件,內容很簡單。', 'plain', 'utf-8') msg['From'] = Header("你的名字 <{}>".format(sender), 'utf-8') msg['To'] = Header("收件人名稱 <{}>".format(','.join(receivers)), 'utf-8') msg['Subject'] = Header("Python郵件發送測試", 'utf-8') try: # 連接SMTP服務器 server = smtplib.SMTP(smtp_server, smtp_port) server.ehlo() # 向服務器標識身份 server.starttls() # 啟動TLS加密 server.ehlo() # 再次標識身份,以適應TLS連接 # 登錄郵箱 server.login(sender, password) # 發送郵件 server.sendmail(sender, receivers, msg.as_string()) print("郵件發送成功!") except smtplib.SMTPAuthenticationError: print("認證失敗:請檢查用戶名和密碼(或授權碼),以及是否開啟了應用專用密碼。") except smtplib.SMTPConnectError as e: print(f"連接服務器失敗:{e}。請檢查SMTP服務器地址和端口是否正確,網絡連接是否正常。") except Exception as e: print(f"發送郵件時發生錯誤:{e}") finally: if 'server' in locals() and server: server.quit() # 關閉連接
這里我特意用了Header來處理主題和發件人名稱,因為直接用字符串在某些情況下(比如中文)可能會出現亂碼。starttls()是關鍵,它把一個普通的SMTP連接升級為加密連接,這是目前大多數郵件服務商推薦的方式。
使用smtplib發送郵件時常見的認證問題和解決方案有哪些?
認證問題,簡直是初次嘗試Python發郵件的“攔路虎”。我個人就遇到過好幾次,明明代碼邏輯沒問題,但就是提示認證失敗。這背后其實有不少原因。
-
密碼錯誤或授權碼未啟用: 最直接的,就是你輸入的密碼不對。但現在很多大型郵箱服務商,比如Gmail、qq郵箱、網易郵箱,出于安全考慮,當你通過第三方客戶端(比如python腳本)登錄時,不再允許使用你的賬戶登錄密碼,而是需要生成一個“客戶端專用授權碼”或“應用專用密碼”。如果你用的是普通登錄密碼,那基本是認證不通過的。
- 解決方案: 登錄你的郵箱網頁版,在“賬戶安全”或“設置”中尋找“POP3/IMAP/SMTP服務”或“客戶端授權碼”相關的選項,開啟它并生成一個專用密碼。將這個專用密碼填入代碼的password變量。
-
SMTP服務器地址或端口錯誤: 每個郵件服務商的SMTP服務器地址和端口都可能不同。常見的SMTP服務器地址是smtp.xxx.com,端口通常是25(不加密或舊式),465(SSL加密),或587(TLS加密,推薦)。
- 解決方案: 仔細核對你的郵件服務商提供的SMTP服務器地址和端口。例如,Gmail是smtp.gmail.com:587(TLS)或smtp.gmail.com:465(SSL)。如果用465端口,你需要使用smtplib.SMTP_SSL而不是smtplib.SMTP。
-
防火墻或網絡限制: 有時候,公司的網絡防火墻或者你自己的電腦防火墻可能會阻止Python腳本連接到外部的SMTP端口。
- 解決方案: 檢查你的防火墻設置,確保587或465端口沒有被阻止。如果是在公司內網,可能需要聯系IT部門。
-
SSL/TLS協議問題: 郵件服務商可能要求使用加密連接。如果你的代碼沒有正確啟用TLS (starttls()) 或者使用了錯誤的加密方式(比如嘗試用普通SMTP連接465端口),也會導致連接失敗或認證問題。
- 解決方案: 對于587端口,務必在connect之后、login之前調用server.starttls()。對于465端口,直接使用server = smtplib.SMTP_SSL(smtp_server, smtp_port)來建立連接。
這些問題,很多時候都是細節上的疏忽,但它們會直接導致整個郵件發送流程卡死。所以,遇到問題時,第一反應就是檢查這些配置細節,特別是那個授權碼。
如何使用Python發送包含附件或HTML內容的郵件?
發送純文本郵件只是個開始,實際工作中,我們更常需要發送帶有格式的HTML郵件,或者附帶文件。email模塊就是為這些復雜需求而生的。它提供了一套類來構建多部分郵件(MIMEMultipart),讓你能把文本、HTML、圖片、文件等“打包”在一起。
發送HTML郵件,本質上是把郵件正文的subtype從plain改成html:
from email.mime.text import MIMEText from email.