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模块使用方法的资料请关注脚本之家其它相关文章!

相关文章

  • Python3中FuzzyWuzzy库实例用法

    Python3中FuzzyWuzzy库实例用法

    在本篇文章中小编给各位整理了关于Python3z中FuzzyWuzzy库实例用法及相关代码,有兴趣的朋友们可以参考下。
    2020-11-11
  • django模型层(model)进行建表、查询与删除的基础教程

    django模型层(model)进行建表、查询与删除的基础教程

    这篇文章主要给大家介绍了关于django模型层(model)进行建表、查询与删除的等基础操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • python和flask中返回JSON数据的方法

    python和flask中返回JSON数据的方法

    下面小编就为大家整理了一篇python和flask中返回JSON数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Python实现PDF转MP3的示例代码

    Python实现PDF转MP3的示例代码

    我们平常看到很多文件都是PDF格式,网上的各类书籍多为此格式。有时候不方便阅读,或者怕费眼睛伤颈椎,那么有没有一种方法可以把它变为音频,本文就来和大家详细讲讲
    2023-05-05
  • Python 3.x 连接数据库示例(pymysql 方式)

    Python 3.x 连接数据库示例(pymysql 方式)

    这篇文章主要介绍了Python 3.x 连接数据库示例(pymysql 方式),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 详述numpy中的np.random.random()系列函数用法

    详述numpy中的np.random.random()系列函数用法

    本文主要介绍了详述numpy中的np.random.random()系列函数用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • python字典基本操作实例分析

    python字典基本操作实例分析

    这篇文章主要介绍了python字典基本操作,实例分析了Python的打印输出、删除、赋值等常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Python利用多线程同步锁实现多窗口订票系统(推荐)

    Python利用多线程同步锁实现多窗口订票系统(推荐)

    这篇文章主要介绍了Python利用多线程同步锁实现多窗口订票系统,主要是利用threading.lock()通过实例代码相结合给大家讲解的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Python必考的5道面试题集合

    Python必考的5道面试题集合

    这篇文章介绍了Python必考的5道面试题,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • python中CURL 和python requests的相互转换实现

    python中CURL 和python requests的相互转换实现

    本文主要介绍了python中CURL 和python requests的相互转换实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论