当前位置:首页 > Python > 正文

Python Email模块使用教程 - 从入门到精通 | Python邮件发送指南

Python Email模块使用教程

本教程将全面介绍Python标准库中的email模块,教你如何发送各种类型的电子邮件:

  • 纯文本邮件
  • HTML格式邮件
  • 带附件的邮件
  • 包含图片的HTML邮件

一、Python邮件发送基础

Python的email模块与smtplib模块配合使用可以实现邮件发送功能。

基本发送流程:

  1. 创建SMTP连接
  2. 构建邮件内容
  3. 设置发件人、收件人和主题
  4. 发送邮件
  5. 关闭连接

二、发送纯文本邮件

最简单的邮件类型是纯文本邮件:

示例代码:发送文本邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件配置
smtp_server = 'smtp.example.com'  # SMTP服务器地址
smtp_port = 587                   # 端口号(TLS)
sender = 'your_email@example.com' # 发件人邮箱
password = 'your_password'        # 邮箱密码/授权码
receiver = 'recipient@example.com' # 收件人邮箱

# 创建纯文本邮件内容
message = MIMEText('这是一封使用Python发送的测试邮件', 'plain', 'utf-8')
message['From'] = Header('Python发件人', 'utf-8')  # 发件人名称
message['To'] = Header('收件人', 'utf-8')          # 收件人名称
message['Subject'] = Header('Python邮件测试', 'utf-8') # 邮件主题

try:
    # 创建SMTP连接
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # 启用TLS加密
    server.login(sender, password)
    
    # 发送邮件
    server.sendmail(sender, [receiver], message.as_string())
    print("邮件发送成功!")
except Exception as e:
    print(f"邮件发送失败: {e}")
finally:
    server.quit()  # 关闭连接

三、发送HTML格式邮件

发送HTML邮件可以创建更丰富的邮件内容:

示例代码:发送HTML邮件
import smtplib
from email.mime.text import MIMEText

# 创建HTML邮件内容
html_content = """
<html>
<body>
    <h1 style="color: #3498db;">HTML邮件测试</h1>
    <p>这是一封使用<strong>Python</strong>发送的HTML格式邮件</p>
    <ul>
        <li>列表项 1</li>
        <li>列表项 2</li>
        <li>列表项 3</li>
    </ul>
    <p><a href="https://www.python.org">访问Python官网</a></p>
</body>
</html>
"""

message = MIMEText(html_content, 'html', 'utf-8')
message['From'] = sender
message['To'] = receiver
message['Subject'] = 'HTML邮件测试'

# 发送邮件代码同上(省略SMTP连接部分)

四、发送带附件的邮件

使用MIMEMultipart和MIMEBase发送带附件的邮件:

示例代码:发送带附件的邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
import os

# 创建多部分消息容器
message = MIMEMultipart()
message['From'] = sender
message['To'] = receiver
message['Subject'] = '带附件的测试邮件'

# 添加邮件正文
body = "这是一封包含附件的测试邮件,请查收附件。"
message.attach(MIMEText(body, 'plain'))

# 添加附件
filename = 'example.pdf'  # 附件文件名
filepath = os.path.join(os.getcwd(), filename)

# 读取附件内容
with open(filepath, 'rb') as attachment:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(attachment.read())

# 对附件进行Base64编码
encoders.encode_base64(part)

# 设置附件头信息
part.add_header(
    'Content-Disposition',
    f'attachment; filename= {filename}',
)

# 将附件添加到消息容器
message.attach(part)

# 发送邮件代码同上(省略SMTP连接部分)

五、发送包含图片的HTML邮件

在HTML邮件中嵌入图片需要使用CID引用:

示例代码:发送带图片的HTML邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText

# 创建多部分消息容器
message = MIMEMultipart('related')
message['From'] = sender
message['To'] = receiver
message['Subject'] = '包含图片的HTML邮件'

# 创建HTML正文
html_content = """
<html>
<body>
    <h1>包含图片的邮件</h1>
    <p>这是一封包含嵌入式图片的邮件:</p>
    <img src="cid:image1" alt="示例图片" style="max-width: 400px;">
    <p>邮件结束</p>
</body>
</html>
"""

# 添加HTML部分
html_part = MIMEText(html_content, 'html')
message.attach(html_part)

# 添加图片
image_path = 'example.jpg'
with open(image_path, 'rb') as img_file:
    img = MIMEImage(img_file.read())
    img.add_header('Content-ID', '<image1>')  # 这里的ID需要和HTML中的cid对应
    message.attach(img)

# 发送邮件代码同上(省略SMTP连接部分)

六、邮件发送最佳实践

1. 安全性注意事项

  • 始终使用TLS/SSL加密连接
  • 不要在代码中硬编码密码,使用环境变量或配置文件
  • 使用授权码而非邮箱密码(Gmail、QQ邮箱等)

2. 邮件发送优化

  • 添加邮件退订链接(符合反垃圾邮件规范)
  • 提供纯文本替代内容(对于HTML邮件)
  • 测试不同邮件客户端的兼容性

3. 常见问题解决

  • 认证错误:检查用户名/密码,确保启用SMTP服务
  • 连接超时:检查防火墙设置和端口可用性
  • 被识别为垃圾邮件:配置SPF、DKIM和DMARC记录

七、总结

Python的email模块提供了强大而灵活的邮件处理能力。通过本教程,您已经学会了:

  • 发送纯文本和HTML格式邮件
  • 添加附件到邮件
  • 在HTML邮件中嵌入图片
  • 邮件发送的安全注意事项

在实际应用中,您还可以结合email模块与其他库实现更高级的功能:

  • 使用email.parser解析收到的邮件
  • 使用email.policy定制邮件处理策略
  • 使用email.header.decode_header处理编码问题

通过掌握Python email模块,您可以轻松实现自动化邮件发送功能,提升工作效率。

发表评论