python接口自动化之自动发送测试报告邮件

news2024/11/25 0:33:40

前言

​ SMTP(Simple Mail Transfer Protocol)也就是简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。python的smtplib模块就提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。

​ python发邮件主要需要两个模块:smtplib和email,这两个模块是python自带的库,import即可使用。smtplib主要负责发送邮件,即一个发送邮件的动作,如连接邮箱服务器,登录邮箱,发送邮件。email主要负责构造邮件,指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

smtp授权

​ 上面已经说到发送邮件是基于smtp服务的,那么我们就需要一个可以登录smtp服务器的账号及授权码,这里以qq邮箱为例,登录qq邮箱后,在设置》账户这里就可以开启smtp,开启后发送短信获取授权码即可。

发送邮件

​ 涉及的部分参数说明:

  • 连接到smtp服务器:smtplib.SMTP_SSL(smtp服务器地址, 端口号)
  • 登录smtp服务器:smtp.login(smtp邮件地址, 登录smtp的授权码)
  • 构造邮件对象:MIMEMultipart()
  • 创建邮件内容:MIMEText(邮件内容, "plain", "utf8")两个参数文本类型,编码格式;如果要发送html格式的邮件内容,则把plain(默认)替换成html
  • 把相关内容添加到邮件:smg.attach(具体的内容),添加邮件内容
  • 设置邮件主题:smg["Subject"] = 主题内容
  • 设置邮件发件人:smg["From"] = 邮件地址
  • 设置邮件收件人:smg["To"] = 邮件地址
  • 发送邮件:smtp.send_message(邮件对象, from_addr=发件人邮件地址, to_addrs=收件人邮件地址)如果有多个收件人则用list格式传给to_addrs
  • 创建附件:MIMEApplication(附件内容)
  • 创建图片:MIMEImage(图片内容),与附件一样
  • 设置附件或图片等:file_msg.add_header(\_name, \_value, **\_params):扩展标题设置,_name为要添加的标题字段,_value为标题的值。msg.add_header('Content-ID', 'imgid') #设置图片IDmsg.add_header('Content-Disposition', 'attachment', filename='test.xlsx')#为附件添加一个标题msg.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', '中文标题')) #添加非ASCII字符时需指定编码
import smtplib
from email.mime.text import MIMEText    # 创建文本内容的邮件内容
from email.mime.multipart import MIMEMultipart  # 创建带附件的实例
from email.mime.application import MIMEApplication  # 用于创建附件的
from email.mime.image import MIMEImage   # 用于创建图片,与添加附件一样的,下面不做举例


# 第一步: 连接到smtp服务器
smtp = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtp.login("xxxxxx@qq.com","afajccbab")

# 第二步:构建邮件
smg = MIMEMultipart()
text_smg = MIMEText("这是邮件文本内容", "plain", "utf8")	# 邮件内容
smg.attach(text_smg)	# 添加到邮件

# 添加附件
file_msg = MIMEApplication(open(r"C:\project\test\reports\report.html","rb").read())
file_msg.add_header('content-disposition', 'attachment', filename='report.html')
smg.attach(file_msg)	# 添加到邮件

smg["Subject"] = "测试测试"	# 主题
smg["From"] = "aaaaaa@qq.com" # 邮件内显示的发件人
smg["To"] = "bbbbb@163.com" # 邮件内显示的收件人

# 第三步发送邮件
smtp.send_message(smg, from_addr="aaaaaa@qq.com", to_addrs="bbbbb@163.com")

​ 还有更多的用法,有兴趣的可以再深入研究。

封装及应用

​ 下面是一个简单的封装例子,可以根据自己的需要优化,甚至可以把邮件的主题、发件人、收件人以及smtp的登录邮箱授权密码等提取出来放到配置文件来维护。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


def send_email(file_path):

    smtp = smtplib.SMTP_SSL("smtp.qq.com",465)
    smtp.login("xxxxx@qq.com","smtp登录密码")

    smg = MIMEMultipart()
    text_smg = MIMEText("这是邮件文本内容", "plain", "utf8")
    smg.attach(text_smg)

    file_msg = MIMEApplication(open(file_path,"rb").read())
    file_msg.add_header('content-disposition', 'attachment', filename='report.html')
    smg.attach(file_msg)
    
    smg["Subject"] = "测试报告"
    smg["From"] = "aaaaaa@qq.com"
    smg["To"] = "bbbbbbb@163.com"
    smtp.send_message(smg,from_addr="aaaaaa@qq.com",to_addrs="bbbbbbb@163.com")

​ 测试报告都是测试用例运行完之后才生成,那么我们就可以把发邮件这一步放到测试报告生成之后:

import unittest
import os
from common.contants import CASE_DIR, REPORT_DIR
from common.send_email import send_email

# 第一步:创建测试套件
suite = unittest.TestSuite()

# 第二步加载用例到套件
loader = unittest.TestLoader()
suite.addTest(loader.discover(CASE_DIR))

report_path = os.path.join(REPORT_DIR, "report.html")
with open(report_path, "wb") as f:
    runner = HTMLTestRunner(stream=f,
                            title="24期的测试报告",
                            description="测试报告的描述信息。。。。。",
                            tester="MuSen"
                            )
    # 运行测试套件
    runner.run(suite)

# 执行完代码之后,发送报告
send_email(report_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四 、Mysql 开发

四 、Mysql开发 102 可以使用MySQL直接存储文件吗? 可以使用 BLOB (binary large object),用来存储二进制大对象的字段类型。 TinyBlob 255 值的长度加上用于记录长度的1个字节(8位) Blob 65K值的长度加上用于记录长度的2个字节(16位) MediumBlob 16M值…

AutoJS自定义悬浮菜单(附完整代码)

我们在开发Autojs脚本时,需要使用到悬浮窗功能来控制脚本。那么到底要如何来做呢?今天给大家分享一些,先来看看效果: 调整移动和贴边。 防止滑出屏幕 附上完整代码 var storage storages.create("日赚3万_短视频合集&quo…

以Java的方式将文件上传到阿里云OSS

文章目录 1. 开通对象存储服务2. 创建 AccessKey 密钥3. 通用代码实现 1. 开通对象存储服务 控制台 → 对象存储 OSS → 立即开通 Bucket列表 → 点击创建 Bucket 填写名称、地域,名称创建后不可修改,地域选择最近的,存储类型选择标准存储&…

OpenCV: 对“google::protobuf::internal::Release_CompareAndSwap”的未定义

解决办法: 需要在文件 protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h 中的以下补丁 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, …

Ajax-AJAX请求的不同发送方式

🥔:你一定能成为想要成为的人 发送AJAX请求不同方式 发送AJAX请求不同方式1、jQuery发送AJAX请求2、axios发送AJAX请求(重点)3、fetch发送AJAX请求 发送AJAX请求不同方式 1、jQuery发送AJAX请求 首先需要jquery的js文件&#xf…

Linux shell yes命令(不停输出换行的y)(不停输出换行的指定字符串)(脚本自动确认y)

文章目录 yes命令功能doc文档英文中文翻译完整文档 示例应用案例自动为脚本多次确认y yes命令功能 yes命令可以不断地输出换行的指定字符串,不加参数时,不断输出换行的“y”,有时我们需要执行一些需要用户键入“y”确认的脚本,但…

挖掘Java集合:深入探索List接口与HashSet

文章目录 引言LinkedList:双向链表的实现构造方法LinkedList中的常用方法HashSet:无序且唯一的集合HashSet的实现方式LinkedHashSet:有序且唯一可变长度参数结论 引言 在广阔的Java编程领域中,集合就如同宝库,提供了多…

Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算

笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。 首先我们假设一个Clickhouse数…

python基础3——流程控制

文章目录 一、操作符1.1 比较操作符1.2 逻辑操作符1.3 成员操作符1.4 身份操作符 二、流程控制2.1 条件判断2.2 循环语句2.2.1 for循环2.2.2 while循环 2.3 continue与break语句2.4 文件操作函数 三、函数3.1 定义函数3.2 作用域3.3 闭包3.4 函数装饰器3.5 内建函数 一、操作符…

一文看懂 D类数字功放原理及应用

他V hezkz17进数字音频系统研究开发交流答疑群(课题组) D类放大器工作在开关状态,作为控制元件的晶体管本身消耗功率较低,功放的效 率就高,可达 90%以上,因此能较大地降低能源损耗,减小放大器体积。D 类音 频功率放大器…

面试热题(最长上升子序列)

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 输入&#xff1…

Docker容器监控(Cadvisor +Prometheus+Grafana)

环境部署,接着上一篇文章Docker容器部署(Cadvisor InfluxDBGrafana)开始 目录 1、先清理一下容器 2、部署Cadvisor 3、访问Cadvisor页面 4、部署Prometheus 5、准备配置 6、运行prometheus容器 7、访问prometheus页面 8、部署Grafan…

录屏怎么录声音?很简单,轻松操作!

“录屏的时候怎么把声音录进去呀?今天用手机录了一段视频,录完后打开却发现没有声音,真的服了,录了好久了,有没有人知道怎么才能录制声音呀?” 录屏是一种非常实用的技术,可以帮助我们记录屏幕…

PHPstudy配置伪静态步骤,tp5.1的框架

搜索mod_rewrite.so&#xff0c;然后去掉前面的#&#xff08;即放开注释&#xff09; 2.找到index.php 同级文件.htaccess&#xff08;没有就新建&#xff09; 这些是tp5.1自带的内容&#xff0c;把它注释掉&#xff0c;是错误的内容&#xff0c;添加下面的这段配置 #<If…

SIT1042AQ5V 供电,IO 口兼容 3.3V,±58V 总线耐压,CAN FD 待机模式总线收发器

等领域&#xff0c;支持 5Mbps 灵活数据速率 CAN FD &#xff0c;具有在总线与 CAN 协议控制器之间进行差分信号传 输的能力。 SIT1042AQ 为 SIT1042Q 芯片的升级版本&#xff0c;改善了总线信号的对称性&#xff0c;拥有更低的电磁辐射性能。 另外&#xff0c;SIT104…

ffplay数据结构分析(一)

本文为相关课程的学习记录&#xff0c;相关分析均来源于课程的讲解&#xff0c;主要学习音视频相关的操作&#xff0c;对字幕的处理不做分析 下面我们对ffplay的相关数据结构进行分析&#xff0c;本章主要是对PacketQueue的讲解 struct MyAVPacketList和PacketQueue队列 ffp…

线程池-手写线程池C++11版本(生产者-消费者模型)

本项目是基于C11的线程池。使用了许多C的新特性&#xff0c;包含不限于模板函数泛型编程、std::future、std::packaged_task、std::bind、std::forward完美转发、std::make_shared智能指针、decltype类型推断、std::unique_lock锁等C11新特性功能。 本项目有一定的上手难度。推…

浏览器是如何渲染页面的?

浏览器是如何渲染页面的&#xff1f; 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0c;开启渲染流程。 整个渲染流程分…

对员工画饼out了,领导力之我的地盘TA做主

90后的员工为什么爱离职? 我想了一年&#xff0c;才嗅到一丝隐晦的内味。因为不结婚、不生娃、不买房、不买车&#xff0c;没压力&#xff0c;骂TA还敢顶嘴。 员工动力不足&#xff0c;没有干劲&#xff0c;宁愿熬夜打游戏&#xff0c;也不愿意多加班&#xff0c;到底是工资…

Springboot03--restful、swagger+orm/mybatis,mybatis-plus

参考这个方法配置&#xff0c;主要是我的springboot和swagger的版本号的问题 SpringBoot2.7.14集成Swagger3.0 (liqinglin0314.com) 常用的一些注解 放在controller里面 2. mybatisplus <!-- MyBatisPlus依赖--><dependency><groupId>com.baomidou</gr…