python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)

简介

  上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件。发送带附件的需要导入另外一个模块 MIMEMultipart。还有就是测

试负责人不止一个人,需要将测试报告发给多个人,也就是多个收件人。这篇主要是围绕这两个主题进行讲解的。

大致思路

(一)带有附件发送邮件

1、导入模块 MIMEMultipart

from email.mime.multipart import MIMEMultipart

2、先读取要发送文件的内容,file_new 是测试报告路径的参数名

3、下图红色框框 file_name 参数是发送的附件重新命名

4、file_new 是测试报告路径的参数名,发送邮件是将其传入

5、运行结果

6、查看收件箱

(二)发送给多个收件人

上面都是发给一个收件人,那么如何一次发给多个收件人呢?其实是非常简单的,只需改两个小地方,即可,从这里就可以看出python的强大之处。
1、源码

2、仿造修改

3、运行结果

4、收件箱查看

公司邮箱

QQ邮箱

参考代码

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
‘‘‘
Created on 2019-5-7
@author: 北京-宏哥
Project:学习和使用将测试报告通过邮件发出去且邮件带有附件
‘‘‘
#3.导入unittest模块
import unittest
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib
#4.编写测试用例和断言
def all_case():
    # 待执行用例的目录
    #case_dir = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\case"
    case_dir = os.path.join(os.getcwd(), "case")
    testcase = unittest.TestSuite()
    discover = unittest.defaultTestLoader.discover(case_dir,
                                                   pattern="test*.py",
                                                   top_level_dir=None)
    # #discover方法筛选出用例,循环添加到测试套件中
    # for test_suit in discover:
    #     for test_case in test_suit:
    #         #添加用力到testcase
    #         testcase.addTests(test_case)
    # print(testcase)
    testcase.addTests(discover)  # 直接加载 discover    可以兼容python2和3
    print(testcase)
    return testcase
# ==============定义发送邮件==========
def send_mail(file_new):
    #-----------1.跟发件相关的参数------
    smtpserver = ‘smtp.mxhichina.com‘                #发件服务器
    port = 0                      #端口
    username = ‘[email protected]‘  #发件箱用户名
    password = ‘[email protected]@123‘        #发件箱密码
    sender = ‘[email protected]‘    #发件人邮箱
    receiver = [‘[email protected]‘,‘[email protected]‘] #收件人邮箱
    # ----------2.编辑邮件的内容------
    #读文件
    f = open(file_new, ‘rb‘)
    mail_body = f.read()
    f.close()
    # 邮件正文是MIMEText
    body = MIMEText(mail_body, ‘html‘, ‘utf-8‘)
    # 邮件对象
    msg = MIMEMultipart()
    msg[‘Subject‘] = Header("自动化测试报告", ‘utf-8‘).encode()#主题
    msg[‘From‘] = Header(u‘测试机 <%s>‘%sender)                #发件人
    msg[‘To‘] = Header(u‘测试负责人 <%s>‘%receiver)            #收件人
    msg[‘To‘] = ‘;‘.join(receiver)
    msg[‘date‘] = time.strftime("%a,%d %b %Y %H:%M:%S %z")
    msg.attach(body)
    # 附件
    att = MIMEText(mail_body, "base64", "utf-8")
    att["Content-Type"] = "application/octet-stream"
    att["Content-Disposition"] = ‘attachment; filename="test_report.html"‘
    msg.attach(att)
    # ----------3.发送邮件------
    try:
        smtp = smtplib.SMTP()
        smtp.connect(smtpserver)  # 连服务器
        smtp.login(sender, password)
    except:
        smtp = smtplib.SMTP_SSL(smtpserver, port)
        smtp.login(sender, password)  # 登录
    smtp.sendmail(sender, receiver, msg.as_string())  # 发送
    smtp.quit()
    # #发送邮件
    # smtp = smtplib.SMTP()
    # smtp.connect(‘smtp.mxhichina.com‘)  # 邮箱服务器
    # smtp.login(username, password)  # 登录邮箱
    # smtp.sendmail(sender, receiver, msg.as_string())  # 发送者和接收者
    # smtp.quit()
    print("邮件已发出!注意查收。")
# ======查找测试目录,找到最新生成的测试报告文件======
def new_report(test_report):
    lists = os.listdir(test_report)  # 列出目录的下所有文件和文件夹保存到lists
    lists.sort(key=lambda fn: os.path.getmtime(test_report + "\\" + fn))  # 按时间排序
    file_new = os.path.join(test_report, lists[-1])  # 获取最新的文件保存到file_new
    print(file_new)
    return file_new
if __name__ == "__main__":
    # 返回实例
    runner = unittest.TextTestRunner()
    #导入第三方模块HTMLTestRunner
    import HTMLTestReportCN
    import time
    # 获取当前时间,这样便于下面的使用。
    now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
    #保存生成报告的路径
    report_path =  "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\"+now+"_result.html"
    fp = open(report_path,‘wb‘)
    runner = HTMLTestReportCN.HTMLTestRunner(stream=fp,
                                           title=u"这是我的自动化测试用例",
                                           description=u"用例执行情况",
                                           verbosity = 2
                                           )
    # run 所有用例
    runner.run(all_case())
    #关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。
    fp.close()
    #测试报告文件夹
    test_path = "C:\\Users\\DELL\\PycharmProjects\\honggetest\\report\\"
    new_report = new_report(test_path)
    send_mail(new_report)  # 发送测试报告

小结

1、第二处我注释掉也可以发出去,两个收件人可以收到邮件,但是如果这样的话,公司邮箱收件人只显示一个收件人,QQ邮箱显示两个收件人。

公司邮箱    PS:如果将红色框上边的注释掉,下边的不注释,就可以看到两个收件人的邮箱

以下是个人愚见,如果不对请指出

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

import smtplib

以上是导入的包,通过email和smtplib实现发邮件。

折腾好久,发现是这样:email中收件人和sendmail中的收件人是没啥联系的。

mail_to = [‘[email protected]‘,‘[email protected]‘]

server = smtplib.SMTP()

server.connect()

server.sendmail(mail_from, mail_to, msg.as_string())

server.quit()

mail_to = ‘[email protected],[email protected]‘

msg = MIMEMultipart(‘related‘) ##采用related定义内嵌资源的邮件体

msgtext = MIMEText(content,_subtype=‘html‘,_charset=‘utf-8‘) ##_subtype有plain,html等格式,避免使用错误

msg[‘Subject‘] = subject

msg[‘From‘] = mail_from

msg[‘To‘] =mail_to

sendmail中收件人,它的格式应该为list。这个为实际的收件人地址。

而msg[‘To‘] 格式是字符串(str)。这个只是为了邮件中打印出来而已。

sendmail查源码,python/lib/smtplib.py大概690行左右,或者搜索tolist。

邮件收不到的几种原因

1、Subject 和正文内容不要用 hello、hehe、test 等单词

2、from(发件人)和 to(收件人)不要为空,(要不然会被认为是垃圾邮件)

3、找不到的话,先看下垃圾信箱,是不是跑到垃圾箱了

4、如果前几次可以收到,后来收不到了,需改下 subject 内容(因为每次都是一个 subject,系统也会拒收的,把 subject 内容设置为动态的是最好的)

5、部分邮箱是 ssl 加密了的,所以无法发送,如:qq 邮箱(用授权码去登录)

6、要是按照上面的步骤来报错了,说明代码抄错了,多检查几次。

原文地址:https://www.cnblogs.com/du-hong/p/10819199.html

时间: 2024-11-08 11:43:23

python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)的相关文章

python接口自动化(十八)--重定向(Location)(详解)

简介 在实际工作中,有些接口请求完以后会重定向到别的url,而你却需要重定向前的url.URL主要是针对虚拟空间而言,因为不是自己独立管理的服务器,所以无法正常进行常规的操作.但是自己又不希望通过主域名的二级目录进行访问,而 是希望通过主域名的二级域名进行访问.所以这个时候就会用到URL重定向. 重定向过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器 ”.于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信

python接口自动化(二十九)--html测试报告通过邮件发出去——上(详解)

简介 前边几篇,已经教小伙伴们掌握了如何生成HTML的测试报告,那么生成测试报告,我们也不能放在那里不管了,这样即使你报告在漂亮,领导也看不到.因此如果想向领导汇报工作,不仅需要提供更直观的测试报告.而是我们需要将生 成测试报告发个相关的负责人,需要他们看一下测试结果,把控一下项目的接口有风险,会不会影响项目进度等等一些事吧. 发邮件需要用到python两个模块,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块

python接口自动化(三十九)- logger 日志 - 上(超详解)

简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式. logging模块与log4j的机制是一样的,只是具体的实现细节不同.模块提供logger,handler,filter,formatter. logger提供日志接口,供应用代码使用.logger最长用的操作有两类:配置和发送日志消息.可以通过

python接口自动化(十六)--参数关联接口后传(详解)

简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操作,不用说就需 要用参数关联了,发随笔之后会有一个随笔的 id,获取到这个 id,继续操作传这个随笔 id 就可以了(博客园的登录机制已经变了,不能用账号和密码登录了,这里用 cookie 登录) 大致流程步骤:web界面操作登录抓包查看cookie—>代码模拟cookie登录—>web界面操作新

python接口自动化(十四)--session关联接口(详解)

简介 上一篇cookie绕过验证码模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等等,这时候如何保持会话呢? session简介 1.通过help方法查看帮助文档,截图一部分,后面省略了,有兴趣的自己可以敲一下看看 2.参考代码 1 # coding:utf-8 2 import requests 3 help(requests.session()) 使用session登录 1.使用session登录只需在登录的基础上稍做修改,即可 2.参考代码 # coding:u

(三十九)android动画 Animation四大属性 详解(转载:http://www.android100.org/html/201304/25/2295.html)

一.Animation主要有四大属性,分别是淡入淡出,绕轴旋转,变化大小,位移变化 二.四大属性的共同的方法 1.setDuration(long durationMills):设置动画持续的时间(单位:毫秒) 2.setFillAfter(boolean fillAfter):如果fillAfter的值为true,则动画执行后看,控件将停留在执行结束的状态 3.setFillBefore(boolean fillBefore):如果fillBefore的值为true,则动画执行后看,控件将停留

python接口自动化9-https请求(SSL)

前言 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会报:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编环境: python:2.7.12 requests:2.13.0 fiddler:v4.6.2.0 一.SSL问题 1.不启用fiddler,直接发htt

python接口自动化2-发送post请求

前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实不用去百度什么的,直接用help函数就能查看相关注释和案例内容. >>import requests >>help(requests) 2.查看python发送get和post请求的案例 >>> import requests       >>> r

python接口自动化5-Json数据处理

前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的参数就行,这时候就需要json来解析返回的数据了. 一.json模块简介 1.Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式,常用于http请求中 2.可以用help(json),查看对应的源码注释内容 Encoding basic P