当前位置:

首页 > 编程开发 > Python用smtplib发邮件的完整步骤

Python用smtplib发邮件的完整步骤

邮件发送失败常见原因包括:未使用邮箱授权码而直接使用登录密码;SMTP服务器地址或端口配置错误(如QQ邮箱应使用smtp.qq.com:465用于SSL);网络或防火墙限制导致无法连接;邮件内容被识别为垃圾邮件;邮箱地址拼写错误。2.发送带附件或HTML内容的邮件需使用email模块的MIME组件:HTML内容通过MIMEText(content,'html','utf-8')实现;附件需读取为二进制数据,用MIMEBase封装并Base64编码,再通过Content-Disposition头设置为附件。

邮件发送失败常见原因包括:未使用邮箱授权码而直接使用登录密码;SMTP服务器地址或端口配置错误(如QQ邮箱应使用smtp.qq.com:465用于SSL);网络或防火墙限制导致无法连接;邮件内容被识别为垃圾邮件;邮箱地址拼写错误。2. 发送带附件或HTML内容的邮件需使用email模块的MIME组件:HTML内容通过MIMEText(content, 'html', 'utf-8')实现;附件需读取为二进制数据,用MIMEBase封装并Base64编码,再通过Content-Disposition头设置为附件。3. 大批量发送邮件时应避免使用个人邮箱SMTP服务,因其有频率和数量限制,易被封禁;建议采用专业邮件服务如SendGrid、阿里云邮件推送等以提高送达率;若自行发送,需控制频率、添加异常重试机制、记录日志并安全存储授权码(如使用环境变量)。使用Python发送电子邮件的核心是smtplib与email模块协同工作,遵循此流程可实现稳定高效的邮件发送功能。

Python如何发送电子邮件?smtplib模块完整流程

使用Python发送电子邮件,核心在于利用其内置的smtplib模块来与邮件服务器进行通信,以及email模块来构建符合MIME标准的邮件内容。简单来说,就是通过代码模拟一个邮件客户端的行为:连接到服务器、登录、然后把准备好的邮件内容“投递”出去。这听起来有点像在邮局寄信,smtplib是邮递员,email模块则帮你把信封、信纸、照片(附件)都整理得妥妥当当。

解决方案

要用Python发送电子邮件,我们通常会经历以下几个步骤,这基本上是一个标准流程:

  1. 导入必要的模块:smtplib负责连接和发送,email.mime.text.MIMEText用于纯文本或HTML内容,email.mime.multipart.MIMEMultipart用于组合多部分邮件(如文本+附件),而email.mime.base.MIMEBase和email.encoders则用于处理附件。
  2. 配置邮件信息:包括发件人邮箱、收件人邮箱、邮件主题、邮件正文,以及SMTP服务器地址和端口。特别要注意的是,很多主流邮箱服务(如QQ邮箱、163邮箱、Gmail等)出于安全考虑,不再允许你直接使用登录密码进行SMTP认证,而是需要生成一个“授权码”或“应用专用密码”。这往往是新手最容易踩的坑。
  3. 构建邮件内容:使用MIMEMultipart对象作为邮件的“容器”,然后将文本、HTML内容(如果需要)或附件作为子部分添加到这个容器中。
  4. 建立SMTP连接:根据邮件服务器的要求,选择smtplib.SMTP_SSL(推荐,端口通常是465)进行SSL加密连接,或者smtplib.SMTP配合starttls()(端口通常是587)进行TLS加密。
  5. 登录邮件服务器:使用发件人邮箱和前面提到的授权码进行身份验证。
  6. 发送邮件:调用send_message()或sendmail()方法发送邮件。
  7. 关闭连接:发送完成后,记得调用quit()方法断开与服务器的连接,释放资源。

这是一个简单的代码示例,展示了如何发送一封纯文本邮件:

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

# --- 邮件配置信息 ---
sender_email = 'your_email@example.com'  # 发件人邮箱
sender_password = 'your_app_password'    # 发件人邮箱的授权码或应用专用密码
receiver_email = 'recipient@example.com' # 收件人邮箱
smtp_server = 'smtp.example.com'         # SMTP服务器地址 (例如:smtp.qq.com, smtp.163.com, smtp.gmail.com)
smtp_port = 465                          # SMTP服务器端口 (SSL通常是465,TLS通常是587)

# --- 构建邮件内容 ---
msg = MIMEMultipart()
msg['From'] = Header("发件人昵称", 'utf-8')
msg['To'] = Header("收件人昵称", 'utf-8')
msg['Subject'] = Header("Python邮件测试", 'utf-8')

# 邮件正文
mail_content = """
你好!

这是一封通过Python smtplib模块发送的测试邮件。
希望你能收到!

此致
敬礼
你的Python脚本
"""
msg.attach(MIMEText(mail_content, 'plain', 'utf-8'))

try:
    # --- 建立SMTP连接并发送邮件 ---
    # 对于SSL连接,使用SMTP_SSL
    server = smtplib.SMTP_SSL(smtp_server, smtp_port)
    # 如果是SMTP并需要starttls,则:
    # server = smtplib.SMTP(smtp_server, smtp_port)
    # server.ehlo()
    # server.starttls()
    # server.ehlo()

    server.login(sender_email, sender_password)
    server.send_message(msg) # 或者 server.sendmail(sender_email, receiver_email, msg.as_string())
    print("邮件发送成功!")

except smtplib.SMTPException as e:
    print(f"邮件发送失败: {e}")
except Exception as e:
    print(f"发生未知错误: {e}")
finally:
    if 'server' in locals() and server:
        server.quit()

为什么我的邮件总是发送失败?常见问题与排查

我刚开始接触Python邮件发送时,最头疼的就是邮件总是发不出去,报错信息也看得云里雾里。后来才发现,这其中有不少“坑”,但大部分都有迹可循。

一个最常见的问题就是授权码(或应用专用密码)的使用。很多邮箱服务,比如QQ邮箱、163邮箱、Gmail,为了账户安全,不允许第三方应用直接使用你的登录密码进行SMTP认证。你需要登录邮箱的网页版设置,找到“POP3/IMAP/SMTP服务”或者“客户端授权码”相关的选项,生成一个专门用于第三方客户端的授权码。这个授权码就是你在Python脚本里server.login()时要用的“密码”,而不是你平时登录邮箱的密码。这真是个让人头疼但又不得不面对的现实。

其次,SMTP服务器地址和端口配置错误也是常犯的错误。不同的邮箱服务商有不同的SMTP服务器地址(比如QQ邮箱是smtp.qq.com,163邮箱是smtp.163.com,Gmail是smtp.gmail.com)。端口也分两种主流:SSL加密通常用465,TLS加密通常用587。如果你选错了端口或者加密方式,连接自然会失败。有时候,你的网络环境或者防火墙也可能阻碍你连接到这些端口。

还有,发件人邮箱或收件人邮箱地址拼写错误,或者邮件内容被邮件服务商判定为垃圾邮件。后者尤其需要注意,如果你的邮件主题或内容过于简单、包含敏感词汇、或者发送频率过高,很可能直接被服务器拒绝或者被收件箱直接扔进垃圾箱。排查这类问题,可以先尝试发送一封最简单的纯文本邮件给自己,如果成功了,再逐步增加复杂性。

如何发送带附件、HTML内容的邮件?MIME的妙用

发送带附件或者HTML内容的邮件,就得请出email模块的MIME(Multipurpose Internet Mail Extensions)家族了。MIME这东西,听起来很技术,但其实就是个“打包盒”,它规定了邮件内容的各种类型和编码方式,让邮件客户端能够正确地解析和显示邮件。

要发送HTML内容的邮件,你只需要把MIMEText的第二个参数从'plain'改成'html'就行了。比如:MIMEText(html_content, 'html', 'utf-8')。

而附件的处理则稍微复杂一些,但原理都是把附件文件读取成二进制数据,然后进行Base64编码,再封装成一个MIMEBase对象,最后添加到MIMEMultipart这个“主容器”里。你需要指定附件的文件名、MIME类型(比如图片是image/jpeg,PDF是application/pdf),以及一个Content-Disposition头,告诉邮件客户端这是一个附件。

import os
from email.mime.base import MIMEBase
from email import encoders

# ... (前面的邮件配置和MIMEMultipart初始化代码不变) ...

# 添加HTML内容
html_content = """


    

你好!

这是一封HTML格式的邮件,来自Python脚本。

希望你喜欢!

Python Logo """ msg.attach(MIMEText(html_content, 'html', 'utf-8')) # 添加附件 (以一个图片文件为例) # 假设当前目录下有一个 'example.png' 文件 file_path = 'example.png' if os.path.exists(file_path): part = MIMEBase('application', 'octet-stream') # 通用二进制类型 with open(file_path, 'rb') as file: part.set_payload(file.read()) encoders.encode_base64(part) # 进行Base64编码 # 设置附件的文件名,确保中文文件名显示正常 encoded_filename = Header(os.path.basename(file_path), 'utf-8').encode() part.add_header('Content-Disposition', 'attachment', filename=encoded_filename) msg.attach(part) else: print(f"警告:附件文件 '{file_path}' 不存在,将不发送附件。") # 如果HTML中包含内联图片(cid:image1.png),需要单独添加 # from email.mime.image import MIMEImage # with open('image1.png', 'rb') as img_file: # msg_image = MIMEImage(img_file.read()) # msg_image.add_header('Content-ID', '') # 这里的ID要和HTML中的src="cid:..."对应 # msg.attach(msg_image) # ... (后面的SMTP连接和发送代码不变) ...

通过MIMEMultipart,你可以把文本、HTML、各种附件像搭积木一样组合起来,非常灵活。

大批量发送邮件需要注意什么?安全与效率考量

如果你需要通过Python发送大量的邮件,比如产品通知、营销邮件或者系统警报,那么使用个人邮箱的SMTP服务直接发送,很快就会遇到瓶颈,甚至可能导致你的邮箱被服务商暂时封禁。我之前有个项目需要发大量通知,一开始想着用自己的邮箱硬扛,结果没发几封就被封了。后来才意识到,专业的事还得专业工具来办。

首先,个人邮箱的SMTP服务通常有严格的发送频率和数量限制。你不可能指望通过一个个人邮箱一天发送几万封邮件。一旦触发了这些限制,你的邮件可能会被退回,甚至你的账户可能会被标记为垃圾邮件发送者。

其次,邮件送达率是个大问题。自己发送的邮件,很可能被收件方的垃圾邮件过滤器拦截,最终根本到不了用户的收件箱。专业的邮件服务提供商(ESP,Email Service Provider),比如SendGrid、Mailgun、或者国内的腾讯邮件推送、阿里云邮件推送等,它们有专门的IP信誉管理、反垃圾邮件机制和投递优化技术,能大大提高邮件的送达率。虽然它们通常是付费服务,但对于商业或大规模应用来说,这是非常值得的投资。

如果你确实需要自己处理,并且量不大,那么有几个点可以考虑:

  • 控制发送频率:在发送每封邮件之间加入适当的time.sleep(),避免短时间内发送大量邮件。
  • 异常处理和重试机制:网络波动、服务器临时故障都可能导致发送失败。为你的发送逻辑加上健壮的try-except块,并在失败时考虑重试几次。
  • 日志记录:记录每封邮件的发送状态,包括成功、失败原因等,方便后续排查问题。
  • 安全存储凭证:不要将你的邮箱授权码直接写死在代码里,尤其是在公共代码库中。考虑使用环境变量、配置文件或更安全的密钥管理服务来存储这些敏感信息。

总之,对于小规模的通知或个人使用,smtplib已经足够强大。但一旦涉及到“大批量”这个词,就得认真考虑专业的邮件服务了,它们不仅能解决发送效率和送达率的问题,还能提供详细的发送报告和统计分析,这些都是自己搭建无法比拟的优势。

本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发 Python Python编程
相关文章 更多
解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

PHP递归性能优化技巧与迭代替代方案
PHP递归性能优化技巧与迭代替代方案

解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

Java测试中怎么使用Mockito模拟依赖对象
Java测试中怎么使用Mockito模拟依赖对象

详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

链表删除节点的时间复杂度是多少及其详细分析
链表删除节点的时间复杂度是多少及其详细分析

详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

codex如何配置模型参数及文件设置教程
codex如何配置模型参数及文件设置教程

想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

Claude Code AI编程工具实力揭秘与编程助手实测
Claude Code AI编程工具实力揭秘与编程助手实测

通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

winforms教程自学入门与基础开发步骤详解
winforms教程自学入门与基础开发步骤详解

本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

Cursor自动补全设置教程教你快速开启代码补全功能
Cursor自动补全设置教程教你快速开启代码补全功能

详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

pandas的数据格式怎么转换和设置方法教程
pandas的数据格式怎么转换和设置方法教程

详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。