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

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

具体代码如下。

  1. #!/usr/bin/python3
  2.  
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.utils import formataddr
  6. from email.mime.multipart import MIMEMultipart
  7. import getcwd
  8. import os
  9. from Logs.log import log1
  10. import time
  11.  
  12. rq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
  13. sender = '2474xxx48@qq.com' #发件人邮箱
  14. password = 'kfsxmczzlinbbifj' #发件人邮箱密码
  15. addressed_eamil = '2474xxx48@qq.com' #收件人邮箱
  16.  
  17. path = getcwd.get_cwd()
  18. file = os.path.join(path, 'report/xxxUI自动化测试报告.html')#测试报告地址
  19.  
  20. def mail():
  21. try:
  22. # 创建一个带附件的实例
  23. message = MIMEMultipart()
  24. message['From']=formataddr(['发件人姓名',sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
  25. log1.info('发件人邮箱:%s' % sender)
  26. message['To']= formataddr(['收件人姓名',addressed_eamil]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
  27. log1.info('收件人邮箱:%s' % addressed_eamil)
  28. message['Subject']=rq+"xxxUI自动化测试报告" # 邮件的主题,也可以说是标题
  29.  
  30. # 邮件正文内容
  31. message.attach(MIMEText('附件为xxxUI自动化测试报告', 'plain', 'utf-8'))
  32.  
  33. # 构造附件1
  34. att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
  35. log1.info('读取附件')
  36. att1["Content-Type"] = 'application/octet-stream'
  37. # filename是附件名,附件名称为中文时的写法
  38. att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxxUI自动化测试报告.html"))
  39. # 附件名称非中文时的写法
  40. # att["Content-Disposition"] = 'attachment; filename="test.html")'
  41. message.attach(att1)
  42. log1.info('添加附件')
  43.  
  44. server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,一般端口是25
  45. log1.info('连接QQ邮箱smtp服务')
  46. server.login(sender,password) # 括号中对应的是发件人邮箱账号、邮箱密码
  47. log1.info('连接成功')
  48. server.sendmail(sender, addressed_eamil, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
  49. server.quit() # 关闭连接
  50. log1.info("邮件发送成功")
  51. except Exception:
  52. log1.error("邮件发送失败",exc_info=1)
  53.  
  54. mail()

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

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

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

  1. def config_options(self,section):
  2. '''读取配置文件某section下所有键'''
  3. config = configparser.ConfigParser()
  4. config.read(config_path,encoding="utf-8-sig")
  5. username = config.options(section)
  6. return username
  7.  
  8. def get_addkey(self,user):
  9. '''遍历获得配置文件收件人email'''
  10. sum = 0
  11. L = []
  12. for i in user:
  13. if sum < len(user):
  14. emails = self.config_get(i,'addressed')
  15. L.append(emails)
  16. sum += 1
  17. return L

然后修改配置文件

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

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

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

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

  1. #!/usr/bin/python3
  2.  
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.utils import formataddr
  6. from email.mime.multipart import MIMEMultipart
  7. import getcwd
  8. import os
  9. from Logs.log import log1
  10. from framework.Base_Page import BasePage
  11. import time
  12.  
  13. rq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
  14. my_mail = BasePage(driver=1)
  15. sender = my_mail.config_get('email','sender') # 发件人邮箱账号
  16. password = my_mail.config_get('password','sender') # 发件人邮箱密码
  17. usernmae = my_mail.config_get('username','sender') #发件人姓名
  18. users = my_mail.config_options('addressed') #收件人
  19. addressed_eamils = my_mail.get_addkey(users) #收件人邮箱
  20.  
  21. path = getcwd.get_cwd()
  22. file = os.path.join(path, 'report/xxxUI自动化测试报告.html')
  23.  
  24. def mail():
  25. try:
  26. # 创建一个带附件的实例
  27. message = MIMEMultipart()
  28. message['From']=formataddr([usernmae,sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
  29. log1.info('发件人姓名:%s' % usernmae)
  30. log1.info('发件人邮箱:%s' % sender)
  31. message['To']=';'.join(addressed_eamils) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
  32. log1.info('收件人邮箱:' + ';'.join(addressed_eamils))
  33. message['Subject']=rq + "xxxUI自动化测试报告.html" # 邮件的主题,也可以说是标题
  34.  
  35. # 邮件正文内容
  36. message.attach(MIMEText('附件为xxxUI自动化测试报告.html', 'plain', 'utf-8'))
  37.  
  38. # 构造附件1,传送当前目录下的 test.txt 文件
  39. att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
  40. log1.info('读取附件')
  41. att1["Content-Type"] = 'application/octet-stream'
  42. # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
  43. att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxxUI自动化测试报告.html"))
  44. # 附件名称非中文时的写法
  45. # att["Content-Disposition"] = 'attachment; filename="test.html")'
  46. message.attach(att1)
  47. log1.info('添加附件')
  48.  
  49. server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
  50. log1.info('连接QQ邮箱smtp服务')
  51. server.login(sender,password) # 括号中对应的是发件人邮箱账号、邮箱密码
  52. log1.info('连接成功')
  53. server.sendmail(sender, addressed_eamils, message.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
  54. server.quit() # 关闭连接
  55. log1.info("邮件发送成功")
  56. except Exception:
  57. 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. db mysql / mysql cluster 5.7.19 / performance

    s 问题1: 数据库底层若表碎片化严重,导致表索引走向偏差,致使该表读写速度变慢,影响业务运行 解决1: 数据库表重组 end

  2. MyBatis-DynamicSQL IF判断

    在写动态sql时发现字符串的判断没有生效 <if test="CLLX != null and CLLX != ''"> and a.CLLX = #{CLLX} &l ...

  3. 4、JPA-EntityManager.merge()

    EntityManager#merge merge() 用于处理 Entity 的同步.即数据库的插入和更新操作 merge的几种情况 1. 若传入的是一个临时对象 package jpa.test; ...

  4. java语音转文字

    用到的百度提供的api 需要把wav音频文件转成16k的频率,必须转,不转百度api解析不出来.显示音频文件不清晰错误.想要转化还必须要有ffmpeg程序,这个自己百度去下载.然后拿转好的文件扔到百度 ...

  5. python 第一类对象 闭包 迭代器

    ########################总结########################### 1. 函数名 -> 第一类对象 函数名就是变量名. 函数可以赋值 函数可以作为集合类的 ...

  6. sql 三表左外链接的2种写法【原】

    初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...

  7. 数据库操作中如何批量执行多个sql文件?

    数据库操作中如何批量执行多个sql文件? 1.应用场景:在历史数据导入过程中,会发现有很多个表形成的.sql文件,要是一个一个文件去手动执行,实在是费时间,所以采取以下方法. 2.将文件放在一定位置, ...

  8. python+selenium 模拟登陆,自动下单

    目前写的实在太粗糙,留着,以后来写上

  9. [Android] Android 让UI控件固定于底部的几种方法

    Android 让UI控件固定于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_p ...

  10. SQL行列转置

    今天给公司同事们出了一道例行考试题,要求写一句SQL语句从上面表转换为下面表,经过艰难思索,一个同事做了出来. 小区             总数    A类车 B类车 C类车建业森林半岛     2 ...