使用Python程序自動發(fā)送郵件的完整流程
01 準備工作
登錄自己的郵箱,在設置中,打開SMTP/POP3服務,并新增授權碼(授權碼個人保存好,后續(xù)郵件服務鑒權時會用到)。



以上是qq郵箱,126郵箱和163郵箱在設置中打開服務的截圖,供大家參考。
打開服務后,不同郵箱對應的服務地址和端口如下:
163郵箱的服務地址和端口如下:

126郵箱的SMTP服務器地址是smtp.126.com,POP3服務器地址為pop.126.com,imap.126.com;端口號同163郵箱地址
QQ郵箱的SMTP服務器地址是smtp.qq.com,端口號為587或465;POP3服務器地址為pop.qq.com,端口號為110或995;imap.qq.com,使用SSL,端口號143或993
SMTP(Simple Mail Transfer Protocol)是用來發(fā)送郵件的協(xié)議,而POP3(Post Office Protocol 3)是用來接收郵件的協(xié)議。
通過設置正確的郵箱地址和端口號,我們就可以成功收發(fā)郵件了。
02發(fā)送郵件程序用到的核心庫與函數(shù)介紹
Python主要通過smtplib(SMTP協(xié)議客戶端)和email(郵件內容構建)兩大庫實現(xiàn)郵件發(fā)送功能,核心函數(shù)功能如下:
1. smtplib.SMTP():創(chuàng)建SMTP連接
- 功能:建立與郵件服務器的連接,支持TLS/SSL 加密。
- 參數(shù):host:郵件服務器地址(如smtp.qq.com)port:端口號
- 案例:連接QQ郵箱服務器
import smtplib
# 創(chuàng)建普通連接
server = smtplib.SMTP('smtp.qq.com', 587)
# 啟動TLS加密
server.starttls()
# 登錄郵箱
server.login('xxx@qq.com', 'password')
#創(chuàng)建SSL連接 填寫SSL端口號
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登錄郵箱
server.login('xxx@qq.com', 'password')注意:部分郵箱需使用授權碼代替密碼登錄,如QQ郵箱需在設置中開啟 “POP3/SMTP 服務” 獲取授權碼。
2. email.mime模塊:構建郵件內容
1)email.mime.text.MIMEText():創(chuàng)建文本郵件

參數(shù)介紹:
- _text: 用于指定郵件的正文內容,可以是字符串形式的純文本或 HTML 代碼。
- _subtype='plain' :表示文本類型。 'plain' : 代表純文本;'html': 代表html內容
- _charset=None:表示郵件內容的字符編碼,默認是ascii,可自己傳入utf8等。
- policy=None:policy參數(shù)可以接收email.policy模塊中定義的不同策略對象,用于指定如何解析郵件內容、處理頭部信息、格式化輸出等。默認為email.policy.compat32,全部內容為['Compat32','compat32','Policy','EmailPolicy','default','strict','SMTP','HTTP'],具體介紹參考附錄中的‘常用的policy策略’介紹。
from email.mime.text import MIMEText # 創(chuàng)建純文本郵件內容 text = "這是一封測試郵件!" msg = MIMEText(text, 'plain', 'utf-8') # 創(chuàng)建HTML郵件內容 html = """ <html> <body> <h1>歡迎訂閱周報</h1> <p>本周熱點:...</p> </body> </html> """ msg = MIMEText(html, 'html')
2)email.mime.multipart.MIMEMultipart():創(chuàng)建多格式郵件(支持附件)
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 創(chuàng)建多格式
msg = MIMEMultipart()
#通過attach函數(shù) 添加純文本內容MIMEText
msg.attach(MIMEText("郵件正文", 'plain', 'utf-8'))
# 通過MIMEApplication添加附件test.xlsx
with open('test.xlsx', 'rb') as f:
part = MIMEApplication(f.read(), Name='test.xlsx')
#設置附件名字
part['Content-Disposition'] = f'attachment; filename="test.xlsx"'
#通過attach函數(shù) 添加附件MIMEApplication
msg.attach(part)3. 郵件頭部設置
- msg['Subject']:設置郵件主題
- msg['From']:發(fā)件人郵箱
- msg['To']:收件人郵箱(支持多個收件人,用逗號分隔)
4. server.sendmail():發(fā)送郵件
功能:將構建好的郵件發(fā)送給收件人。
參數(shù):from_addr:發(fā)件人郵箱
to_addrs:收件人郵箱列表
msg.as_string():將郵件對象轉換為字符串格式
案例:發(fā)送郵件
# 假設已創(chuàng)建msg郵件對象
server.sendmail('xx@xxx.com', ['xx1@xxx.com','xx2@xxx.com'], msg.as_string())
server.quit()5、實際案例
案例 1:發(fā)送純文本郵件
import smtplib
from email.mime.text import MIMEText
# 創(chuàng)建連接
server = smtplib.SMTP('smtp.126.com', 25)
# 啟動TLS加密
server.starttls()
# 登錄郵箱
server.login('xxx1@xxx.com', 'xxxx')
# 創(chuàng)建純文本郵件內容
text = "這是一封測試郵件!"
msg = MIMEText(text, 'plain', 'utf-8')
msg['Subject'] = text
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#發(fā)送msg郵件對象
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()實際使用中大家替換為自己的發(fā)件人郵箱和對方郵箱地址。
案例 2:發(fā)送帶HTML格式的郵件
import smtplib
from email.mime.text import MIMEText
# 創(chuàng)建連接
server = smtplib.SMTP('smtp.126.com', 25)
# 啟動TLS加密
server.starttls()
# 登錄郵箱
server.login('xxx1@xxx.com', 'xxxx')
# 創(chuàng)建純文本郵件內容
html = """
<html>
<body>
<h1>歡迎訂閱周報</h1>
<p>本周熱點:...</p>
</body>
</html>
"""
msg = MIMEText(html, 'html', 'utf-8')
msg['Subject'] = 'test'
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#發(fā)送msg郵件對象
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()案例 3:發(fā)送附件郵件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 創(chuàng)建連接
server = smtplib.SMTP('smtp.126.com', 25)
# 啟動TLS加密
server.starttls()
# 登錄郵箱
server.login('xxx1@xxx.com', 'xxxx')
# 創(chuàng)建多格式
msg = MIMEMultipart()
msg['Subject'] = text
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#通過attach函數(shù) 添加純文本內容MIMEText
msg.attach(MIMEText("郵件正文", 'plain', 'utf-8'))
# 通過MIMEApplication添加附件test.xlsx
with open('test.xlsx', 'rb') as f:
part = MIMEApplication(f.read(), Name='test.xlsx')
#設置附件名字
part['Content-Disposition'] = f'attachment; filename="test.xlsx"'
#通過attach函數(shù) 添加附件MIMEApplication
msg.attach(part)
#發(fā)送msg郵件對象
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()03 附錄
常用的policy策略
1.email.policy.default
功能:默認策略,提供了較為通用的郵件處理方式。在解析郵件時,它會保留郵件頭部字段的原始大小寫,并使用系統(tǒng)默認的編碼方式進行處理。
適用場景:適用于大多數(shù)常規(guī)的郵件處理需求,不需要對郵件解析和構造進行特殊定制的場景。
2.email.policy.SMTP
功能:遵循 SMTP 協(xié)議標準的策略。該策略會將郵件頭部字段轉換為大寫,符合 SMTP 協(xié)議中對頭部字段的規(guī)范要求 ,并且在處理郵件內容時,會按照 SMTP 協(xié)議的規(guī)則進行編碼和換行處理。
適用場景:當需要嚴格遵循 SMTP 協(xié)議標準來發(fā)送或解析郵件時使用,例如與其他遵循 SMTP 協(xié)議的郵件服務器進行交互。
3.email.policy.compat32
功能:為了兼容 Python 3.2 及以前版本的郵件處理方式而設計的策略。它會將郵件頭部字段轉換為大寫,并對郵件內容進行一些兼容性的處理,以保持與舊版本的一致性。
適用場景:在需要與使用舊版 Python 郵件處理邏輯的系統(tǒng)進行交互,或者需要保證代碼在不同 Python 版本下行為一致時使用。
4.email.policy.SMTPUTF8
功能:在SMTP策略的基礎上,支持 UTF-8 編碼的郵件內容。它會正確處理包含非 ASCII 字符的郵件頭部和正文,確保在 SMTP 傳輸過程中不會出現(xiàn)編碼錯誤。
適用場景:當郵件內容包含多種語言文字、特殊字符,需要在 SMTP 傳輸中保證編碼正確性時使用。
掌握Python郵件功能,能為你的自動化工作流增添強大助力!無論是個人通知還是企業(yè)級應用,都可以通過靈活組合這些函數(shù)實現(xiàn)。
以上就是使用Python程序自動發(fā)送郵件的完整流程的詳細內容,更多關于Python自動發(fā)送郵件的資料請關注腳本之家其它相關文章!
相關文章
解決Python3 控制臺輸出InsecureRequestWarning問題
這篇文章主要介紹了解決Python3 控制臺輸出InsecureRequestWarning的問題 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
Pandas中Concat與Append的實現(xiàn)與區(qū)別小結
本文主要介紹了Pandas中Concat與Append的實現(xiàn)與區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-11-11

