游乐游手机版
首页/编程语言/文章详情

使用Python程序自动发送邮件的完整流程

时间:2026-04-16 11:01
01 准备工作 使用Python程序自动发送邮件的第一步,是完成邮箱的客户端授权配置。这个过程并不复杂,核心在于开启SMTP POP3服务并获取一个专用的授权码。 首先,登录您的邮箱(例如QQ邮箱、163邮箱或126邮箱),进入“设置”或“账户”管理页面,找到“POP3 SMTP服务”或类似选项并将

01 准备工作

使用Python程序自动发送邮件的第一步,是完成邮箱的客户端授权配置。这个过程并不复杂,核心在于开启SMTP/POP3服务并获取一个专用的授权码。

首先,登录您的邮箱(例如QQ邮箱、163邮箱或126邮箱),进入“设置”或“账户”管理页面,找到“POP3/SMTP服务”或类似选项并将其开启。最关键的一步是:根据页面提示生成一个“授权码”。这个授权码将替代您的邮箱密码,作为程序登录验证的唯一凭证,请务必立即妥善保存,因为它通常只显示一次。

使用Python程序自动发送邮件的完整流程

使用Python程序自动发送邮件的完整流程

使用Python程序自动发送邮件的完整流程

以上图示分别展示了在QQ邮箱、126邮箱和163邮箱中开启相关服务的界面,不同邮箱的操作流程基本相似。

服务开启后,您的程序需要知道邮件服务器的地址(主机)和端口号才能建立连接。不同邮箱服务商的服务器信息略有不同,以下是常用邮箱的配置信息汇总:

163邮箱的服务器地址和端口配置如下:

使用Python程序自动发送邮件的完整流程

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中实现邮件自动发送,主要依赖于标准库中的 smtplibemail 模块。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():创建文本邮件

使用Python程序自动发送邮件的完整流程

这是最基础的类,用于创建纯文本或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自动发送邮件的功能。在此基础上,您可以进一步探索邮件模板定制、邮件列表群发、发送失败重试等更高级的应用场景。

来源:https://www.jb51.net/python/3622908wp.htm
上一篇Apache2配置中如何调整KeepAlive 下一篇Ubuntu中PHPStorm配置步骤是什么
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
深入解析 TransactionProxyFactoryBean 功能实现与实战案例
编程语言 · 2026-07-02

深入解析 TransactionProxyFactoryBean 功能实现与实战案例

本文通过一个订单处理系统的实际案例,探讨了Spring框架中TransactionProxyFactoryBean的功能实现。文章分析了其如何通过代理模式为普通JavaBean添加声明式事务管理能力,详细阐述了其配置方式、内部工作机制,包括如何创建AOP代理以及如何与PlatformTransactionManager协作。最后,通过对比现代基于注解的事务管

TransactionProxyFactoryBean 在 Java 编程中的应用与配置详解
编程语言 · 2026-07-02

TransactionProxyFactoryBean 在 Java 编程中的应用与配置详解

本文探讨了TransactionProxyFactoryBean在Spring框架中的应用,重点解析其作为声明式事务管理核心组件的工作原理。文章阐述了该工厂Bean如何通过AOP代理机制为目标对象自动添加事务边界,详细说明了其关键配置属性如事务管理器、事务属性及目标对象的设置方法,并分析了其内部代理创建流程。最后,讨论了其优势与在现代Spring应用中的演进

WebService实战案例详解与应用场景解析
编程语言 · 2026-07-02

WebService实战案例详解与应用场景解析

本文通过一个具体的订单查询案例,深入解析WebService的核心概念与实战应用。内容涵盖WebService的基本原理、使用Java和CXF框架构建服务端与客户端的完整步骤,以及XML数据绑定、服务发布与调用等关键技术细节。旨在为开发者提供清晰、实用的WebService开发指导,帮助理解其在实际项目中的集成与通信机制。

HttpClient与其他HTTP库性能功能对比分析
编程语言 · 2026-07-02

HttpClient与其他HTTP库性能功能对比分析

在Java开发中,处理HTTP请求有多种库可选,其中ApacheHttpClient以其成熟稳定著称。本文对比分析了HttpClient与其他主流HTTP库(如JDK原生HttpURLConnection、OkHttp、SpringRestTemplate及Retrofit)在功能特性、性能表现、易用性及适用场景上的差异,旨在帮助开发者根据项目需求,如对连接

MemSQL数据库实战应用案例深度解析
编程语言 · 2026-07-02

MemSQL数据库实战应用案例深度解析

本文探讨了MemSQL在实时分析场景中的实战应用。通过剖析一个典型的电商实时用户行为分析项目案例,阐述了MemSQL如何利用其混合事务 分析处理能力、内存优化与列式存储特性,高效处理高并发数据流与复杂查询。文章重点介绍了技术选型考量、架构设计、性能优化策略及实际效果,为面临类似实时数据处理挑战的项目提供参考。