在 Python 标准库中,并没有一个名为 mimetext 的独立模块。

这个名称通常是两个紧密相关的模块的合称或误称:
email.mime: 这是一个包,用于创建各种类型的 MIME (Multipurpose Internet Mail Extensions) 消息对象。smtplib: 这个模块用于发送邮件,它通常与email.mime创建的邮件对象一起使用。
当人们说 "Python mimetext" 时,他们几乎总是在谈论如何使用 email.mime 包(特别是其中的 text 模块)来构建邮件正文,并通过 smtplib 发送它。
下面,我将分步为你详细讲解这个过程。
核心概念:什么是 MIME?
在深入代码之前,理解 MIME 至关重要。

- 问题: 早期的电子邮件协议只能传输纯文本(ASCII 字符),如果你想发送一张图片、一个 PDF 文档,或者一段带有格式的文本(如粗体、斜体),原始的邮件协议是无能为力的。
- 解决方案: MIME (Multipurpose Internet Mail Extensions) 应运而生,它不是取代邮件协议,而是扩展它,MIME 定义了一种标准格式,允许邮件包含:
- 不同类型的内容(文本、图片、音频、视频等)。
- 多种字符编码(如 UTF-8, GBK),支持非英文字符。
- 多部分结构,使得一封邮件可以同时包含一个纯文本版本和一个 HTML 版本,或者一个正文和一个附件。
email.mime 包就是 Python 用来轻松创建这些符合 MIME 标准的邮件对象的工具集。
email.mime 包详解
email.mime 包下有几个重要的子模块,用于创建不同类型的 MIME 消息部分。
1 email.mime.text: 用于纯文本和 HTML
这是最基础、最常用的模块,用于创建邮件的正文。
MIMEText(text, _subtype='plain', _charset='utf-8')text: 邮件的正文内容,是一个字符串。_subtype: 指定文本的子类型,主要有两种:'plain': 纯文本,这是默认值。'html': HTML 格式的文本,你可以在这里写 HTML 代码。
_charset: 指定文本的字符编码。强烈建议始终使用 `'utf-8',以避免中文等非 ASCII 字符出现乱码。
示例代码:
from email.mime.text import MIMEText
# 1. 创建一个纯文本邮件正文
plain_text_body = """
你好,
这是一封用 Python 发送的测试邮件。
此邮件包含纯文本内容。
祝好!
"""
msg_plain = MIMEText(plain_text_body, 'plain', 'utf-8')
# 2. 创建一个 HTML 邮件正文
html_text_body = """
<html>
<body>
<h1>你好!</h1>
<p>这是一封用 Python 发送的 <b>HTML</b> 测试邮件。</p>
<p>此邮件包含 <i>格式化</i> 的内容。</p>
</body>
</html>
"""
msg_html = MIMEText(html_text_body, 'html', 'utf-8')
# msg_plain 和 msg_html 现在都是 MIMEText 对象,
# 可以作为邮件的正文部分。
2 email.mime.multipart: 用于多部分邮件
一封邮件如果既要包含文本,又要包含 HTML(以便在不支持 HTML 的邮件客户端中回退到纯文本),或者要包含附件,就必须使用 multipart 类型。
multipart 消息就像一个容器,它可以包含多个 MIMEText 或其他 MIME 对象。
MIMEMultipart(_subtype='mixed')_subtype: 指定多部分的类型。- `'mixed' 最常用的类型,用于将邮件的正文和附件**组合在一起。
- `'alternative' 用于将多种版本的正文**组合在一起,例如一个纯文本版本和一个 HTML 版本,邮件客户端会优先显示它能够处理的“最佳”版本。
- `'related' 用于将 HTML 正文和它引用的内嵌资源**(如图片)组合在一起。
组合使用示例(文本 + HTML + 附件):
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 1. 创建一个 mixed 类型的多部分容器
# 这个容器将用于存放邮件正文(文本和HTML)以及附件
msg = MIMEMultipart('mixed')
# 2. 设置邮件头
msg['Subject'] = '来自 Python 的复杂邮件测试'
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
# 3. 创建一个 alternative 容器来存放文本和HTML版本
# 这是最佳实践,让客户端选择显示哪个版本
msg_body_alternative = MIMEMultipart('alternative')
# 3.1 添加纯文本版本
text_part = MIMEText("这是邮件的纯文本版本,如果您的客户端不支持HTML,将显示此内容。", 'plain', 'utf-8')
msg_body_alternative.attach(text_part)
# 3.2 添加 HTML 版本
html_part = MIMEText("<h2>这是邮件的 HTML 版本</h2><p>它支持<b>格式化</b>文本。</p>", 'html', 'utf-8')
msg_body_alternative.attach(html_part)
# 4. 将 alternative 容器(包含文本和HTML)附加到主 mixed 容器中
msg.attach(msg_body_alternative)
# 5. 添加附件
# 假设我们有一个名为 report.pdf 的文件
try:
with open('report.pdf', 'rb') as f:
# 创建一个 application 类型的 MIME 对象
pdf_attachment = MIMEApplication(f.read(), Name='report.pdf')
# 添加附件头,让邮件客户端知道这是一个附件
pdf_attachment['Content-Disposition'] = f'attachment; filename="report.pdf"'
# 将附件附加到主邮件中
msg.attach(pdf_attachment)
except FileNotFoundError:
print("警告:report.pdf 文件未找到,将不添加附件。")
# msg 对象就是一封完整的、包含文本、HTML和附件的邮件。
# 你可以将其传递给 smtplib 发送。
3 其他重要的 MIME 类型
email.mime.image:MIMEImage,用于添加图片附件。email.mime.application:MIMEApplication,用于添加二进制文件附件(如 PDF, DOCX, ZIP 等),如上例所示。email.mime.audio:MIMEAudio,用于添加音频附件。
smtplib:发送邮件
创建了邮件对象后,我们需要使用 smtplib 来通过 SMTP (Simple Mail Transfer Protocol) 服务器将其发送出去。
基本步骤:
- 连接到 SMTP 服务器(Gmail, QQ邮箱, 163邮箱等)。
- 登录你的邮箱(如果需要)。
- 发送邮件。
- 关闭连接。
示例代码(以 Gmail 为例):
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# --- 1. 准备邮件内容 (使用前面创建的 msg 对象) ---
# 为了演示,我们在这里重新创建一个简单的邮件
msg = MIMEMultipart()
msg['Subject'] = '测试邮件 - 使用 smtplib'
msg['From'] = 'your_email@gmail.com' # 替换成你的邮箱
msg['To'] = 'recipient_email@example.com' # 替换成收件人邮箱
body = '这是一封通过 Python smtplib 发送的测试邮件。'
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# --- 2. 连接 SMTP 服务器并发送邮件 ---
try:
# Gmail 的 SMTP 服务器地址和端口
# SSL 加密端口: 465
# STARTTLS 加密端口: 587
smtp_server = 'smtp.gmail.com'
port = 587 # 使用 STARTTLS
# 你的邮箱地址和专用密码 (注意:不是你的登录密码)
# 对于 Gmail,需要在账户设置中开启“两步验证”,然后生成“应用专用密码”
sender_email = 'your_email@gmail.com'
password = 'your_app_specific_password'
# 创建 SMTP 对象
with smtplib.SMTP(smtp_server, port) as server:
# 启用安全传输模式 (对于端口 587)
server.starttls()
# 登录邮箱
server.login(sender_email, password)
# 发送邮件
# msg.as_string() 将邮件对象转换成字符串格式
# 发送方和接收方都需要是字符串列表
server.sendmail(sender_email, msg['To'], msg.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败: {e}")
完整实践案例:发送一封带附件的邮件
下面是一个完整的、可运行的脚本,它集成了所有知识点。
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os
# --- 1. 配置信息 ---
# 邮件服务器配置
SMTP_SERVER = 'smtp.example.com' # 替换为你的SMTP服务器,如 smtp.163.com
SMTP_PORT = 587
SMTP_USE_TLS = True
# 发件人信息
SENDER_EMAIL = 'your_sender@example.com' # 你的邮箱
SENDER_PASSWORD = 'your_password' # 你的邮箱密码或应用专用密码
# 收件人信息
RECIPIENT_EMAIL = 'recipient@example.com' # 收件人邮箱
# 附件信息
ATTACHMENT_PATH = 'my_document.txt' # 确保这个文件存在于脚本同目录下
ATTACHMENT_NAME = '重要报告.txt'
# --- 2. 创建邮件对象 ---
msg = MIMEMultipart('mixed')
msg['Subject'] = '【重要】月度销售报告'
msg['From'] = SENDER_EMAIL
msg['To'] = RECIPIENT_EMAIL
# --- 3. 创建邮件正文 (HTML + 纯文本) ---
body_html = """
<html>
<body>
<p>尊敬的同事,</p>
<p>您好!</p>
<p>附件是本月的<strong>销售报告</strong>,请查收。</p>
<p>如有任何问题,请随时联系我。</p>
<p>祝好,<br>张三</p>
</body>
</html>
"""
body_text = """
尊敬的同事,
您好!
附件是本月的销售报告,请查收。
如有任何问题,请随时联系我。
祝好,
张三
"""
# 创建一个 'alternative' 容器来放正文
msg_body = MIMEMultipart('alternative')
msg_body.attach(MIMEText(body_text, 'plain', 'utf-8'))
msg_body.attach(MIMEText(body_html, 'html', 'utf-8'))
# 将 'alternative' 容器附加到主邮件
msg.attach(msg_body)
# --- 4. 添加附件 ---
if os.path.exists(ATTACHMENT_PATH):
with open(ATTACHMENT_PATH, 'rb') as f:
part = MIMEApplication(f.read(), Name=ATTACHMENT_NAME)
# 添加 Content-Disposition 头,使其成为附件
part['Content-Disposition'] = f'attachment; filename="{ATTACHMENT_NAME}"'
msg.attach(part)
else:
print(f"警告:附件文件 '{ATTACHMENT_PATH}' 未找到,将不添加附件。")
# --- 5. 发送邮件 ---
try:
print("正在连接邮件服务器...")
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
if SMTP_USE_TLS:
print("正在启动 TLS 加密...")
server.starttls()
print("正在登录...")
server.login(SENDER_EMAIL, SENDER_PASSWORD)
print("正在发送邮件...")
server.sendmail(SENDER_EMAIL, RECIPIENT_EMAIL, msg.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败,发生错误: {e}")
总结与最佳实践
- 区分概念:
email.mime是用来构建的,smtplib是用来发送邮件的,它们是合作关系。 - 优先使用 MIMEMultipart: 任何稍微复杂一点的邮件(非纯文本)都应该从
MIMEMultipart开始构建。 - 正文最佳实践: 对于正文,总是使用一个
MIMEMultipart('alternative')容器来同时包含纯文本 ('plain') 和 HTML ('html') 版本,这能确保邮件在任何客户端下都有良好的可读性。 - 字符编码: 始终在创建
MIMEText时指定charset='utf-8',这是处理国际化内容的黄金标准。 - 附件处理: 附件使用
MIMEApplication或MIMEImage等创建,并务必添加Content-Disposition: attachment头。 - 安全连接: 现代邮件服务器都要求加密连接,使用
server.starttls()(对于端口 587) 或smtplib.SMTP_SSL()(对于端口 465) 来保证传输安全。 - 密码安全: 不要在代码中硬编码邮箱密码,最好使用环境变量或配置文件来存储敏感信息。
希望这份详细的解析能帮助你完全理解 Python 中处理 MIME 邮件的全过程!
