Python標(biāo)準(zhǔn)庫中email模塊的使用方法與內(nèi)部機(jī)制詳解
一、什么是 email 模塊?
email 是 Python 內(nèi)置的標(biāo)準(zhǔn)庫,用于構(gòu)建或解析符合 RFC 5322 標(biāo)準(zhǔn)的電子郵件。該模塊支持:
- 構(gòu)建 MIME(Multipurpose Internet Mail Extensions)郵件,包括多部分郵件(multipart)、附件、文本/HTML 內(nèi)容等。
- 解碼和解析原始郵件(如 .eml 文件、POP3/IMAP 下載的數(shù)據(jù)等)。
- 支持編碼(Base64、Quoted-Printable)、字符集處理、多語言兼容等。
該模塊最早出現(xiàn)在 Python 2.2,經(jīng)過多次迭代,在 Python 3 中已高度模塊化和現(xiàn)代化,使用更加清晰直觀。
二、模塊結(jié)構(gòu)與核心組件
Python 的 email
庫結(jié)構(gòu)如下:
email.message
: 定義郵件的結(jié)構(gòu)(如EmailMessage
類)。email.mime
: MIME 類型構(gòu)建工具包,如MIMEText
、MIMEImage
、MIMEMultipart
。email.parser
: 用于解析原始郵件字符串為Message
對象。email.generator
: 用于將Message
對象生成字符串或?qū)懭胛募?/li>email.utils
: 提供通用工具函數(shù),如地址解析、時間格式化等。
三、構(gòu)建電子郵件
3.1 創(chuàng)建純文本郵件
from email.message import EmailMessage msg = EmailMessage() msg['Subject'] = '測試郵件' msg['From'] = 'sender@example.com' msg['To'] = 'receiver@example.com' msg.set_content('這是純文本郵件內(nèi)容') print(msg.as_string())
3.2 創(chuàng)建 HTML 郵件
msg = EmailMessage() msg['Subject'] = 'HTML 郵件' msg['From'] = 'sender@example.com' msg['To'] = 'receiver@example.com' msg.set_content('這是純文本備用內(nèi)容') msg.add_alternative(""" <html> <body> <h1 style="color:blue">這是一封 HTML 郵件</h1> </body> </html> """, subtype='html')
3.3 添加附件
with open('demo.pdf', 'rb') as f: file_data = f.read() file_name = f.name msg.add_attachment(file_data, maintype='application', subtype='pdf', filename=file_name)
四、解析電子郵件
email
支持將原始郵件(如 .eml
文件)解析成結(jié)構(gòu)化對象:
4.1 解析原始郵件內(nèi)容
from email import policy from email.parser import BytesParser with open('sample.eml', 'rb') as f: msg = BytesParser(policy=policy.default).parse(f) print('Subject:', msg['subject']) print('From:', msg['from']) print('To:', msg['to'])
4.2 遍歷多部分郵件內(nèi)容
if msg.is_multipart(): for part in msg.iter_parts(): content_type = part.get_content_type() content = part.get_content() print(f'Part: {content_type}\nContent:\n{content}\n') else: print(msg.get_content())
五、常見 MIME 類型
類型 | 說明 |
---|---|
text/plain | 純文本郵件 |
text/html | HTML 郵件 |
multipart/mixed | 多部分郵件,通常包含附件 |
multipart/alternative | 文本 + HTML 備用格式 |
application/octet-stream | 任意二進(jìn)制附件 |
image/jpeg / image/png | 嵌入圖像 |
你可以使用 email.mime.*
中的各類構(gòu)造器快速創(chuàng)建這些類型:
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication
六、與 smtplib 聯(lián)合發(fā)送郵件
雖然 email
負(fù)責(zé)構(gòu)建郵件,但實際發(fā)送需要結(jié)合 smtplib
:
import smtplib with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp: smtp.login('user@example.com', 'password') smtp.send_message(msg)
七、常用工具函數(shù)(email.utils)
from email.utils import parseaddr, formataddr, format_datetime from datetime import datetime, timezone name, email = parseaddr("小明 <xiaoming@example.com>") print(name, email) # 格式化地址 print(formataddr(("測試人", "test@example.com"))) # 格式化時間為郵件頭格式 print(format_datetime(datetime.now(timezone.utc)))
八、完整示例:發(fā)送帶附件的 HTML 郵件
from email.message import EmailMessage import smtplib msg = EmailMessage() msg['Subject'] = '周報' msg['From'] = 'sender@example.com' msg['To'] = 'receiver@example.com' # 添加 HTML 正文 msg.set_content('請查看 HTML 格式郵件') msg.add_alternative(""" <html> <body> <p>您好,</p> <p>這是本周的周報,請查收附件。</p> </body> </html> """, subtype='html') # 添加附件 with open('report.pdf', 'rb') as f: msg.add_attachment(f.read(), maintype='application', subtype='pdf', filename='report.pdf') # 發(fā)送郵件 with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp: smtp.login('sender@example.com', 'password') smtp.send_message(msg)
九、調(diào)試技巧
- 使用 .as_string() 打印構(gòu)造后的郵件內(nèi)容以調(diào)試;
- 若郵件亂碼,需設(shè)置 charset='utf-8';
- 多部分郵件優(yōu)先順序:multipart/alternative 由客戶端選擇最合適顯示;
- 若調(diào)試發(fā)送失敗,可打開 smtplib 的調(diào)試日志:smtp.set_debuglevel(1)。
十、總結(jié)
Python 的 email
模塊功能強大、標(biāo)準(zhǔn)化程度高,適合處理各種郵件構(gòu)建與解析任務(wù)。掌握它不僅可以讓你自動化報告發(fā)送、實現(xiàn)客服回復(fù)系統(tǒng)、構(gòu)建郵件網(wǎng)關(guān),還能與 SMTP/IMAP/POP3 模塊聯(lián)動開發(fā)出郵件相關(guān)應(yīng)用。
以上就是Python標(biāo)準(zhǔn)庫中email模塊的使用方法與內(nèi)部機(jī)制詳解的詳細(xì)內(nèi)容,更多關(guān)于Python email模塊使用方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 解析庫json及jsonpath pickle的實現(xiàn)
這篇文章主要介紹了Python 解析庫json及jsonpath pickle的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python面向?qū)ο笏枷肱c應(yīng)用入門教程【類與對象】
這篇文章主要介紹了Python面向?qū)ο笏枷肱c應(yīng)用,較為詳細(xì)的分析了Python面向?qū)ο笏枷肱c原理,并結(jié)合實例形式分析了類與對象相關(guān)定義、用法及操作注意事項,需要的朋友可以參考下2019-04-04python的列表生成式,生成器和generator對象你了解嗎
這篇文章主要為大家詳細(xì)介紹了python的列表生成式,生成器和generator對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03python數(shù)據(jù)分析基礎(chǔ)知識之shape()函數(shù)的使用教程
shape函數(shù)是numpy.core.fromnumeric中的函數(shù),它的功能是讀取矩陣的長度,比如shape[0]就是讀取矩陣第一維度的長度,下面這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)分析基礎(chǔ)知識之shape()函數(shù)使用的相關(guān)資料,需要的朋友可以參考下2022-09-09