01 准备工作
登录自己的邮箱,在设置中,打开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)是用来接收邮件的协议。
通过设置正确的邮箱地址和端口号,我们就可以成功收发邮件了。
02发送邮件程序用到的核心库与函数介绍
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('xxx@qq.com', 'password')
#创建ssl连接 填写ssl端口号
server = smtplib.smtp_ssl('smtp.qq.com', 465)
# 登录邮箱
server.login('xxx@qq.com', '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()03 附录
常用的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邮件功能,能为你的自动化工作流增添强大助力!无论是个人通知还是企业级应用,都可以通过灵活组合这些函数实现。
以上就是使用python程序自动发送邮件的完整流程的详细内容,更多关于python自动发送邮件的资料请关注代码网其它相关文章!
发表评论