企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

使用Python程序自动发送邮件(python自动处理邮件)

wudianyun 2025-06-30 20:46:11 精选文章 7 ℃

大家好!本文将深入介绍如何使用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邮件功能,能为你的自动化工作流增添强大助力!无论是个人通知还是企业级应用,都可以通过灵活组合这些函数实现。如果在实践中遇到问题,欢迎在评论区留言,我们一起探索更多玩法!

最近发表
标签列表