一、什么是 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 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 文件)解析成结构化对象:
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_content())
五、常见 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, email = parseaddr("小明 <xiaoming@example.com>")
print(name, email)
# 格式化地址
print(formataddr(("测试人", "test@example.com")))
# 格式化时间为邮件头格式
print(format_datetime(datetime.now(timezone.utc)))
八、完整示例:发送带附件的 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')
# 发送邮件
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 模块功能强大、标准化程度高,适合处理各种邮件构建与解析任务。掌握它不仅可以让你自动化报告发送、实现客服回复系统、构建邮件网关,还能与 smtp/imap/pop3 模块联动开发出邮件相关应用。
以上就是python标准库中email模块的使用方法与内部机制详解的详细内容,更多关于python email模块使用方法的资料请关注代码网其它相关文章!
发表评论