自动化测试之邮件发送

本文介绍了如何在自动化测试完成后通过Python发送邮件通知,包括设置授权码、使用SMTP模块发送不同格式的邮件,以及利用钉钉邮箱进行提醒。重点讨论了发送纯文本、带附件及HTML格式邮件的方法,并提到了在钉钉中邮件提醒的便利性。

邮件发送

每次自动化测试需要一定的时间,时间却又不固定,所以不知道什么时候完成了,什么时候还没跑完,那么就需要一个东西来提醒我们已经运行完了,快点去看测试结果,至于提醒的方式是怎么样的,可以根据自己的情况来看,发邮件呢还是发短信呢还是call电话呢,还是微信或者钉钉呢,都可以,不过普遍是邮件吧,邮件还可以带附件信息,所以更方便,承载的信息更多

在这里插入图片描述

其实可以再申请一个公司的AutoTest的邮箱号,但是难得麻烦了,所以用的另外一个qq号的邮箱来做为发送邮箱号,为了不显示出了我的qq号码,所以在qq邮箱中设置申请一个工作的邮箱名,这样就不是"号码@qq.com"这种格式了,变成了foxmail的邮箱号了

邮箱在第三方登录的时候,密码使用的都是授权码,所以我们开通各种服务,生成一个授权码
在这里插入图片描述

    测试完成后,会生成一个测试报告,这测试报告中包含了,失败成功用例名,总数,成功数,失败数,日志等详细信息,我需要把报告中的这些信息全部提取出来,然后自己组装成邮件发送的内容信息,测试报告是html的,所以信息的提取也可以使用之前说的xpath的方式来提取,我使用的是re来直接匹配信息,然后加上各种换行符和tab符,组成一串信息来发送
   def read_result(report):
        try:
            result = []
            with open('C:\Auto-Test\Report\\%s' % report,'r',encoding='utf-8') as f:
                data = f.read()
            top_info = re.findall(r'(?:"testAll":\s)(\d{1,4})|"testFail":\s(\d{1,4})|"testPass":\s(\d{1,4})|"beginTime":\s"(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2})"|"totalTime":\s"(\d{1,4})s"',data)
            name_info = re.findall(r'"description": "(.*)"',data)
            result_info = re.findall(r'"status": "(.*)"',data)
            info = list(zip(name_info,result_info))
            for i in top_info:
                for t in i:
                    if t!='':
                        result.append(t)
            email_info = '测试已完成,简要如下:\n\t用例总数:%s\n\t成功数:%s\n\t失败数:%s\n\t开始时间:%s\n\t总耗时:%s秒\n\t成功率:%f\n\t失败率:%f\n\n失败如下:'%(result[1],result[0],result[2],result[3],result[4],float(result[0])/float(result[1])*100,float(result[2])/float(result[1])*100)
            index = 1
            for i in info:
                if i[1]=='失败':
                    email_info = email_info + '\n\t(%d).%s\t\t'%(index,i[0])
                    index+=1
            index = 1
            email_info = email_info + '\n\n成功如下:'
            for i in info:
                if i[1]=='成功':
                    email_info = email_info + '\n\t(%d).%s\t\t'%(index,i[0])
                    index+=1
            return email_info
        except Exception as e:
            logger.error('ERROR:%s'%e)

最终输出的信息是这样子的,包含简要信息,其实还可以加入测试的版本信息,但是我需要获取多个设备的信息,暂时就没有写了,邮件主要起个提示作用和简要信息的输出和详细日志附件的输出,工作使用的是钉钉,那我们将邮件接收则设置为钉钉的邮箱
@dingwalk.com,每当运行完成后,钉钉收到邮件会直接闪烁的方式提醒,感觉很方便
本来想使用html的方式把信息直接嵌入在邮件内容中,以网页的方式在邮件中显示,但是钉钉邮件中的信息都做的处理,便签显示出来都是标签名称,没有生效,所以还是自己组串了
在这里插入图片描述

使用python来发送带有附件的邮件,[‘xxxxxx@dingtalk.com’],可以是多个邮件号码,那么则发送给多个邮箱

   def send_report_email(info,receivers,report_name):
        sender = '@foxmail.com'  # 发送方的邮箱
        my_pass = ''  # 发送方的密码

        def send(recv):
            message = MIMEMultipart()
            message['From'] = Header(sender, 'utf-8')
            message['To'] = Header(recv, 'utf-8')
            subject = 'AutoTest_Report'
            message['Subject'] = Header(subject, 'utf-8')

            message.attach(MIMEText(info, 'plain', 'utf-8'))

            att1 = MIMEText(open('C:\Auto-Test\Report\\%s' % report_name, 'rb').read(), 'base64', 'utf-8')
            att1["Content-Type"] = 'application/octet-stream'
            att1["Content-Disposition"] = 'attachment; filename="%s"' % report_name
            message.attach(att1)

            try:
                smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
                smtpObj.login(sender, my_pass)
                smtpObj.sendmail(sender, recv, message.as_string())
                logger.info("测试已完成!    发送邮件到%s"%recv)
            except smtplib.SMTPException as e:
                logger.error("Error:%s 无法发送邮件" % e)
        for i in receivers:
            send(i)
Tool.send_report_email(info,['xxxxxx@dingtalk.com'],'Fgap_Report_quick_check_2020-09-04-17-36-53.html')

几种邮件的格式发送方法

1.发送不带附件的纯文本信息的邮件

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender='465xxxxxx@qq.com'    # 发件人邮箱账号
my_pass = '这里使用的是qq邮箱生成的密码'              # 发件人邮箱密码
my_user=['131xxxx@qq.com','465xxxx@qq.com']    # 收件人邮箱账号
def mail():
    ret=True
    try:
        msg=MIMEText('填写邮件内容','plain','utf-8')
        msg['From']=formataddr(["zss",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        msg['To']=formataddr(["zw",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        msg['Subject']="这是一封测试邮件"                # 邮件的主题,也可以说是标题
        server=smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP_SSL服务器,端口是465
        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
        server.sendmail(my_sender,my_user,msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.quit()  # 关闭连接
    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
        ret=False
    return ret
if __name__ == '__main__':
    ret=mail()
    if ret:
        print("邮件发送成功")
    else:
        print("邮件发送失败")

2.发送带附件的纯文本信息的邮件

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
sender = '4xxxxxx@qq.com'  #发送方的邮箱
my_pass = '这里使用的是qq邮箱生成的密码'   #发送方的密码
receivers = ['xxxxxxxx@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱,列表的形式才存储多个接收方
 
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("收件人名", 'utf-8')#收件人的姓名
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'  #邮件的标题
message['Subject'] = Header(subject, 'utf-8')
 
#邮件正文内容
message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
 
att1 = MIMEText(open('zss.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'

att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
 
#构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att2)

try:
    smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
    smtpObj.login(sender, my_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

3.发送html格式中带有图片的邮件

#coding:utf-8
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

sender = '4xxxxxxx@qq.com'#发送方的邮箱
password = 'qgusxxxxx'  #发送方的密码
receivers = ['4xxxxx@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("收件人名", 'utf-8')#收件人的姓名
msgRoot['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试' #邮件的标题
msgRoot['Subject'] = Header(subject, 'utf-8')

msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative) #邮件正文内容 表示什么类型,html还是文本
#message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
#html的内容
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.test.top">Test-one链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

try:
    smtpObj = smtplib.SMTP_SSL('smtp.qq.com',465) #设置服务器
    smtpObj.login(sender,password)  #登陆
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())#发送
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

关注“码点小干货”公众号,一起分享一起交流各类信息技术和工具资源

愿你眼中总有光芒! - 愿你活成想要的样子!

在这里插入图片描述

SMTP模块的相关方法 方法 描述
SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器 SMTP.connect([host[,
port]]) 连接到指定的SMTP服务器 SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
SMTP.verify(address) 判断邮件地址是否在SMTP服务器上 SMTP.starttls([keyfile[,
certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密 SMTP.login(user,
password) 登录SMTP服务器 SMTP.sendmail(from_addr, to_addrs, msg,
mail_options=[], rcpt_options=[]) 发送邮件

from_addr:邮件发件人

to_addrs:邮件收件人

msg:发送消息

SMTP.quit() 关闭SMTP会话 SMTP.close() 关闭SMTP服务器连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值