使用python3的email模块和smtplib模块可以实现发送邮件的动能。email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并发送给项目组的人,在Common文件夹下新建my_email.py文件,项目结构如下。

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
import getcwd
import os
from Logs.log import log1
import time rq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
sender = '2474xxx@qq.com' #发件人邮箱
password = 'ryhnx****fybifj' #发件人邮箱密码
addressed_eamil = '24741xxx@qq.com' #收件人邮箱 path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxx接口自动化测试报告.html')#测试报告地址 def mail():
try:
# 创建一个带附件的实例
message = MIMEMultipart()
message['From']=formataddr(['发件人姓名',sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
log1.info('发件人邮箱:%s' % sender)
message['To']= formataddr(['收件人姓名',addressed_eamil]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
log1.info('收件人邮箱:%s' % addressed_eamil)
message['Subject']=rq+"xxx接口自动化测试报告" # 邮件的主题,也可以说是标题 # 邮件正文内容
message.attach(MIMEText('附件为xxx接口自动化测试报告', 'plain', 'utf-8')) # 构造附件1
att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
log1.info('读取附件')
att1["Content-Type"] = 'application/octet-stream'
# filename是附件名,附件名称为中文时的写法
att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxx接口自动化测试报告.html"))
# 附件名称非中文时的写法
# att["Content-Disposition"] = 'attachment; filename="test.html")'
message.attach(att1)
log1.info('添加附件') server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,一般端口是25
log1.info('连接QQ邮箱smtp服务')
server.login(sender,password) # 括号中对应的是发件人邮箱账号、邮箱密码
log1.info('连接成功')
server.sendmail(sender, addressed_eamil, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
log1.info("邮件发送成功")
except Exception:
log1.error("邮件发送失败",exc_info=1) mail()

收件人和发件人可以都填自己的QQ邮箱,from是发件人那一栏的展示。to是收件人的展示。如果要显示多个收件人,需要使用‘,’.join(邮箱数组)。最下面sendmail中第二个传收件人邮箱,如果要发给多个人,传数组。

email展示内容可以跟代码中对照着来看,更容易理解一点

以qq邮箱为例,在使用qq邮箱的SMTP服务时,需要在qq邮箱-账户中先开启,并且生成授权码,然后密码那里填写授权码

这样虽然实现了发邮件,但是也把邮件的收发人写死了,所以还是要完善。通过读取配置文件来确定收发人,在Common文件夹下Base_test.py文件增加如下代码

    def config_options(self,section):
'''读取配置文件某section下所有键'''
config = configparser.ConfigParser()
config.read(config_path,encoding="utf-8-sig")
username = config.options(section)
return username def get_addkey(self,user):
'''遍历获得配置文件收件人email'''
sum = 0
L = []
for i in user:
if sum < len(user):
emails = self.confige_get('addressed', i)
L.append(emails)
sum += 1
return L

然后修改配置文件

sender是设置发件人的,username是发件人的姓名,email是发件人邮箱,password是邮箱密码

addressed是设置收件人的,之后随便往下加就行了。xxx = 邮箱就可以了。

这样谁发邮件,哪些人收到邮件,都是可以配置的。

将my_email.py文件代码修改成如下

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
import getcwd
import os
from Logs.log import log1
from Common.Base_test import webrequests
import time rq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
my_mail = webrequests()
sender = my_mail.config_get('sender','email') # 发件人邮箱账号
password = my_mail.config_get('sender','password') # 发件人邮箱密码
usernmae = my_mail.config_get('sender','username') #发件人姓名
users = my_mail.config_options('addressed') #收件人
addressed_eamils = my_mail.get_addkey(users) #收件人邮箱 path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxx接口自动化测试报告.html') def mail():
try:
# 创建一个带附件的实例
message = MIMEMultipart()
message['From']=formataddr([usernmae,sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
log1.info('发件人姓名:%s' % usernmae)
log1.info('发件人邮箱:%s' % sender)
message['To']=';'.join(addressed_eamils) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
log1.info('收件人邮箱:' + ';'.join(addressed_eamils))
message['Subject']=rq + "xxx接口自动化测试报告.html" # 邮件的主题,也可以说是标题 # 邮件正文内容
message.attach(MIMEText('附件为xxx接口自动化测试报告.html', 'plain', 'utf-8')) # 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
log1.info('读取附件')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxx接口自动化测试报告.html"))
# 附件名称非中文时的写法
# att["Content-Disposition"] = 'attachment; filename="test.html")'
message.attach(att1)
log1.info('添加附件') server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
log1.info('连接QQ邮箱smtp服务')
server.login(sender,password) # 括号中对应的是发件人邮箱账号、邮箱密码
log1.info('连接成功')
server.sendmail(sender, addressed_eamils, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
log1.info("邮件发送成功")
except Exception:
log1.error("邮件发送失败",exc_info=1)

在entrance.py文件开头加上import Common.my_email,在最后加上Common.my_email.mail(),然后执行

整个框架系列就介绍到这里了

python3+requests库框架设计08-发送邮件的更多相关文章

  1. python3+requests库框架设计01-自动化测试框架需要什么?

    什么是自动化测试框架 关于自动化测试框架的定义有很多,在我大致理解下就是把能实现不同功能的软件组合在一起,实现特定的目的,这就是一个简单的自动化测试框架. 接口自动化测试框架核心无非是选择 一个用来编 ...

  2. python3+requests库框架设计03-请求重新封装

    在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个Common文件夹,在文件夹下新建Base_test.py文件,项目结构如下. 具体怎么封装还是要看被测 ...

  3. python3+requests库框架设计05-unittest单元测试框架

    unittest单元测试框架,主要由四部分组成:测试固件.测试用例.测试套件.测试执行器 测试固件(test fixture) 测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫 ...

  4. python3+requests库框架设计04-配置文件

    python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,可以自行百度学习,也可以看Python3学习笔记27-ConfigParser模块 配置文件一般存放着环境信息,比如u ...

  5. python3+requests库框架设计02-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  6. python3+requests库框架设计07-生成测试报告

    使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...

  7. python3+requests库框架设计06-测试脚本

    在项目下新建TestCase文件夹,然后新建.py文件在文件中写关于接口具体的测试脚本,一般我喜欢按照模块来分,一个模块一个.py文件,建议以test开头命名文件 把配置文件改成这样 url:http ...

  8. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  9. python3 requests库学习笔记(MOOC网)

    奏:HTTP协议对资源的操作 方法说明:GET 请求获取URL位置的资源HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息POST 请求向URL位置的资源后附加新的数据PUT 请求 ...

随机推荐

  1. SpringMvc+jQuery 文件拖拽上传、选择上传

    最近做了个简易的基于boostrap的文件上传功能,jsp版本的,后续会完善更多的功能,不过现在已经能用了,需要的小伙伴,直接引用下面的文件内容直接copy到自己的项目中就ok了,效果如图: file ...

  2. Kafka技术内幕 读书笔记之(五) 协调者——消费组状态机

    协调者保存的消费组元数据中记录了消费组的状态机 , 消费组状态机的转换主要发生在“加入组请求”和“同步组请求”的处理过程中 .协调者处理“离开消费组请求”“迁移消费组请求”“心跳请求” “提交偏移量请 ...

  3. Springboot中Feign的使用总结

    Feign是Webservice服务的客户端,创建接口+注解就可完成,实现简单 客户端通过@EnableFeignClients开启Feign的支持功能 @SpringBootApplication ...

  4. IO流--序列化流与反序列化流

    IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): ...

  5. Java9+版本中,Interface的内容

    使用接口的注意事项: 1.接口没有静态代码块或者构造方法 2.一个类的父类是唯一的,但是一个类可以同时实现多个接口(区别) 3.如果实现类实现多个接口有重名的抽象方法,那么实现类只需要覆盖重写一个即可 ...

  6. python模块之os sys shutil

    os模块 os模块是与操作系统交互的一个接口 #当前执行这个python文件的工作目录相关的工作路径 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir( ...

  7. 函数的作用域、global与nonlocal

    global 表示不再使用局部局部作用域中的内容,而是改用全局作用域中的变量 a = 100 def func(): global a # 表示不再局部创建这个变量,而是直接使用这个全局的a a = ...

  8. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  9. 大规模数据导入和导出(sqlserver)

    请期待... https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools#RHEL msodbcsql-13.1.6 ...

  10. 最好用的js前端框架、组件、文档在线预览插件

    这里收集的都是个人认为比较好的js框架.组件 js前端ui框架 此处列举出个人认为最好的几个框架(排序即排名),现在好点的框架商用都需要付费,以下几个也不例外,但是由于组件丰富,都可以作为企业应用的完 ...