使用Python程序自动发送邮件的完整流程
01 准备工作
使用Python程序自动发送邮件的第一步,是完成邮箱的客户端授权配置。这个过程并不复杂,核心在于开启SMTP/POP3服务并获取一个专用的授权码。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
首先,登录您的邮箱(例如QQ邮箱、163邮箱或126邮箱),进入“设置”或“账户”管理页面,找到“POP3/SMTP服务”或类似选项并将其开启。最关键的一步是:根据页面提示生成一个“授权码”。这个授权码将替代您的邮箱密码,作为程序登录验证的唯一凭证,请务必立即妥善保存,因为它通常只显示一次。



以上图示分别展示了在QQ邮箱、126邮箱和163邮箱中开启相关服务的界面,不同邮箱的操作流程基本相似。
服务开启后,您的程序需要知道邮件服务器的地址(主机)和端口号才能建立连接。不同邮箱服务商的服务器信息略有不同,以下是常用邮箱的配置信息汇总:
163邮箱的服务器地址和端口配置如下:

126邮箱的配置:其SMTP服务器地址为 smtp.126.com,POP3服务器地址为 pop.126.com,常用端口号与163邮箱一致。
QQ邮箱的配置:SMTP服务器地址是 smtp.qq.com,常用端口为587(STARTTLS)或465(SSL);POP3服务器地址为 pop.qq.com,端口为110或995。
简单来说,SMTP(简单邮件传输协议)专门负责“发送”邮件,而POP3(邮局协议第3版)则负责“接收”邮件。本文重点讲解邮件发送,因此请牢记您所用邮箱的SMTP服务器地址和对应端口。
正确配置这些连接参数,是确保Python脚本能够与邮件服务器成功“握手”并顺利发送邮件的基础。
02 发送邮件程序用到的核心库与函数介绍
在Python中实现邮件自动发送,主要依赖于标准库中的 smtplib 和 email 模块。smtplib 负责与邮件服务器建立连接并进行通信,email 则负责构建和格式化邮件内容。下面详细介绍其中的核心类与函数。
1. smtplib.SMTP():创建SMTP连接
- 功能:此函数用于初始化一个SMTP客户端连接对象,连接到指定的邮件服务器。它支持通过TLS/SSL加密通信,保障登录凭据和邮件内容传输的安全性。
- 参数:主要参数为
host(邮件服务器主机名,如smtp.qq.com)和port(端口号)。 - 案例:以连接QQ邮箱服务器为例,通常有两种连接方式:
import smtplib
# 方式一:先建立非加密连接,再升级为TLS加密(常用于端口587)
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls() # 启动TLS加密
server.login('xxx@qq.com', '你的授权码或密码')
# 方式二:直接建立SSL加密连接(常用于端口465)
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
server.login('xxx@qq.com', '你的授权码或密码')
重要提示:目前主流邮箱服务(如QQ邮箱、163邮箱等)出于安全考虑,均要求使用授权码而非邮箱登录密码进行第三方客户端登录。请务必使用您在准备阶段获取的授权码。
2. email.mime模块:构建邮件内容
建立连接后,需要构造邮件体。email.mime 子模块提供了多种MIME(多用途互联网邮件扩展)类型类,用于创建不同格式的邮件内容。
1)email.mime.text.MIMEText():创建文本邮件

这是最基础的类,用于创建纯文本或HTML格式的邮件正文。其核心参数决定了邮件内容的呈现方式:
_text: 邮件正文内容,可以是普通字符串或HTML代码字符串。_subtype='plain':内容子类型。设置为'plain'表示纯文本邮件;设置为'html'则表示HTML格式邮件。_charset='utf-8':字符编码集。为确保中文等非ASCII字符正常显示,强烈建议设置为utf-8。policy:此参数用于控制邮件生成和解析的策略细节,如头部格式、编码方式等。对于大多数应用场景,使用默认策略即可。高级用法可参考附录的详细说明。
from email.mime.text import MIMEText # 创建纯文本邮件内容 text = "这是一封测试邮件!" msg = MIMEText(text, 'plain', 'utf-8') # 创建HTML格式邮件内容 html = """欢迎订阅周报
本周热点:...
""" msg = MIMEText(html, 'html', 'utf-8')
2)email.mime.multipart.MIMEMultipart():创建多格式邮件(支持附件)
当需要发送同时包含正文和附件的邮件时,需要使用 MIMEMultipart 类。它作为一个容器,可以容纳多个MIME部件,例如文本、图片、文件等。
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 创建一个多部分邮件容器
msg = MIMEMultipart()
# 向容器中添加文本部件
msg.attach(MIMEText("这里是邮件正文", 'plain', 'utf-8'))
# 添加附件,例如一个Excel文件
with open('月度报告.xlsx', 'rb') as f: # 以二进制模式读取文件
part = MIMEApplication(f.read(), Name='月度报告.xlsx')
# 设置内容处置头,指示此为附件并指定文件名
part['Content-Disposition'] = f'attachment; filename="月度报告.xlsx"'
msg.attach(part)
3. 邮件头部设置
邮件内容构建完成后,需要设置其头部信息,如同填写快递单。通过为邮件对象(msg)的字典属性赋值即可完成:
msg['Subject'] = '会议通知':设置邮件主题。msg['From'] = 'your_email@example.com':设置发件人地址。msg['To'] = 'friend1@xx.com, friend2@xx.com':设置收件人地址,多个地址可用逗号分隔。
4. server.sendmail():发送邮件
功能:此方法执行最终的邮件发送操作,将构建好的邮件对象传输至服务器。
参数:from_addr:发件人邮箱地址;to_addrs:收件人邮箱地址列表(字符串或列表);msg.as_string():将邮件对象序列化为符合SMTP协议格式的字符串。
案例:完整的发送流程示例
# 假设msg邮件对象已构建并设置好头部
server.sendmail('sender@xxx.com', ['receiver1@xxx.com', 'receiver2@xxx.com'], msg.as_string())
server.quit() # 发送完成后,关闭连接
5、实际案例
掌握理论后,通过实际代码案例能更好地理解应用。以下三个案例涵盖了最常见的邮件发送需求。
案例 1:发送纯文本邮件
import smtplib
from email.mime.text import MIMEText
# 1. 连接服务器 (以126邮箱为例,使用端口25)
server = smtplib.SMTP('smtp.126.com', 25)
server.starttls() # 启用TLS加密
server.login('your_email@126.com', '你的授权码') # 使用授权码登录
# 2. 构建纯文本邮件
text = "这是一封纯文本测试邮件!"
msg = MIMEText(text, 'plain', 'utf-8')
msg['Subject'] = '测试主题'
msg['From'] = 'your_email@126.com'
msg['To'] = 'recipient1@xx.com, recipient2@xx.com'
# 3. 执行发送
server.sendmail(msg['From'], msg['To'].split(','), msg.as_string())
server.quit()
print("纯文本邮件发送成功!")
请务必将代码中的发件人邮箱、收件人邮箱和授权码替换为您自己的有效信息。
案例 2:发送带HTML格式的邮件
import smtplib
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.126.com', 25)
server.starttls()
server.login('your_email@126.com', '你的授权码')
# 关键区别:_subtype 参数设置为 'html'
html_content = """
本周技术周报
最新动态:Python 3.12 发布...
点击查看详情
"""
msg = MIMEText(html_content, 'html', 'utf-8') # 注意第二个参数
msg['Subject'] = 'HTML格式周报'
msg['From'] = 'your_email@126.com'
msg['To'] = 'recipient@xx.com'
server.sendmail(msg['From'], [msg['To']], msg.as_string())
server.quit()
案例 3:发送带附件的邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
server = smtplib.SMTP('smtp.126.com', 25)
server.starttls()
server.login('your_email@126.com', '你的授权码')
# 使用 MIMEMultipart 作为根容器
msg = MIMEMultipart()
msg['Subject'] = '月度数据报告'
msg['From'] = 'your_email@126.com'
msg['To'] = 'recipient@xx.com'
# 添加文本正文部分
msg.attach(MIMEText("您好,附件是本月数据报告,请查收。", 'plain', 'utf-8'))
# 添加附件部分
filename = 'monthly_report.pdf'
with open(filename, 'rb') as f:
part = MIMEApplication(f.read(), Name=filename)
part['Content-Disposition'] = f'attachment; filename="{filename}"'
msg.attach(part)
server.sendmail(msg['From'], [msg['To']], msg.as_string())
server.quit()
03 附录
常用的policy策略
在构建邮件对象时,policy 参数扮演着“策略控制器”的角色,它精细地管理着邮件格式、编码和兼容性等底层细节。了解不同策略有助于应对特定场景。
1. email.policy.default
功能:这是默认策略,遵循通用的电子邮件标准。它会保留邮件头原始的大小写格式,并使用系统默认的编码方式,适用于绝大多数常规邮件发送任务。
适用场景:日常的自动化邮件发送,无需特殊处理时,使用此策略即可。
2. email.policy.SMTP
功能:一个严格遵守SMTP协议的策略。它会将邮件头字段名转换为大写,并严格遵循协议规范处理编码和换行符。
适用场景:当需要与对协议格式要求极其严格的邮件服务器或网关进行交互时,采用此策略可以最大程度避免兼容性问题。
3. email.policy.compat32
功能:一个向后兼容的策略,旨在保持与Python 3.2及更早版本中 email 模块处理逻辑的一致性。
适用场景:如果你的代码运行环境或与之交互的系统依赖于旧版Python的邮件处理行为,可考虑使用此策略以确保一致性。
4. email.policy.SMTPUTF8
功能:在 SMTP 策略基础上扩展,专门支持SMTPUTF8扩展,允许在邮件头(如主题、发件人名称)中直接使用UTF-8编码的字符。
适用场景:发送包含中文、日文、表情符号(emoji)等非ASCII字符的邮件主题或发件人名称时,使用此策略能有效防止出现乱码。
总而言之,掌握Python邮件发送技术,就如同为您的自动化工作流配备了一把多功能工具。无论是实现系统监控告警、定时发送业务报表、批量投递营销信息,还是将其作为数据爬取或分析脚本的结果推送渠道,都能显著提升工作效率。
希望这份从环境配置、库函数解析到实战案例的完整指南,能帮助您快速上手并实现Python自动发送邮件的功能。在此基础上,您可以进一步探索邮件模板定制、邮件列表群发、发送失败重试等更高级的应用场景。
相关攻略
Python连接MySQL驱动安装指南:直接装mysql-connector-python,别用mysql-connector 在Python项目中配置MySQL数据库连接,第一步选择正确的驱动包至关重要。许多开发者首次尝试时就会遇到安装失败或连接报错的问题。请牢记这个核心解决方案:务必直接安装 m
1 场景案例:Python大文件处理 去年遇到一个数据清洗任务,日志文件足足有12GB。同事的第一反应很直接:用readlines()把文件全部读进内存,再逐条处理。结果程序跑了三分钟,直接报了个MemoryError。 其实只改了一个地方:把readlines()换成直接遍历文件对象。就这么一个
01 准备工作 使用Python程序自动发送邮件的第一步,是完成邮箱的客户端授权配置。这个过程并不复杂,核心在于开启SMTP POP3服务并获取一个专用的授权码。 首先,登录您的邮箱(例如QQ邮箱、163邮箱或126邮箱),进入“设置”或“账户”管理页面,找到“POP3 SMTP服务”或类似选项并将
Python 3与Python 2:那些你必须了解的关键演变 在软件开发、数据科学以及人工智能等前沿领域,Python语言占据着举足轻重的地位。伴随着语言的持续演进,从Python 2升级到Python 3是一次里程碑式的重大变革。尽管两者在语法上存在继承关系,但诸多核心差异深刻影响着代码的兼容性与
Pywinrm:打通跨平台管理的最后一公里 在混合IT环境里,Linux机器想管Windows服务器,这事儿一直挺让人头疼的。你猜怎么着?当SSH够不着Windows,PowerShell Remoting又没个统一的Python接口时,pywinrm模块就登场了。它通过Windows远程管理(Wi
热门专题
热门推荐
云顶之弈S17星神赛季:重装妖姬阵容深度解析与上分攻略 云顶之弈S17“星神”赛季现已全面开启,全新羁绊、英雄与赛季机制为战场带来了颠覆性的变化。在众多阵容套路中,一套以“诡术妖姬”乐芙兰为主C,搭配重装战士与法官羁绊的体系表现尤为亮眼,成为当前版本稳定上分的强力选择。本文将为您深度解析这套重装妖姬
微软1月更新KB5074109新BUG:云存储文件导致OneDrive等应用卡死 近日,微软Windows用户遭遇了一个普遍困扰。1月20日,微软在其官方Windows发布健康仪表板上更新了状态,正式确认了1月累积更新KB5074109中存在一个影响广泛的缺陷。该问题波及了从Windows 10到W
在Linux系统管理中,Systemctl被誉为服务管理的“全能指挥官”。无论是启动核心服务、监控运行状态,还是进行系统故障排查,它都是管理员必备的利器。本文将深入解析如何利用Systemctl命令全面查看系统所有服务,并掌握高效管理技巧。 什么是 Systemctl? Systemctl是syst
苹果macOS 26 4开发者预览版 Beta 2发布:修复窗口缩小指针不跟随问题 苹果公司如期发布了面向Mac用户的macOS 26 4第二个开发者预览版(Beta 2),内部版本号为25E5218f。此次更新距离上一个Beta RC版本发布正好一周,延续了苹果系统更新的稳定节奏。 如何升级 iO
《亿万光年》:从舰船养成到战场微操,一份深度编队指南 在《亿万光年》的浩瀚星海中,想要成为一位合格的星际指挥官,核心秘诀无外乎两点:扎实的舰船养成与灵活的编队搭配,再辅以关键时刻的战场微操。这套组合拳,是应对宇宙中各种复杂战局的不二法门。今天,我们就来深入拆解这套玩法体系,助你打造一支所向披靡的无敌





