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

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

具体代码如下。

#!/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 = '2474xxx48@qq.com' #发件人邮箱
password = 'kfsxmczzlinbbifj' #发件人邮箱密码
addressed_eamil = '2474xxx48@qq.com' #收件人邮箱 path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxxUI自动化测试报告.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+"xxxUI自动化测试报告" # 邮件的主题,也可以说是标题 # 邮件正文内容
message.attach(MIMEText('附件为xxxUI自动化测试报告', '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", "", "xxxUI自动化测试报告.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展示内容可以跟代码中对照着来看,更容易理解一点

这样虽然实现了发邮件,但是也把邮件的收发人写死了,所以还是要完善。通过读取配置文件来确定收发人,在framework文件夹下Base_Page.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.config_get(i,'addressed')
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 framework.Base_Page import BasePage
import time rq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
my_mail = BasePage(driver=1)
sender = my_mail.config_get('email','sender') # 发件人邮箱账号
password = my_mail.config_get('password','sender') # 发件人邮箱密码
usernmae = my_mail.config_get('username','sender') #发件人姓名
users = my_mail.config_options('addressed') #收件人
addressed_eamils = my_mail.get_addkey(users) #收件人邮箱 path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxxUI自动化测试报告.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 + "xxxUI自动化测试报告.html" # 邮件的主题,也可以说是标题 # 邮件正文内容
message.attach(MIMEText('附件为xxxUI自动化测试报告.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", "", "xxxUI自动化测试报告.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文件开头加上from framework.my_email import mail,在最后加上mail(),然后执行

这样在执行完测试之后邮件就发送出去了,也可以在配置文件中加上开关,比如0发送邮件,1不发送邮件,方便调试代码。整个框架就写到这里,其实还有很多可以完善的。

python3+selenium框架设计10-发送邮件的更多相关文章

  1. python3+selenium框架设计02-自动化测试框架需要什么

    什么是自动化测试框架 自动化测试框架能够提供便利给用户高效完成一些事情,比如,结构清晰开发脚本,多种方式.平台执行脚本,良好的日志和报告去跟踪脚本执行结果. 关于自动化测试框架的定义有很多,在我大致理 ...

  2. python3+selenium框架设计03-封装日志类

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

  3. python3+selenium框架设计01-Page Object

    页面对象模型Page Object Modal是一种脚本设计模型,将页面元素,业务操作分割,当实际页面发生变化的时候,只需要修改页面元素文件,业务操作不需要修改. 具体实现需要先写一个页面公共类,里面 ...

  4. python3+selenium框架设计07-unittest单元测试框架

    可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. ​ 在entrance ...

  5. python3+selenium框架设计06-编写POM测试用例

    之前我们已经把测试基类,配置文件操作,浏览器引擎类封装完成.接下来使用POM的设计思路来创建我们的测试用例.接下来看一个实例,先在项目下新建pageobject文件夹.这个文件夹下放所有要测试的页面类 ...

  6. python3+selenium框架设计05-配置文件和浏览器引擎类

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

  7. python3+selenium框架设计04-封装测试基类

    在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个framework文件夹,在文件夹下新建Base_Page.py文件,这是用来写测试基类的文件.在项目下 ...

  8. python3+selenium框架设计08-进一步实现POM

    之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...

  9. python3+selenium框架设计09-生成测试报告

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

随机推荐

  1. MySQL中的主键,外键有什么作用详解

    MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...

  2. 利用css3给座右铭设置漂亮的渐变色

    .footer-container .footer-content p .motto { font-weight: bolder; -webkit-background-clip: text; -we ...

  3. linq总结系列(一)---基础部分

    一.linq的基本概念 LINQ是C#和VB中的统一查询语法,使用对象来保存和检索来自不同来源(如数据库.xml.对象集合)的数据. 主要功能:消除了编程语言和数据库之间的不匹配,以及为不同类型的数据 ...

  4. spring-data-redis时效设置

    本人转自http://hbxflihua.iteye.com/blog/2320584#bc2396403 spring目前在@Cacheable和@CacheEvict等注解上不支持缓存时效设置,只 ...

  5. python爬虫慕课基础2

    实战演练:爬取百度百科1000个页面的数据 对于新手来说,可以把spider_main.py代码中的try和except去掉,运行报错就会在控制台出现,根据错误去调试自己的程序 发现以下错误: req ...

  6. Centos配置ARP和Tomcat Native

    Tomcat Native是用于Tomcat的一个可选组件,能够允许Tomcat使用一定的本地资源.性能.兼容性. 具体来说,Tomcat Native给了Tomcat访问 Apache Portab ...

  7. 改变this指向的三种方法

    call.apply.bind三者为改变this指向的方法. 共同点:第一个参数都为改变this的指针.若第一参数为null/undefined,this默认指向window call(无数个参数) ...

  8. 058、flannel概述(2019-03-27 周三)

    参考https://www.cnblogs.com/CloudMan6/p/7412150.html   flannel 是 CentOS开发的容器网络解决方案.flannel 为每个host分配一个 ...

  9. Django多表操作

    多表创建 创建模型 下面通过一个简单的图书管理系统,来阐述多表的创建和查询操作 在视图函数里里定义如下代码 from django.db import models class Book(models ...

  10. 二十九、Linux 进程与信号——minishell(2)

    编程内容: 1.完成  echo env export 命令 2.完成前后台进程 3.完成重定向 完整代码如下: 29.1 主函数.通用头文件和Makefile 29.1.1 主函数 mshell_m ...