最近在编写接口自动化测试平台,其中用到了自动发送邮件的功能,查询相关资料,最成熟、使用量最大的还是smtplib库,调试过程中也遇到了一些坑,现在做些简单整理:调试的邮件发送功能基于SMTP(Simple Mail Transfer Protocol,SMTP)协议,用SMTP把电子邮件从一台主机传送到另一台主机,发电子邮件时,必须要连接到一个外部SMTP服务器,此时邮件程序是一个SMTP客户端。而SMTP服务器也因此成为消息的第一站。
smtplib模块和需要实例话的smtplib.SMTP类,整个传输过程:
- 连接到服务器
- 登录
- 发送服务请求
- 退出
登录是可选的,只有在服务器启用了SMTP身份验证(SMTP-AUTH)时才需要登录。SMTP通信时需要一个端口,默认端口号是25(另外的SMTP_SLL类,作用类似SMTP,默认端口号是465)。该类中核心方法只需要两个sendmail()和quit()。下表列出了SMTP对象常用的方法:
方法 | 描述 |
sendmail() | 将msg从from发送至to,还可以选择性地设置ESMTP邮件(mopts)和收件人(ropts)选项 |
ehlo()或者helo() | 使用EHLO或HELO初始化SMTP或ESMTP服务器的会话。这是可选的,因为sendmail()会在需要时自动调用相关内容 |
starttls() | 让服务器启用TLS模式。如果给定参数,则用它们来创建安全socket |
set_debuglevel() | 为服务器通信设置调试级别 |
quit() | 关闭连接,并退出 |
login() | 使用用户名和密码登录SMTP服务器 |
一个小demo:
1 import smtplib
2
3 # 连接服务器
4 conn = smtplib.SMTP("smtp.qq.com", 25)
5 # 登录邮箱
6 conn.login("xxxx@qq.com", "qq邮箱授权码")
7 # 发送邮件
8 conn.sendmail("from发件人邮箱", “to收件人邮箱”, “内容”)
9 # 退出邮箱
10 conn.quit()
以上能实现调通邮箱,但是收到的邮件内容展示为空,因为没有设置邮件主题,内容,附件等信息,这个时候就要用到另一个模块来处理邮件信息了,即email。
关于email包,可自行百度,以下是调试demo:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
# **************邮箱配置信息*****************
fromAddr = "发件人邮箱地址"
fromPWD = "发件人邮箱密码"
toAddr = "收件人邮箱地址"
emailMsg = "邮件文本内容"
# 1. 连接邮箱服务器
con = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 登录邮箱
con.login(fromAddr, fromPWD)
# 2. 准备数据
# 创建邮件对象
msg = MIMEMultipart()
# 设置邮件主题
subject = Header('邮件主题', 'utf-8').encode()
msg['Subject'] = subject
# 设置邮件发送者
msg['From'] = fromAddr
# 设置邮件接受者
msg['To'] = toAddr
# 添加文字内容
text = MIMEText(emailMsg, 'plain', 'utf-8')
msg.attach(text)
3.发送邮件
con.sendmail(fromAddr, toAddr, msg.as_string())
4.退出登录,断开连接
con.quit()
有些邮箱可能有除了账号密码外的其他验证信息,比如QQ邮箱需要验证授权码,密码处改为授权码即可;还有确保邮箱开启了smtp服务,一般在邮箱设置中开启。
以上内容供参考。