你是否在寻找用Python实现SMTP邮件发送的完整代码

访客 网络编程 1

Python SMTP邮件发送完整指南:从零开始实现自动化邮件系统

目录导读

  1. SMTP邮件发送基础原理
  2. Python smtplib库核心用法
  3. 完整代码示例与参数详解
  4. 常见错误排查与安全配置
  5. 高级功能扩展:附件与HTML邮件
  6. 实战问答环节

SMTP邮件发送基础原理

SMTP(Simple Mail Transfer Protocol) 是互联网邮件传输的核心协议,当您使用Python发送邮件时,本质上是让程序扮演邮件客户端的角色,通过SMTP服务器将邮件投递到目标邮箱。

核心工作流程:

Python程序 → 连接SMTP服务器(587/465端口) → 身份认证 → 构建邮件内容 → 发送 → 断开连接

为什么选择Python实现?

  • 标准库内置smtplibemail模块
  • 支持TLS/SSL加密传输
  • 可批量发送、定制邮件头
  • 跨平台兼容性(Windows/Mac/Linux)

Python smtplib库核心用法

1 基础连接模式

import smtplib
# 创建SMTP对象(以QQ邮箱为例)
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls()  # 启用TLS加密
server.login('your_email@qq.com', '授权码')

关键参数解析:

  • SMTP服务器地址:不同邮箱服务商有独立地址(QQ:smtp.qq.com,163:smtp.163.com,Gmail:smtp.gmail.com)
  • 端口选择:587(TLS加密)或465(SSL加密)
  • 授权码:非邮箱密码,需在邮箱设置中生成(如QQ邮箱→设置→账户→POP3/SMTP服务→生成授权码)

2 邮件内容构建模块

from email.mime.text import MIMEText
from email.header import Header
# 构建纯文本邮件
msg = MIMEText('这是邮件正文内容', 'plain', 'utf-8')
msg['From'] = Header('发件人昵称', 'utf-8')
msg['To'] = Header('收件人昵称', 'utf-8')
msg['Subject'] = Header('邮件主题', 'utf-8')

完整代码示例与参数详解

1 最小可行性代码(复制即用)

import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email(sender, password, receiver, subject, body):
    # 1. 配置SMTP服务器信息
    smtp_server = "smtp.qq.com"
    smtp_port = 587
    # 2. 构建邮件内容
    message = MIMEText(body, 'plain', 'utf-8')
    message['From'] = Header(sender, 'utf-8')
    message['To'] = Header(receiver, 'utf-8')
    message['Subject'] = Header(subject, 'utf-8')
    try:
        # 3. 连接服务器并发送
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(sender, password)
        server.sendmail(sender, [receiver], message.as_string())
        server.quit()
        return True, "邮件发送成功!"
    except Exception as e:
        return False, f"发送失败:{str(e)}"
# 使用示例
success, info = send_email(
    sender="你的邮箱@qq.com",
    password="你的授权码",  # 非邮箱密码!
    receiver="目标邮箱@example.com",
    subject="Python测试邮件",
    body="这是一封来自Python自动发送的测试邮件。"
)
print(info)

2 参数最佳实践

参数 建议值 说明
smtp_server 根据邮箱服务商选择 163邮箱用smtp.163.com
password 32位授权码 非原始密码,含字母数字
receiver 单字符串或列表 字符串发送给单个,列表发送多个
subject 含关键字的标题 避免被判定为垃圾邮件

常见错误排查与安全配置

1 错误类型对照表

错误代码 原因 解决方案
535 Authentication failed 密码/授权码错误 检查授权码是否过期,重新生成
504 Authentication required 未开启SMTP服务 登录邮箱→设置→开启POP3/SMTP
TimeoutError 网络问题 检查防火墙是否开放587端口
554 内容被拒 减少特殊字符,优化邮件标题

2 安全配置黄金法则

# 避免明文存储密码(推荐方式)
import os
password = os.environ.get('EMAIL_PASSWORD')  # 从环境变量读取

重要提醒: 切勿将授权码直接硬编码在代码中,建议使用环境变量或加密配置文件存储。


高级功能扩展:附件与HTML邮件

1 发送HTML格式化邮件

from email.mime.multipart import MIMEMultipart
html_content = """
<html>
    <body>
        <h1>这是一封HTML邮件</h1>
        <p style="color: red;">红色文字示例</p>
        <a href="https://example.com">点击链接</a>
    </body>
</html>
"""
msg = MIMEMultipart('alternative')
msg.attach(MIMEText('纯文本备用内容', 'plain', 'utf-8'))  # 兼容不支持HTML的客户端
msg.attach(MIMEText(html_content, 'html', 'utf-8'))

2 添加附件(以PDF为例)

from email.mime.base import MIMEBase
from email import encoders
# 读取附件
with open('report.pdf', 'rb') as f:
    attachment = MIMEBase('application', 'octet-stream')
    attachment.set_payload(f.read())
    encoders.encode_base64(attachment)
    attachment.add_header(
        'Content-Disposition',
        'attachment',
        filename='report.pdf'
    )
    msg.attach(attachment)

实战问答环节

Q1:发送邮件时提示“535 Error: authentication failed”怎么办?

A: 这是最常见的错误,首先确认你使用的是邮箱授权码而非登录密码,以QQ邮箱为例:进入设置→账户→POP3/IMAP/SMTP服务→生成授权码,注意授权码通常是16-32位含字母数字的字符串,且需要定期更新。

Q2:为什么我发送的邮件总是进入垃圾箱?

A: 主要原因包括:包含敏感词汇(如“优惠”“免费”等) 2. 发件人域名未配置SPF/TXT记录
3. 发送频率过高(建议单次不超过50封,间隔300秒以上)使用全大写或过多感叹号

Q3:如何发送给多个收件人?

A: 修改sendmail方法的第二个参数为列表:

receivers = ['user1@example.com', 'user2@example.com']
server.sendmail(sender, receivers, msg.as_string())

Q4:Could not connect to SMTP host: smtp.qq.com, port: 587

A: 检查网络连通性:

# Windows命令
telnet smtp.qq.com 587
# Mac/Linux命令
nc -vz smtp.qq.com 587

若连接失败,可能是企业防火墙拦截或本地网络限制,可尝试更换端口465(SSL方式):

server = smtplib.SMTP_SSL('smtp.qq.com', 465)

Q5:如何发送带背景图片的邮件?

A: 使用HTML+CID(Content-ID)内嵌图片:

from email.mime.image import MIMEImage
msg = MIMEMultipart('related')
with open('logo.png', 'rb') as f:
    img = MIMEImage(f.read())
    img.add_header('Content-ID', '<image1>')
    msg.attach(img)
html = '<img src="cid:image1" />'
msg.attach(MIMEText(html, 'html'))

通过本文的完整代码示例和最佳实践,您已经掌握了使用Python实现SMTP邮件发送的核心技术,从基础连接到安全配置,从错误排查到高级功能扩展,每一步都经过实际验证,建议先使用自己的免费邮箱进行测试,成功后再应用到生产环境中,记住一个关键点:授权码是安全发送的基石,环境变量是代码安全的保障,开始构建您的自动化邮件系统吧!

标签: Python代码实现

抱歉,评论功能暂时关闭!