为什么要发送邮件
自动化测试生成了测试报告文件,无法通知相关人员
目标:每次Selenium自动化测试代码运行完毕后,通过自动发送邮件方式告知相关人员具体测试结果信息。
Python发送邮件的库
- smtplib:以前较为常用
- smtplib需要设置发件人邮箱中的SMTP服务器,一些主流的邮箱的服务器都可以设置,而可能需求需要使用的某企业邮箱的服务器是没有此项配置的。
- zmail:简单且容易上手
- zmail仅支持python3,不需要任何外部依赖,不支持python2。
- 不需要手动添加服务器地址、端口以及适合的协议。
- 此外,使用一个python字典来代表邮件内容也更容易理解。
zmail特性
- 自动寻找服务器地址以及端口
- 自动使用可靠的链接协议
- 自动将一个python字典映射成MIME对象(带有附件的)
- 自动添加头文件以及localhostname来避免服务器拒收你的邮件
- 轻松自定义你的头文件
- 支持使用HTML作为邮件内容
- 仅需python>=3.5,你可以将其嵌入你的项目而无需其他的依赖
安装zmail
pip install zmail==0.2.8
使用须知:
使用Python3,不是Python2
生成邮箱授权码
- 用浏览器访问:mail.qq.com,用自己的QQ账号登陆进入邮箱,开启smtp服务
- 开启POP3/SMTP服务
- 生成授权码,保存下来(注意保密)
测试SMTP和POP功能是否正常
import zmail
server = zmail.server('发件人邮箱地址', '授权码')
if server.smtp_able():
pass
if server.pop_able():
pass
自定义服务器配置
- 如果zmail不能正常工作,可以通过可选参数来自定义server的配置:
server = zmail.server('[email protected]','授权码',smtp_host='smtp.163.com',smtp_port=994,smtp_ssl=True,pop_host='pop.163.com',pop_port=995,pop_tls=True)
server = zmail.server(username="[email protected]",password="授权码",smtp_host="smtp.qq.com", smtp_port=465,config="qq")
zmail使用基本步骤
# 导入zmail模块
import zmail
# 配置邮件账号:
server = zmail.server('发件人邮箱地址', '授权码')
# 发送邮件:
server.send_mail('收件人邮箱地址',{'subject':'标题','content_text':'邮件正文.'})
#一个收件人
# 收件人如果有多个,用列表表示。
增加附件
import zmail
mail_content = {'subject': '标题',
'content_text': '邮件正文',
'attachments': ['C:\\附件1.zip','C:\\附件2.jpg']
}
server = zmail.server('发件人邮件地址’, '授权码')
server.send_mail('收件人邮件地址', mail_content)
发送HTML作为邮件正文
import zmail
mail_content = {'subject': '标题',
'content_text': '邮件正文',
'attachments': ['C:\\附件1.zip','C:\\附件2.jpg']
}
server = zmail.server('发件人邮件地址’, '授权码')
server.send_mail('收件人邮件地址', mail_content)
with open(file_path, 'r',encoding='utf-8') as f:
mail_content = {
'from': "[email protected]",# 发件人邮箱
'subject': '最新的测试报告邮件',# 邮件主题
'content_html': f.read(),# 邮件正文内容
'attachments': file_path # 邮件附件
}
使用抄送
- 抄送cc
server.send_mail(['邮箱地址1','邮箱地址2'],mail_content,cc=['抄送者邮箱1','抄送者邮箱2']) # 邮箱使用元组形式(命名,邮箱地址) server.send_mail(['邮箱地址1','邮箱地址2'],mail_content,cc=[('经理','抄送者邮箱1'),'抄送者邮箱2'])
设计发送邮件模块
- utils包里新建一个模块:send_email.py
- 导入zmail
- 定义类EmailUtil
- 定义方法send_email,参数是file_path代表html报告文件路径
- 打开html报告文件
- 准备邮件内容
- 配置邮件账号
- 发送邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from ecshop.utils.read_mailconf import MailConf
from ecshop.utils.report_utility import Report
class SendMail():
def send(self,filename):
# #设置登录及服务器信息
# mail_host = 'smtp.qq.com'
# mail_user = '登录者'
# mail_password = '授权码'
# sender = '[email protected]'
# receivers = ['[email protected]']
mc=MailConf()
mail_host=mc.get_mail_host()
mail_user=mc.get_mail_user()
mail_password=mc.get_mail_password()
sender=mc.get_sender()
receivers=mc.get_receivers()
#设置eamil信息
#添加一个MIMEmultipart类,处理正文及附件
message = MIMEMultipart()
message['From'] = sender
message['To'] = receivers[0]
message['Subject'] = 'Test Report'+filename
#推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等
with open(filename,'r',encoding="utf-8") as f:
content = f.read()
#设置html格式参数
part1 = MIMEText(content,'html','utf-8')
#添加一个txt文本附件
with open(filename,'r',encoding="utf-8")as h:
content2 = h.read()
#设置txt参数
part2 = MIMEText(content2,'plain','utf-8')
#附件设置内容类型,方便起见,设置为二进制流
part2['Content-Type'] = 'application/octet-stream'
#设置附件头,添加文件名
part2['Content-Disposition'] = 'attachment;filename="report.html"'
# #添加照片附件
# with open('1.png','rb')as fp:
# picture = MIMEImage(fp.read())
# #与txt文件设置相似
# picture['Content-Type'] = 'application/octet-stream'
# picture['Content-Disposition'] = 'attachment;filename="1.png"'
#将内容附加到邮件主体中
message.attach(part1)
message.attach(part2)
# message.attach(picture)
#登录并发送
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25)
smtpObj.login(mail_user,mail_password)
smtpObj.sendmail(
sender,receivers,message.as_string())
print('success')
smtpObj.quit()
except smtplib.SMTPException as e:
print('error',e)
if __name__ == '__main__':
# SendMail().send("../report/test_report.html")
SendMail().send(Report().get_lastest_report())
使用发送邮件模块
- 在测试套件里发送html报告给相关人员
# 导入EmailUtil
from utils.send_mail import EmailUtil
# 测试套件末尾,发送邮件,参数是前面准备好的带有变化数据的测试结果报告文件名称
EmailUtil().send_email(report_file_path)#发送邮件
标签:content,Selenium39,server,发送,send,mail,zmail,邮件
From: https://www.cnblogs.com/sean-test/p/17013716.html