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

简介: 上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件。发送带附件的需要导入另外一个模块 MIMEMultipart。还有就是测试负责人不止一个人,需要将测试报告发给多个人,也就是多个收件人。这篇主要是围绕这两个主题进行讲解的。

简介



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

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


大致思路



(一)带有附件发送邮件


1、导入模块 MIMEMultipart

from email.mime.multipart import MIMEMultipart

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

1232840-20190506160752555-1355662005.png


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

1232840-20190506160925958-1146815231.png


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


1232840-20190506161110654-1468373080.png


5、运行结果


1232840-20190506161619508-1173696443.png


6、查看收件箱


1232840-20190506161714682-1157232280.png


(二)发送给多个收件人


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


1、源码


1232840-20190506163526020-257940741.png


2、仿造修改


1232840-20190507124059768-1224726427.png


3、运行结果


1232840-20190506164219402-840238446.png


4、收件箱查看


公司邮箱


1232840-20190506170810811-140165208.png

 

 

QQ邮箱


1232840-20190507124521965-1169634488.png

 

参考代码



# 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 = 'nXXX@ceXx.cn'  #发件箱用户名
    password = 'ceXXx@@123'        #发件箱密码
    sender = 'XXly@cedex.cn'    #发件人邮箱
    receiver = ['hongge@com.cn','1918991791@qq.com'] #收件人邮箱
    # ----------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邮箱显示两个收件人。


1232840-20190507124116012-62533984.png


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


1232840-20190507124353004-2044140686.png

 

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


from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

import smtplib


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

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


mail_to = ['test1@exp.com','test2@exp.com']

server = smtplib.SMTP()

server.connect()

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

server.quit()

mail_to = 'test1@exp.com,test2@exp.com'

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。


2、在使用python添加附件发送时报错:Cannot attach additional subparts to non-multipart/*


查询得知,错误的原因在于缺少这行代码:

msg = MIMEMultipart()

将这行加上:msg = MIMEMultipart() 即可


邮件收不到的几种原因


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

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

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

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

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

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

相关文章
|
2月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
1月前
|
JSON 前端开发 测试技术
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
107 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
|
22天前
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
|
1月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
72 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
22天前
|
存储 JSON API
Python测试淘宝店铺所有商品接口的详细指南
本文详细介绍如何使用Python测试淘宝店铺商品接口,涵盖环境搭建、API接入、签名生成、请求发送、数据解析与存储、异常处理等步骤。通过具体代码示例,帮助开发者轻松获取和分析淘宝店铺商品数据,适用于电商运营、市场分析等场景。遵守法规、注意调用频率限制及数据安全,确保应用的稳定性和合法性。
|
1月前
|
存储 数据采集 数据格式
Python自动化Office文档处理全攻略
本文介绍如何使用Python自动化处理Word、Excel和PDF文档,提升办公效率。通过安装`python-docx`、`openpyxl`、`pandas`、`PyPDF2`和`pdfplumber`等库,可以轻松实现读取、修改、创建和批量处理这些文档。具体包括:自动化处理Word文档(如读取、修改内容、调整样式),Excel文档(如读取、清洗、汇总数据),以及PDF文档(如提取文本和表格数据)。结合代码示例和实战案例,帮助你掌握高效办公技巧,减少手动操作的错误率。
63 1
|
2月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
122 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
16天前
|
监控 API 开发工具
Socket.IO介绍,以及怎么连接测试Socket.IO接口?
Socket.IO 是一个用于浏览器和服务器间实时双向通信的库,支持低延迟消息传递、跨平台运行及自动重连。文章介绍了其特点与调试需求,并详细说明如何使用 Apifox 工具创建、连接、发送/接收 Socket.IO 事件,以及团队协作和调试技巧。掌握这些技能可提升实时应用开发效率与质量。
|
1月前
|
小程序 测试技术 数据安全/隐私保护
微信公众号接口测试实战指南
微信公众号接口测试是确保系统稳定性和功能完整性的重要环节。本文详细介绍了测试全流程,包括准备、工具选择(如Postman、JMeter)、用例设计与执行,以及常见问题的解决方法。通过全面测试,可以提前发现潜在问题,优化用户体验,确保公众号上线后稳定运行。内容涵盖基础接口、高级接口、微信支付和数据统计接口的测试,强调了功能验证、性能优化、安全保护及用户体验的重要性。未来,随着微信生态的发展,接口测试将面临更多挑战和机遇,如小程序融合、AI应用和国际化拓展。
|
2月前
|
存储 测试技术 数据库
接口测试工具攻略:轻松掌握测试技巧
在互联网快速发展的今天,软件系统的复杂性不断增加,接口测试工具成为确保系统稳定性的关键。它如同“翻译官”,模拟请求、解析响应、验证结果、测试性能并支持自动化测试,确保不同系统间信息传递的准确性和完整性。通过Apifox等工具,设计和执行测试用例更加便捷高效。接口测试是保障系统稳定运行的第一道防线。

热门文章

最新文章