自动化脚本运行完成后,结果通常需要通过邮件发送给相关人员。
此文介绍发送邮件相关的所有实现内容,并附带发送邮件相关源码。
目前测试框架实现的内容:使用python + unittest 框架生成一个html测试报告文件。
期望结果:将生成的测试报告发送给需要知道人的邮箱。
# !/usr/bin/env python # -*- coding: UTF-8 """ @项目:Test_ZDH_002 @作者: Bierante @文件名:Send_Emails.py @创建日期:2022/8/1 14:09 @软件介绍:邮件发送测试报告 """ import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.utils import formataddr from email.mime.application import MIMEApplication from AutoMation.PLUIAuto_Test_001.config.config import FSYJ_ZH,FSYJ_SQM,JSYJ_ZH,CSYJ_ZH,SMTP,SMTP_Port def mail(filename, title = None, description = None): """ 通过邮件,将生成的文件,作为附件,发送给对应人员 :param filename:测试报告所在路径:相对或绝对路径都可以,不过一定要能够找到数据 :param title: 邮件名称,可以不加,有默认值 :param description: 邮件描述,可以不加,有默认值 """ # with open(r"..\report\2022-06-02-15_21_54_result.html","rb") as f: # print(f.read()) # html_nr = f.read() # file = urlopen(r"..\report\2022-06-02-15_21_54_result.html").read() # print(file) msg = MIMEMultipart() # 生成一个带附件的邮件 msg['From'] = formataddr(["自动化测试脚本", FSYJ_ZH]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号 msg['To'] = formataddr(["接收测试报告账号", JSYJ_ZH]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 msg['Cc'] = formataddr(["抄送账号", CSYJ_ZH]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 if title == None: msg['Subject'] = "自动化测试脚本运行结果" # 邮件的主题,也可以说是标题 else: msg['Subject'] = title # 邮件的主题,也可以说是标题 # # 添加附件(pdf文档) # pdfFile = "report\\2022-06-02-15_21_54_result.html" # 需发文件路径 # pdf = MIMEApplication(open(pdfFile, 'rb').read()) # pdf.add_header('Content-Disposition', 'attachment', filename='pdf') # 文字部分 if description == None: part = MIMEText("测试报告,请查收!") else: part = MIMEText(description) msg.attach(part) # msg.attach(pdf) # filepath = "..\\" + filename # file_msg = MIMEApplication(open(r"..\report\2022-06-02-15_21_54_result.html", "rb").read()) # 将测试报告作为附件,增加到邮件中 file_msg = MIMEApplication(open(filename, "rb").read()) file_msg.add_header("content-disposition", "attachment", filename = filename) msg.attach(file_msg) server = smtplib.SMTP_SSL(SMTP, SMTP_Port) # 发件人邮箱中的SMTP服务器,端口是25 server.login(FSYJ_ZH, FSYJ_SQM) # 括号中对应的是发件人邮箱账号、邮箱密码 server.sendmail(FSYJ_ZH, [JSYJ_ZH ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 server.quit() # 关闭连接 print("邮件发送成功") # if __name__ == '__main__': mail("..\\report\\2022-06-02-15_21_54_result.html")
我这用的是QQ邮箱配置过程如下:进入设置
进入账户
需要开启POP3/SMTP服务,还需要生成授权码:授权码作为邮箱密码。 类似于这种:
urtiqypoufxubcai
设置完成后,你就可以用qq邮箱,以及授权码登录你的邮箱了。
还有两样东西需要取:SMTP服务器地址以及端口,QQ邮箱是这个。
SMTP = "smtp.qq.com" SMTP_Port = 465
msg = MIMEMultipart() # 生成一个带附件的邮件 msg['From'] = formataddr(["自动化测试脚本", FSYJ_ZH]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号 msg['To'] = formataddr(["接收测试报告账号", JSYJ_ZH]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 msg['Cc'] = formataddr(["抄送账号", CSYJ_ZH]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "自动化测试脚本运行结果" # 邮件的主题,也可以说是标题
part = MIMEText("测试报告,请查收!") # 生成邮件文本主体 msg.attach(part) # 将文本主题添加到消息中
最最重要的部分:将测试报告作为附件添加到邮件里:
file_msg = MIMEApplication(open(filename, "rb").read()) file_msg.add_header("content-disposition", "attachment", filename = filename) msg.attach(file_msg)
这里的filename 文件路径:
"..\\report\\2022-06-02-15_21_54_result.html"
server = smtplib.SMTP_SSL(SMTP, SMTP_Port) # 发件人邮箱中的SMTP服务器,端口是25 server.login(FSYJ_ZH, FSYJ_SQM) # 括号中对应的是发件人邮箱账号、邮箱密码 server.sendmail(FSYJ_ZH, [JSYJ_ZH ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 server.quit() # 关闭连接
这么点代码,写了一下午,主要卡在几个地方
一开始想用腾讯企业邮箱,但是企业邮箱没有密码,也没找到授权码。结果:放弃,换成使用QQ邮箱
。。。。。。
添加报告有2种方法:1. 附件添加;2. 邮件消息体添加
1. 附件添加:一开始填写的文件路径不对,导致怎么也读不到数据
pdfFile = "report\\2022-06-02-15_21_54_result.html"# 错误路径
我的路径是这样:在Send_Emails中读取到report文件夹中的测试报告。
对于这种读取不同文件夹下的路径,要增加一个..\\
"..\\report\\2022-06-02-15_21_54_result.html"
改成这个可用了。
2. 邮件消息体添加:读取的HTML文件信息,写入到文本,没有任何内容。解决方法:放弃
在添加附件之后,系统报错:email.errors.MultipartConversionError: Cannot attach additional subparts to non-multipart/
报错原因:生成的邮件实体是不带附件的,给它传个附件它说它做不到
加两样东西:
from email.mime.multipart import MIMEMultipart # 添加引用
msg = MIMEMultipart()# 生成的邮件实体带附件的
在线吐槽:搜这个问题的时候,有篇文章只说增加下面的代码,没说引用。血压拉满
邮件发送之前写过,但是时间太长源码没了,导致又花了一个下午重新整理了一遍。还是要总结。
源码有些地方是写在配置文件里的,配置文件的内容不清楚可以留言