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ù),如地址解析、時(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)建郵件,但實(shí)際發(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")))
# 格式化時(shí)間為郵件頭格式
print(format_datetime(datetime.now(timezone.utc)))
八、完整示例:發(fā)送帶附件的 HTML 郵件
from email.message import EmailMessage
import smtplib
msg = EmailMessage()
msg['Subject'] = '周報(bào)'
msg['From'] = 'sender@example.com'
msg['To'] = 'receiver@example.com'
# 添加 HTML 正文
msg.set_content('請查看 HTML 格式郵件')
msg.add_alternative("""
<html>
<body>
<p>您好,</p>
<p>這是本周的周報(bào),請查收附件。</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 模塊功能強(qiáng)大、標(biāo)準(zhǔn)化程度高,適合處理各種郵件構(gòu)建與解析任務(wù)。掌握它不僅可以讓你自動(dòng)化報(bào)告發(fā)送、實(shí)現(xiàn)客服回復(fù)系統(tǒng)、構(gòu)建郵件網(wǎng)關(guān),還能與 SMTP/IMAP/POP3 模塊聯(lián)動(dòng)開發(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的實(shí)現(xiàn)
這篇文章主要介紹了Python 解析庫json及jsonpath pickle的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Python面向?qū)ο笏枷肱c應(yīng)用入門教程【類與對象】
這篇文章主要介紹了Python面向?qū)ο笏枷肱c應(yīng)用,較為詳細(xì)的分析了Python面向?qū)ο笏枷肱c原理,并結(jié)合實(shí)例形式分析了類與對象相關(guān)定義、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
Python利用shutil實(shí)現(xiàn)拷貝文件功能
shutil?是一個(gè)?Python?內(nèi)置模塊,該模塊對文件的復(fù)制、刪除和壓縮等操作都提供了非常方便的支持。本文將利用shutil實(shí)現(xiàn)拷貝文件功能,需要的可以參考一下2022-07-07
python的列表生成式,生成器和generator對象你了解嗎
這篇文章主要為大家詳細(xì)介紹了python的列表生成式,生成器和generator對象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Python中實(shí)例化class的執(zhí)行順序示例詳解
這篇文章主要給大家介紹了關(guān)于Python中實(shí)例化class的執(zhí)行順序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
python數(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
Python實(shí)現(xiàn)滑塊拼圖驗(yàn)證碼詳解
驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場景中。傳統(tǒng)的字符型驗(yàn)證安全性已經(jīng)名存實(shí)亡的情況下,各種新型的驗(yàn)證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實(shí)現(xiàn)滑塊驗(yàn)證碼2022-05-05
Python中實(shí)現(xiàn)對list做減法操作介紹
這篇文章主要介紹了Python中實(shí)現(xiàn)對list做減法操作介紹,需要的朋友可以參考下2015-01-01

