selenium+python脚本执行完毕后直接将生成的报告发送到指定邮箱

通常情况想,我们希望执行完一套的自动化脚本后能够顺带的将自动化脚本发送给指定的某些人查看执行结果,于是需要在脚本执行完毕后去执行发送邮件的脚本,将生成的报告作为附件发送出去。

期初本人参考的文档是https://www.cnblogs.com/liyanqi/p/7885014.html

其源码如下:

 

#!/user/bin/python

# -*- coding:utf-8 -*-

 

import smtplib

from email.mime.base import MIMEBase

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.header import Header

from email import encoders

 

# Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

 

 

def get_email_obj(email_subject, email_from, to_addr_list):

    '''

    构造邮件对象,并设置邮件主题、发件人、收件人,最后返回邮件对象

    :param email_subject:邮件主题

    :param email_from:发件人

    :param to_addr_list:收件人列表

    :return :邮件对象 email_obj

    '''

    # 构造 MIMEMultipart 对象做为根容器

    email_obj = MIMEMultipart()

    email_to = ','.join(to_addr_list)   # 将收件人地址用“,”连接

    # 邮件主题、发件人、收件人

    email_obj['Subject'= Header(email_subject, 'utf-8')

    email_obj['From'= Header(email_from, 'utf-8')

    email_obj['To'= Header(email_to, 'utf-8')

    return email_obj

 

 

def attach_content(email_obj, email_content, content_type='plain', charset='utf-8'):

    '''

    创建邮件正文,并将其附加到跟容器:邮件正文可以是纯文本,也可以是HTML(为HTML时,需设置content_type值为 'html')

    :param email_obj:邮件对象

    :param email_content:邮件正文内容

    :param content_type:邮件内容格式 'plain'、'html'..,默认为纯文本格式 'plain'

    :param charset:编码格式,默认为 utf-8

    :return:

    '''

    content = MIMEText(email_content, content_type, charset)    # 创建邮件正文对象

    email_obj.attach(content)     # 将邮件正文附加到根容器

 

 

def attach_part(email_obj, source_path, part_name):

    '''

    添加附件:附件可以为照片,也可以是文档

    :param email_obj:邮件对象

    :param source_path:附件源文件路径

    :param part_name:附件名

    :return:

    '''

    part = MIMEBase('application''octet-stream')                          # 'octet-stream': binary data   创建附件对象

    part.set_payload(open(source_path, 'rb').read())                        # 将附件源文件加载到附件对象

    encoders.encode_base64(part)

    part.add_header('Content-Disposition''attachment; filename="%s"' % part_name)     # 给附件添加头文件

    email_obj.attach(part)                                                                # 将附件附加到根容器

 

 

def send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list):

    '''

    发送邮件

    :param email_obj:邮件对象

    :param email_host:SMTP服务器主机

    :param host_port:SMTP服务端口号

    :param from_addr:发件地址

    :param pwd:发件地址的授权码,而非密码

    :param to_addr_list:收件地址

    :return:发送成功,返回 True;发送失败,返回 False

    '''

    try:

        '''

            # import smtplib

            # smtp_obj = smtplib.SMTP([host[, port[, local_hostname]]] )

                # host: SMTP服务器主机。

                # port: SMTP服务端口号,一般情况下SMTP端口号为25。

            # smtp_obj = smtplib.SMTP('smtp.qq.com', 25)

        '''

        smtp_obj = smtplib.SMTP_SSL(email_host, host_port)     # 连接 smtp 邮件服务器

        smtp_obj.login(from_addr, pwd)

        smtp_obj.sendmail(from_addr, to_addr_list, email_obj.as_string())  # 发送邮件:email_obj.as_string():发送的信息

        smtp_obj.quit()                                 # 关闭连接

        print("发送成功!")

        return True

    except smtplib.SMTPException:

        print("发送失败!")

        return False

 

 

if __name__ == "__main__":

    # (QQ邮箱)

    email_host = "smtp.qq.com"            # smtp 邮件服务器

    host_port = 465                       # smtp 邮件服务器端口:SSL 连接

    from_addr = "发件地址"                # 发件地址

    pwd = "授权码"                  # 发件地址的授权码,而非密码

 

    # (163邮箱)

    # email_host = "smtp.163.com"             # smtp 邮件服务器

    # host_port = 465                         # smtp 邮件服务器端口:SSL 连接

    # from_addr = "发件地址"                  # 发件地址

    # pwd = "授权码"                    # 发件地址的授权码,而非密码

 

    to_addr_list = ["邮箱1""邮箱2"]       # 收件地址

 

    email_content = "邮件主题"

    email_content_html = """

    <p>Python 邮件发送...</p>

    <p><a href="http://www.runoob.com">菜鸟教程链接</a></p>

    <p>图片:</p>

    <p><img src="cid:image1"></p>

    """

    email_subject = "邮件主题"

    email_from = "发件人"

    source_path = r"D:\我的文档\My Pictures\avatar.jpg"

    part_name = 'avatar.png'

 

    email_obj = get_email_obj(email_subject, email_from, to_addr_list)

    attach_content(email_obj, email_content)

    attach_part(email_obj, source_path, part_name)

    send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list)

其基本符合我的要求,包括整个邮件的所有内容,但是唯一不好的是不能和我的项目结合。于是,我做了适当的修改,将原代码的__main__部分去掉,只保留方法部分,并将整体封装成一个类,修改后代码如下,保存为myemail.py

 

#!/user/bin/python
# -*- coding:utf-8 -*-

import smtplib
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders


# Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

class Email():
    def get_email_obj(email_subject, email_from, to_addr_list):
        '''
        构造邮件对象,并设置邮件主题、发件人、收件人,最后返回邮件对象
        :param email_subject:邮件主题
        :param email_from:发件人
        :param to_addr_list:收件人列表
        :return :邮件对象 email_obj
        '''
        # 构造 MIMEMultipart 对象做为根容器
        email_obj = MIMEMultipart()
        email_to = ','.join(to_addr_list)  # 将收件人地址用“,”连接
        # 邮件主题、发件人、收件人
        email_obj['Subject'] = Header(email_subject, 'utf-8')
        email_obj['From'] = Header(email_from, 'utf-8')
        email_obj['To'] = Header(email_to, 'utf-8')
        return email_obj


    def attach_content(email_obj, email_content, content_type='plain', charset='utf-8'):
        '''
        创建邮件正文,并将其附加到跟容器:邮件正文可以是纯文本,也可以是HTML(为HTML时,需设置content_type值为 'html')
        :param email_obj:邮件对象
        :param email_content:邮件正文内容
        :param content_type:邮件内容格式 'plain'、'html'..,默认为纯文本格式 'plain'
        :param charset:编码格式,默认为 utf-8
        :return:
        '''
        content = MIMEText(email_content, content_type, charset)  # 创建邮件正文对象
        email_obj.attach(content)  # 将邮件正文附加到根容器


    def attach_part(email_obj, source_path, part_name):
        '''
        添加附件:附件可以为照片,也可以是文档
        :param email_obj:邮件对象
        :param source_path:附件源文件路径
        :param part_name:附件名
        :return:
        '''
        part = MIMEBase('application', 'octet-stream')  # 'octet-stream': binary data   创建附件对象
        part.set_payload(open(source_path, 'rb').read())  # 将附件源文件加载到附件对象
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % part_name)  # 给附件添加头文件
        email_obj.attach(part)  # 将附件附加到根容器


    def send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list):
        '''
        发送邮件
        :param email_obj:邮件对象
        :param email_host:SMTP服务器主机
        :param host_port:SMTP服务端口号
        :param from_addr:发件地址
        :param pwd:发件地址的授权码,而非密码
        :param to_addr_list:收件地址
        :return:发送成功,返回 True;发送失败,返回 False
        '''
        try:
            '''
                # import smtplib
                # smtp_obj = smtplib.SMTP([host[, port[, local_hostname]]] )
                    # host: SMTP服务器主机。
                    # port: SMTP服务端口号,一般情况下SMTP端口号为25。
                # smtp_obj = smtplib.SMTP('smtp.qq.com', 25)
            '''
            smtp_obj = smtplib.SMTP_SSL(email_host, host_port)  # 连接 smtp 邮件服务器
            smtp_obj.login(from_addr, pwd)
            smtp_obj.sendmail(from_addr, to_addr_list, email_obj.as_string())  # 发送邮件:email_obj.as_string():发送的信息
            smtp_obj.quit()  # 关闭连接
            print("发送成功!")
            return True
        except smtplib.SMTPException:
            print("发送失败!")
            return False

这样专门的发送邮件类就有了,使用的时候只要设置好相应参数,直接调用函数就可以了。在原本生成报告的脚本下添加如下代码:

 

# 邮件发送报告
# (QQ邮箱)
email_host = "smtp.qq.com"  # smtp 邮件服务器
host_port = 465  # smtp 邮件服务器端口:SSL 连接
from_addr = "发件地址"  # 发件地址
pwd = "授权码"  # 发件地址的授权码,而非密码------每次发送报告前需要修改

# (163邮箱)
# email_host = "smtp.163.com"             # smtp 邮件服务器
# host_port = 465                         # smtp 邮件服务器端口:SSL 连接
# from_addr = "发件地址"                  # 发件地址
# pwd = "授权码"                    # 发件地址的授权码,而非密码

# 获取最新生成的测试报告附件
result_dir = r'D:\PyCharm\untitled\test_report'
# 将文件都放到一个数组中
lists = os.listdir(result_dir)
# 将目录下的文件排序
lists.sort()
# 找到最新生成的文件
file_new = os.path.join(lists[-1])
source_path = result_dir + '\\' + file_new

# 邮件内容
to_addr_list = ["112221121@qq.com,4564645@qq.com"]  # 收件地址
email_content = "这是本次自动化测试报告,请查收"
email_content_html = "test"
email_subject = "自动化测试报告"
email_from = "tester"
part_name = 'test.html'

email_obj = Email.get_email_obj(email_subject, email_from, to_addr_list)
Email.attach_content(email_obj, email_content)
Email.attach_part(email_obj, source_path, part_name)
Email.send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list)

文件开头需要引入上面的发送邮件类:

 

from framework.myemail import Email

这样就可以直接在脚本执行完后将生成的报告发送到指定的邮箱。至于如何生成报告的相关代码请查看之前发的《selenium使用HTMLTestRunner成功报告》

参考资料:

 

https://www.cnblogs.com/liyanqi/p/7885014.html     Selenium3+python3-发送添加附件的邮件

http://www.51testing.com/html/58/492258-3601835.html     Python实现测试报告自动发送邮件

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值