Python自动化:生成报告邮件发送

自动化脚本运行完成后,结果通常需要通过邮件发送给相关人员。

此文介绍发送邮件相关的所有实现内容,并附带发送邮件相关源码。

实现思路

        目前测试框架实现的内容:使用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")

实现过程

1. 准备邮件服务

我这用的是QQ邮箱配置过程如下:进入设置

Python自动化:生成报告邮件发送_第1张图片

进入账户

Python自动化:生成报告邮件发送_第2张图片

需要开启POP3/SMTP服务,还需要生成授权码:授权码作为邮箱密码。 类似于这种:

urtiqypoufxubcai

Python自动化:生成报告邮件发送_第3张图片

设置完成后,你就可以用qq邮箱,以及授权码登录你的邮箱了。

还有两样东西需要取:SMTP服务器地址以及端口,QQ邮箱是这个。

SMTP = "smtp.qq.com"
SMTP_Port = 465

 2. 添加邮件内容

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"

3. 将邮件信息发送出去

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()  # 关闭连接

遇到的困难:

这么点代码,写了一下午,主要卡在几个地方

1. 无法使用企业邮箱

        一开始想用腾讯企业邮箱,但是企业邮箱没有密码,也没找到授权码。结果:放弃,换成使用QQ邮箱

2. QQ邮箱二级密码忘了

        。。。。。。

3. HTML测试报告无法添加

        添加报告有2种方法:1. 附件添加;2. 邮件消息体添加

        1. 附件添加:一开始填写的文件路径不对,导致怎么也读不到数据

pdfFile = "report\\2022-06-02-15_21_54_result.html"# 错误路径

我的路径是这样:在Send_Emails中读取到report文件夹中的测试报告。

Python自动化:生成报告邮件发送_第4张图片

对于这种读取不同文件夹下的路径,要增加一个..\\

"..\\report\\2022-06-02-15_21_54_result.html"

改成这个可用了。

        2. 邮件消息体添加:读取的HTML文件信息,写入到文本,没有任何内容。解决方法:放弃

 4. 添加附件后报错

        在添加附件之后,系统报错:email.errors.MultipartConversionError: Cannot attach additional subparts to non-multipart/

报错原因:生成的邮件实体是不带附件的,给它传个附件它说它做不到

加两样东西:

from email.mime.multipart import MIMEMultipart  # 添加引用
msg = MIMEMultipart()# 生成的邮件实体带附件的

在线吐槽:搜这个问题的时候,有篇文章只说增加下面的代码,没说引用。血压拉满

总结

邮件发送之前写过,但是时间太长源码没了,导致又花了一个下午重新整理了一遍。还是要总结。

源码有些地方是写在配置文件里的,配置文件的内容不清楚可以留言

你可能感兴趣的:(python自动化,自动化)