如何使用Python發送電子郵件?smtplib模塊教程

python發送郵件的核心在于利用smtplib模塊與smtp服務器通信,并用email模塊構建郵件內容。常見認證問題包括:1.密碼錯誤或未啟用授權碼,需使用郵箱生成的專用密碼;2.smtp地址或端口錯誤,應根據服務商配置正確參數;3.網絡或防火墻限制,需檢查端口訪問權限;4.ssl/tls協議不匹配,應根據端口選擇加密方式。對于html或附件郵件,需使用mimetext設置subtype為html,或通過mimemultipart組合多部分內容。整個流程需注意編碼、加密連接及郵件內容封裝

如何使用Python發送電子郵件?smtplib模塊教程

python發送電子郵件,核心在于利用其內置的smtplib模塊與郵件服務商的SMTP服務器進行通信。它允許我們像命令行一樣,一步步地與郵件服務器“對話”,發送指令,最終把郵件送出去。同時,email模塊則負責把我們想發的內容——無論是純文本、HTML還是附件——“包裝”成郵件服務器能理解的標準格式。

如何使用Python發送電子郵件?smtplib模塊教程

要用Python發郵件,我們通常會經歷這么幾個步驟,看似繁瑣,實則邏輯清晰:連接服務器、登錄、構建郵件內容,最后發送。

如何使用Python發送電子郵件?smtplib模塊教程

最基本的純文本郵件發送流程是這樣的:

立即學習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連接升級為加密連接,這是目前大多數郵件服務商推薦的方式。

如何使用Python發送電子郵件?smtplib模塊教程

使用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.

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享