Python标准库中email模块的使用方法与内部机制详解

 更新时间:2025年06月11日 09:55:48   作者:萧鼎  
在 Python 中处理电子邮件时,标准库中的 email 模块是首选工具,无论你需要发送 HTML 格式的邮件、带附件的邮件,还是解析复杂的邮件结构,email 库都能胜任,这篇博客将带你系统地认识并掌握 email 模块的使用方法与内部机制,需要的朋友可以参考下

一、什么是 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 类型构建工具包,如 MIMETextMIMEImageMIMEMultipart
  • 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/htmlHTML 邮件
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模块使用方法的资料请关注脚本之家其它相关文章!

相关文章

  • Python 解析库json及jsonpath pickle的实现

    Python 解析库json及jsonpath pickle的实现

    这篇文章主要介绍了Python 解析库json及jsonpath pickle的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Python面向对象思想与应用入门教程【类与对象】

    Python面向对象思想与应用入门教程【类与对象】

    这篇文章主要介绍了Python面向对象思想与应用,较为详细的分析了Python面向对象思想与原理,并结合实例形式分析了类与对象相关定义、用法及操作注意事项,需要的朋友可以参考下
    2019-04-04
  • Python利用shutil实现拷贝文件功能

    Python利用shutil实现拷贝文件功能

    shutil 是一个 Python 内置模块,该模块对文件的复制、删除和压缩等操作都提供了非常方便的支持。本文将利用shutil实现拷贝文件功能,需要的可以参考一下
    2022-07-07
  • python的列表生成式,生成器和generator对象你了解吗

    python的列表生成式,生成器和generator对象你了解吗

    这篇文章主要为大家详细介绍了python的列表生成式,生成器和generator对象,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Python traceback模块获取异常信息的使用

    Python traceback模块获取异常信息的使用

    Python的traceback模块提供了多种方法来获取和展示异常的堆栈信息,本文主要介绍了Python traceback模块获取异常信息的使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Python中实例化class的执行顺序示例详解

    Python中实例化class的执行顺序示例详解

    这篇文章主要给大家介绍了关于Python中实例化class的执行顺序的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们随着小编来一起学习学习吧
    2018-10-10
  • python数据分析基础知识之shape()函数的使用教程

    python数据分析基础知识之shape()函数的使用教程

    shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度,下面这篇文章主要给大家介绍了关于python数据分析基础知识之shape()函数使用的相关资料,需要的朋友可以参考下
    2022-09-09
  • Pandas读取csv的实现

    Pandas读取csv的实现

    本文主要介绍了Pandas读取csv的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Python实现滑块拼图验证码详解

    Python实现滑块拼图验证码详解

    验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现,今天给大家分享一篇Python实现滑块验证码
    2022-05-05
  • Python中实现对list做减法操作介绍

    Python中实现对list做减法操作介绍

    这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下
    2015-01-01

最新评论