网站首页 > 精选文章 正文
大家好!本文将深入介绍如何使用python自动发送邮件。
准备工作
登录自己的邮箱,在设置中,打开SMTP/POP3服务,并新增授权码(授权码个人保存好,后续邮件服务鉴权时会用到)
以上是qq邮箱,126邮箱和163邮箱在设置中打开服务的截图,供大家参考。
打开服务后,不同邮箱对应的服务地址和端口如下:
163邮箱的服务地址和端口如下:
126邮箱的SMTP服务器地址是smtp.126.com,POP3服务器地址为pop.126.com,imap.126.com;端口号同163邮箱地址
QQ邮箱的SMTP服务器地址是smtp.qq.com,端口号为587或465;POP3服务器地址为pop.qq.com,端口号为110或995;imap.qq.com,使用SSL,端口号143或993
SMTP(Simple Mail Transfer Protocol)是用来发送邮件的协议,而POP3(Post Office Protocol 3)是用来接收邮件的协议。
通过设置正确的邮箱地址和端口号,我们就可以成功收发邮件了。
一、发送邮件程序用到的核心库与函数介绍
Python主要通过smtplib(SMTP协议客户端)和email(邮件内容构建)两大库实现邮件发送功能,核心函数功能如下:
1. smtplib.SMTP():创建SMTP连接
- 功能:建立与邮件服务器的连接,支持TLS/SSL 加密。
- 参数:host:邮件服务器地址(如smtp.qq.com)port:端口号
- 案例:连接QQ邮箱服务器
import smtplib
# 创建普通连接
server = smtplib.SMTP('smtp.qq.com', 587)
# 启动TLS加密
server.starttls()
# 登录邮箱
server.login('your_email@qq.com', 'your_app_password')
#创建SSL连接 填写SSL端口号
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
server.login('your_email@qq.com', 'your_app_password')
注意:部分邮箱需使用授权码代替密码登录,如QQ邮箱需在设置中开启 “POP3/SMTP 服务” 获取授权码。
2. email.mime模块:构建邮件内容
1)email.mime.text.MIMEText():创建文本邮件
参数介绍
- _text: 用于指定邮件的正文内容,可以是字符串形式的纯文本或 HTML 代码。
- _subtype='plain' :表示文本类型。 'plain' : 代表纯文本 ;'html': 代表html内容
- _charset=None:表示邮件内容的字符编码,默认是ascii,可自己传入utf8等。
- policy=None:policy参数可以接收email.policy模块中定义的不同策略对象,用于指定如何解析邮件内容、处理头部信息、格式化输出等。默认为email.policy.compat32,全部内容为['Compat32','compat32','Policy','EmailPolicy','default','strict','SMTP','HTTP'],具体介绍参考附录中的‘常用的policy策略’介绍。
from email.mime.text import MIMEText
# 创建纯文本邮件内容
text = "这是一封测试邮件!"
msg = MIMEText(text, 'plain', 'utf-8')
# 创建HTML邮件内容
html = """
<html>
<body>
<h1>欢迎订阅周报</h1>
<p>本周热点:...</p>
</body>
</html>
"""
msg = MIMEText(html, 'html')
2)email.mime.multipart.MIMEMultipart():创建多格式邮件(支持附件)
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 创建多格式
msg = MIMEMultipart()
#通过attach函数 添加纯文本内容MIMEText
msg.attach(MIMEText("邮件正文", 'plain', 'utf-8'))
# 通过MIMEApplication添加附件test.xlsx
with open('test.xlsx', 'rb') as f:
part = MIMEApplication(f.read(), Name='test.xlsx')
#设置附件名字
part['Content-Disposition'] = f'attachment; filename="test.xlsx"'
#通过attach函数 添加附件MIMEApplication
msg.attach(part)
3. 邮件头部设置
- msg['Subject']:设置邮件主题
- msg['From']:发件人邮箱
- msg['To']:收件人邮箱(支持多个收件人,用逗号分隔)
4. server.sendmail():发送邮件
- 功能:将构建好的邮件发送给收件人。
- 参数:from_addr:发件人邮箱
to_addrs:收件人邮箱列表
msg.as_string():将邮件对象转换为字符串格式
- 案例:发送邮件
# 假设已创建msg邮件对象
server.sendmail('xx@xxx.com', ['xx1@xxx.com','xx2@xxx.com'], msg.as_string())
server.quit()
5、实际案例
案例 1:发送纯文本邮件
import smtplib
from email.mime.text import MIMEText
# 创建连接
server = smtplib.SMTP('smtp.126.com', 25)
# 启动TLS加密
server.starttls()
# 登录邮箱
server.login('xxx1@xxx.com', 'xxxx')
# 创建纯文本邮件内容
text = "这是一封测试邮件!"
msg = MIMEText(text, 'plain', 'utf-8')
msg['Subject'] = text
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#发送msg邮件对象
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
实际使用中大家替换为自己的发件人邮箱和对方邮箱地址。
案例 2:发送带HTML格式的邮件
import smtplib
from email.mime.text import MIMEText
# 创建连接
server = smtplib.SMTP('smtp.126.com', 25)
# 启动TLS加密
server.starttls()
# 登录邮箱
server.login('xxx1@xxx.com', 'xxxx')
# 创建纯文本邮件内容
html = """
<html>
<body>
<h1>欢迎订阅周报</h1>
<p>本周热点:...</p>
</body>
</html>
"""
msg = MIMEText(html, 'html', 'utf-8')
msg['Subject'] = 'test'
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#发送msg邮件对象
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)
# 启动TLS加密
server.starttls()
# 登录邮箱
server.login('xxx1@xxx.com', 'xxxx')
# 创建多格式
msg = MIMEMultipart()
msg['Subject'] = text
msg['From'] = 'xxx1@xxx.com'
msg['To'] = 'xx1@xx.com,xx2@xx.com'
#通过attach函数 添加纯文本内容MIMEText
msg.attach(MIMEText("邮件正文", 'plain', 'utf-8'))
# 通过MIMEApplication添加附件test.xlsx
with open('test.xlsx', 'rb') as f:
part = MIMEApplication(f.read(), Name='test.xlsx')
#设置附件名字
part['Content-Disposition'] = f'attachment; filename="test.xlsx"'
#通过attach函数 添加附件MIMEApplication
msg.attach(part)
#发送msg邮件对象
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
二、附录
常用的policy策略
1.email.policy.default
- 功能:默认策略,提供了较为通用的邮件处理方式。在解析邮件时,它会保留邮件头部字段的原始大小写,并使用系统默认的编码方式进行处理。
- 适用场景:适用于大多数常规的邮件处理需求,不需要对邮件解析和构造进行特殊定制的场景。
2.email.policy.SMTP
- 功能:遵循 SMTP 协议标准的策略。该策略会将邮件头部字段转换为大写,符合 SMTP 协议中对头部字段的规范要求 ,并且在处理邮件内容时,会按照 SMTP 协议的规则进行编码和换行处理。
- 适用场景:当需要严格遵循 SMTP 协议标准来发送或解析邮件时使用,例如与其他遵循 SMTP 协议的邮件服务器进行交互。
3.email.policy.compat32
- 功能:为了兼容 Python 3.2 及以前版本的邮件处理方式而设计的策略。它会将邮件头部字段转换为大写,并对邮件内容进行一些兼容性的处理,以保持与旧版本的一致性。
- 适用场景:在需要与使用旧版 Python 邮件处理逻辑的系统进行交互,或者需要保证代码在不同 Python 版本下行为一致时使用。
4.email.policy.SMTPUTF8
- 功能:在SMTP策略的基础上,支持 UTF-8 编码的邮件内容。它会正确处理包含非 ASCII 字符的邮件头部和正文,确保在 SMTP 传输过程中不会出现编码错误。
- 适用场景:当邮件内容包含多种语言文字、特殊字符,需要在 SMTP 传输中保证编码正确性时使用。
掌握Python邮件功能,能为你的自动化工作流增添强大助力!无论是个人通知还是企业级应用,都可以通过灵活组合这些函数实现。如果在实践中遇到问题,欢迎在评论区留言,我们一起探索更多玩法!
猜你喜欢
- 2025-06-30 发垃圾邮件最害怕的是什么?(发垃圾邮件违法吗)
- 2025-06-30 快评丨东北学生热得在楼道操场打地铺,学校装空调究竟有多难?
- 2025-06-30 不要信!合肥已有考生上当(合肥报考)
- 2025-06-30 分享一个临时的谷歌邮箱,保护隐私亲测好用
- 2025-06-30 没有一点点防备,QQ突然大更新(为什么qq更新了没有更新功能)
- 2025-06-30 iDRAC9配置邮箱接收报警信息(idrac邮件报警)
- 2025-06-30 邀请国外嘉宾参会?这些关键点你一定不能忽视!
- 2025-06-30 SpringBoot扩展——发送邮件!(springboot 发送post请求)
- 2025-06-30 python入门到脱坑经典案例:邮件发送
- 2025-06-30 她点开“期刊网站”被骗走3000!教你如何3秒识别仿冒网站
- 07-03CentOS7系统如何修改主机名(更改centos主机名)
- 07-03Ubuntu1804 及以上版本的 Coredump 相关设置
- 07-03Linux中如何修改ip地址?(linux系统怎么更改ip地址)
- 07-03Linux系统日常运维九大核心技能(linux运维都干什么)
- 07-03Linux 日志管理攻略:用 journalctl 揪出服务器安全隐患
- 07-03Linux下快速安装ollama和deepseek并使用web界面
- 07-03RockyLinux9.5下使用ollama搭建本地AI大模型DeepSeek
- 07-03Linux 下的 PM2 完整指南(linux /media)
- 最近发表
-
- CentOS7系统如何修改主机名(更改centos主机名)
- Ubuntu1804 及以上版本的 Coredump 相关设置
- Linux中如何修改ip地址?(linux系统怎么更改ip地址)
- Linux系统日常运维九大核心技能(linux运维都干什么)
- Linux 日志管理攻略:用 journalctl 揪出服务器安全隐患
- Linux下快速安装ollama和deepseek并使用web界面
- RockyLinux9.5下使用ollama搭建本地AI大模型DeepSeek
- Linux 下的 PM2 完整指南(linux /media)
- Rocky Linux 9常用命令备忘录(不定时更新)
- Rocky Linux 9 系统初始化与安全加固脚本
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)