python smtplib模块自动收发邮件功能(二)


Posted in Python onMay 22, 2018

接上篇python smtplib模块自动收发邮件功能(一) ,用python smtplib模块实现了发送邮件程序了,那么接下来我们需要现在要解决的问题如何在 test_report\目录下找到最新生成的报告,只有找到了才能把发邮件功能,然后将其集成到我们的自动化测试应用中.

一、获取最新的test_report

#coding=utf-8
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import os,datetime,time

result_dir='C:\\Python34\\test_report' # test_report的绝对路径 

lists=os.listdir(result_dir)
print (lists)
lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn)
   if not os.path.isdir(result_dir+"\\"+fn) else 0)
print ('最新的文件为:'+lists[-1])
file=os.path.join(result_dir,lists[-1])
print (file)

F5,运行,得到:

python smtplib模块自动收发邮件功能(二)

那么 C:\Python34\test_report\2016-03-24-16_00_34_result.html是最新的test_report

二、整合自动发送邮件功能

主要实现以下几部分:

1.运行相关的 cases 生成HTMLtest report。
2.将test report发送到指定邮箱。

直接上脚本:

import unittest
import HTMLTestRunner
import os
import time
import datetime

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.header import Header


#定义发送邮件
def sentemail(file_new):
 #发信邮箱
 sender='abc@cieXXX.com'
 #收信邮箱
 receiver='12345@qq.com'
 #定义正文
 f=open(file_new,'rb')
 mail_body=f.read()
 f.close()
 msg=MIMEText(mail_body,_subtype='html',_charset='utf-8')
 #定义标题
 msg['Subject']=u"搜狗搜索测试报告"
 msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')
 smtp=smtplib.SMTP()
 #smtpserver='smtp.263xmail.com'
 smtp.connect('smtp.263xmail.com')
 username='abc@cieXXX.com'
 password='123456'
 smtp.login(username,password)
 smtp.sendmail(sender,receiver,msg.as_string())
 smtp.quit()
 print ('Email has been sent out!')

#查找测试报告,调用收发邮件功能
def sendreport():
 result_dir='C:\\Python34\\test_report'
 lists=os.listdir(result_dir)
 lists.sort(key=lambda fn: os.path.getmtime(result_dir+"\\"+fn)
   if not os.path.isdir(result_dir+"\\"+fn) else 0)
 #print (u'最新测试生成的报告:'+lists[-1])
 print (u'最新测试生成的报告:'+lists[-2])

 #找到最新生成的文件
 #file_new=os.path.join(result_dir,lists[-1])
 file_new=os.path.join(result_dir,lists[-2])
 print (file_new)
 sentemail(file_new)

listaa='C:\\Python34\\test_case'
def createsuitel():
 testunit=unittest.TestSuite()
 '''discover方法定义'''
 discover=unittest.defaultTestLoader.discover(listaa,
             pattern='UnitTestHtml_*.py',
             top_level_dir=None)
 for test_suite in discover:
  for test_case in test_suite:
   testunit.addTests(test_case)
   print (testunit)
 return testunit
alltestnames=createsuitel()
now = time.strftime('%Y-%m-%d-%H_%M_%S',time.localtime(time.time()))
file_name='C:\\Python34\\test_report\\'+now+'_result.html'
fp = open(file_name, 'wb')
runner =HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'搜狗搜索测试报告',
description=u'用例执行情况:')

if __name__=="__main__": 
 runner.run(alltestnames)
 time.sleep(2)
 sendreport()
 fp.close()

F5运行,得到:

python smtplib模块自动收发邮件功能(二) 

查看邮箱,如图所示:

python smtplib模块自动收发邮件功能(二) 

打开邮件内容,如图所示:

python smtplib模块自动收发邮件功能(二)

OK,就这样实现了实际项目中的自动收发邮件功能。

另,几个知识点:
1. os.listdir()
用于获取目录下的所有文件列表
2. lists.sort()
Python 列表有一个内置的列表。sort()方法用于改变列表中元素的位置。
3. key=lambda fn:
key 是带一个参数的函数,用来为每个元素提取比较值.默认为 None, 即直接比较每个元素.
4.os.path.isdir()
isdir()函数判断某一路径是否为目录
5.lists[-1]
-1 表示取文件列表中的最大值,也就是最新被创建的文件.
6.os.path.join()
join()方法用来连接字符串,通过路径与文件名的拼接,我们将得到目录下最新被创建的的文件名的完整路径。
7.sentmail(file_new)
定义一个 sentmail()发邮件函数,接收一个参数 file_new,表示接收最新生成的测试报告文件.
8.open(file_new, ‘rb')
以读写(rb)方式打开最新生成的测试报告文件.
9.sendreport()
定义 sendreport()用于找最新生成的测试报告文件 file_new.

在成功实现这个sample之前,遇到过1个问题:
指定的邮箱可以正常收到邮件,但所得到的邮件内容是空的,这是由于 HTMLTestRunner 报告文件的机制所引起的。在测试用例运行之前生成报告文件,在整个程序没有彻底运行结束前,程序并没有把运行的结果写入到文件中,所以,在用例运行完成后发邮件,造成邮件内容是空的。

最开始的脚本,其中两行是这样的:

print (u'最新测试生成的报告:'+lists[-1])
#找到最新生成的文件
file_new=os.path.join(result_dir,lists[-1])

于是,运行结束后,出现了问题,指定的邮箱可以正常收到邮件,但所得到的邮件内容是空的。也就是说,脚本运行还没有结束,就已经执行了邮件的自动发送功能。

于是,将上述的两行,改后的脚本:

print (u'最新测试生成的报告:'+lists[-2]) 
#找到最新生成的文件
file_new=os.path.join(result_dir,lists[-2])

所以,我们不能在整个程序未运行结束时发送当前的测试报告,我们可以选择上一次运行结果的报告进行发送。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现栈的方法
May 26 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
python 自动去除空行的实例
Jul 24 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Django处理多用户类型的方法介绍
May 18 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 Python
Python字符串常规操作小结
Apr 03 Python
python smtplib模块自动收发邮件功能(一)
May 22 #Python
python模块smtplib学习
May 22 #Python
Pipenv一键搭建python虚拟环境的方法
May 22 #Python
PyTorch线性回归和逻辑回归实战示例
May 22 #Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 #Python
python利用smtplib实现QQ邮箱发送邮件
May 20 #Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 #Python
You might like
玩家交还《星际争霸》原始码光盘 暴雪报以厚礼
2017/05/05 星际争霸
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python实现数据库并行读取和写入实例
2017/06/09 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
详解Python with/as使用说明
2018/12/13 Python
Flask-WTF表单的使用方法
2019/07/12 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python 串行执行和并行执行实例
2020/04/30 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
校园招聘策划书
2014/01/09 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
2016年校长新年寄语
2015/08/17 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS