Python标准库中email模块的使用方法与内部机制详解
目录
- 一、什么是 email 模块?
- 二、模块结构与核心组件
- 三、构建电子邮件
- 3.1 创建纯文本邮件
- 3.2 创建 html 邮件
- 3.3 添加附件
- 四、解析电子邮件
- 4.1 解析原始邮件内容
- 4.2 遍历多部分邮件内容
- 五、常见 MIME 类型
- 六、与 smtplib 联合发送邮件
- 七、常用工具函数(email.utils)
- 八、完整示例:发送带附件的 HTML 邮件
- 九、调试技巧
- 十、总结
一、什么是 email 模块?
email 是 python 内置的标准库,用于构建或解析符合 RFC 5322 标准的电子邮件。该模块支持:
- 构建 MIME(Multipurpose Internet Mail Extensions)邮件,包括多部分邮件(multipart)、附件、文本/HTML 内容等。
- 解码和解析原始邮件(如 .eml 文件、POP3/IMAP 下载的数据等)。
- 支持编码(Base64、Quoted-Printable)、字符集处理、多语言兼容等。
该模块最早出现在 Python 2.2,经过多次迭代,在 Python 3 中已高度模块化和现代化,使用更加清晰直观。
二、模块结构与核心组件
Python 的 email
库结构如下:
email.message
: 定义邮件的结构(如EmailMessage
类)。email.mime
: MIME 类型构建工具包,如MIMEText
、MIMEImage
、MIMEMultipart
。email.parser
: 用于解析原始邮件字符串为Message
对象。email.generator
: 用于将Message
对象生成字符串或写入文件。email.utils
: 提供通用工具函数,如地址解析、时间格式化等。
三、构建电子邮件
3.1 创建纯文本邮件
from email.message import EmailMessage msg = EmailMessage() msg['Subject'] = '测试邮件' msg['From'] = 'sender@example.com' msg['To'] = 'receiver@example.com' msg.set_content('这是纯文本邮件内容') print(msg.as_string())
3.2 创建 HTML 邮件
msg = EmailMessage() msg['Subject'] = 'HTML 邮件' msg['From'] = 'sender@example.com' msg['To'] = 'receiver@example.com' msg.set_content('这是纯文本备用内容') msg.add_alternative(""" <html> <body> <h1>这是一封 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
&javascriptnbsp;文件)解析成结构化对象:
4.1 解析原始邮件内容
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 遍历多部分邮件内容
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_contenwww.devze.comt())
五、常见 MIME 类型
类型 | 说明 |
---|---|
text/plain | 纯文本邮件 |
text/html | HTML 邮件 |
multipart/mixed | 多部分邮件,通常包含附件 |
multipart/alternative | 文本 + HTML 备用格式 |
application/octet-stream | 任意二进制附件 |
image/jpeg / image/png | 嵌入图像 |
你可以使用 email.mime.*
中的各类构造器快速创建这些类型:
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication
六、与 smtplib 联合发送邮件
虽然 email
负责构建邮件,但实际发送需要结合 smtplib
:
import smtplib with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp: smtp.login('user@example.com', 'password') smtp.send_message(msg)
七、常用工具函数(email.utils)
from email.utils import parseaddr, formataddr, format_datetime from datetime import datetime, timezone name, ehttp://www.devze.commail = parseaddr("小明 <xiaoming@example.com>") print(name, email) # 格式化地址 print(formataddr(("测试人", "test@example.com"))) # 格式化时间为邮件头格式 print(format_datetime(datetime.now(timezone.utc)))
八、完整示例:发送带附件的 HTML 邮件
frojavascriptm 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') # 发送邮件 with smtplib.SMTP_SSL('smtp.example.com', 465) as smtp: smtp.login('sender@example.com', 'password') smtp.send_message(msg)
九、调试技巧
- 使用 .as_string() 打印构造后的邮件内容以调试;
- 若邮件乱码,需设置 charset='utf-8';
- 多部分邮件优先顺序:multipart/alternative 由客户端选择最合适显示;
- 若调试发送失败,可打开 smtplib 的调试日志:smtp.set_debuglevel(1)。
十、总结
Python 的 email
模块功能强大、标准化程度高,适合处理各种邮件构建与解http://www.devze.com析任务。掌握它不仅可以让你自动化报告发送、实现客服回复系统、构建邮件网关,还能与 SMTP/IMAP/POP3 模块联动开发出邮件相关应用。
以上就是Python标准库中email模块的使用方法与内部机制详解的详细内容,更多关于Python email模块使用方法的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论