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

Python邮件发送完全指南 - 从基础到高级应用

Python实现邮件发送完全指南

为什么使用Python发送邮件?

Python提供了强大的标准库用于电子邮件发送,使开发者能够轻松实现自动化邮件通知、报告发送、用户注册验证等功能。本教程将带你全面掌握Python邮件发送技术。

主要应用场景: 系统监控报警、批量邮件营销、用户账户验证、自动化报告发送、事务性通知等。

核心Python库

smtplib

用于建立与SMTP服务器的连接并发送邮件。支持SMTP、SMTP_SSL和STARTTLS加密方式。

email

用于构建复杂的邮件消息,包括纯文本、HTML内容、附件以及多部分邮件结构。

准备工作

在发送邮件前,你需要:

  1. 拥有一个支持SMTP的邮箱账号(Gmail、QQ、163等)
  2. 获取SMTP服务器地址和端口号
  3. 生成邮箱的授权码(而非登录密码)

常用邮箱SMTP配置

邮箱服务 SMTP服务器 端口 加密方式
QQ邮箱 smtp.qq.com 465 SSL
163邮箱 smtp.163.com 465 SSL
Gmail smtp.gmail.com 587 TLS

发送纯文本邮件

这是最基本的邮件发送方式,适合发送简单的通知和消息。

示例代码:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件配置
smtp_server = 'smtp.163.com'
smtp_port = 465
username = 'your_email@163.com'
password = 'your_authorization_code'  # 授权码,不是登录密码

# 创建邮件内容
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_SSL(smtp_server, smtp_port)
    server.login(username, password)
    
    # 发送邮件
    server.sendmail(username, ['recipient@example.com'], message.as_string())
    print("邮件发送成功!")
    
    # 关闭连接
    server.quit()
except Exception as e:
    print(f"邮件发送失败: {str(e)}")
            

发送HTML格式邮件

HTML邮件允许你创建更丰富的内容,包括格式、图片和链接,适合营销邮件和通知。

示例代码:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件配置
smtp_server = 'smtp.qq.com'
smtp_port = 465
username = 'your_email@qq.com'
password = 'your_authorization_code'  # QQ邮箱授权码

# 创建HTML邮件内容
html_content = """
<html>
<body>
    <h1 style="color: #3498db;">欢迎加入我们的服务!</h1>
    <p>感谢您注册我们的平台,以下是您的账户信息:</p>
    <ul>
        <li><strong>用户名:</strong> user123</li>
        <li><strong>注册时间:</strong> 2023-06-15</li>
    </ul>
    <p><a href="https://example.com/activate" style="background: #3498db; color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px;">激活账户</a></p>
    <p style="color: #7f8c8d;">如果您未进行此操作,请忽略此邮件。</p>
</body>
</html>
"""

message = MIMEText(html_content, 'html', 'utf-8')
message['From'] = Header('系统通知 <no-reply@example.com>', 'utf-8')
message['To'] = Header('新用户', 'utf-8')
message['Subject'] = Header('账户注册成功通知', 'utf-8')

try:
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    server.login(username, password)
    server.sendmail(username, ['recipient@example.com'], message.as_string())
    server.quit()
    print("HTML邮件发送成功!")
except Exception as e:
    print(f"邮件发送失败: {str(e)}")
            

发送带附件的邮件

通过Python可以轻松发送包含附件的邮件,适合发送报告、文档和图片。

示例代码:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header
import os

# 邮件配置
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password'  # Gmail应用密码

# 创建多部分消息
message = MIMEMultipart()
message['From'] = Header('报告系统 <reports@example.com>', 'utf-8')
message['To'] = Header('经理', 'utf-8')
message['Subject'] = Header('月度销售报告', 'utf-8')

# 添加邮件正文
body = MIMEText('您好,请查收本月的销售报告。', 'plain', 'utf-8')
message.attach(body)

# 添加附件
file_path = 'monthly_report.pdf'
with open(file_path, 'rb') as f:
    attachment = MIMEApplication(f.read(), Name=os.path.basename(file_path))
    attachment['Content-Disposition'] = f'attachment; filename="{os.path.basename(file_path)}"'
    message.attach(attachment)

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # Gmail使用TLS加密
    server.login(username, password)
    server.sendmail(username, ['manager@example.com'], message.as_string())
    server.quit()
    print("带附件的邮件发送成功!")
except Exception as e:
    print(f"邮件发送失败: {str(e)}")
            

邮件发送最佳实践

安全性

  • 始终使用加密连接(SSL/TLS)
  • 不要将密码硬编码在代码中
  • 使用环境变量或配置文件存储敏感信息

错误处理

  • 使用try-except捕获异常
  • 添加重试机制
  • 记录邮件发送日志

性能优化

  • 重用SMTP连接发送多封邮件
  • 批量发送时使用多线程
  • 使用异步方式发送

总结

Python通过smtplib和email库提供了强大的邮件发送能力。无论是简单的文本通知,还是复杂的带附件HTML邮件,Python都能轻松应对。

在实际应用中,建议将邮件发送功能封装成独立模块或类,以便在整个项目中复用。

现在你已经掌握了Python邮件发送的核心技术,可以开始在你的项目中实现自动化邮件功能了!

发表评论