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虚拟环境virualenv的安装与使用
Dec 18 Python
浅谈python标准库--functools.partial
Mar 13 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
Python实现视频自动打码的示例代码
Apr 08 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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
JAVA/JSP学习系列之七
2006/10/09 PHP
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
2016/09/23 Javascript
微信小程序日历效果
2018/12/29 Javascript
node.js微信小程序配置消息推送的实现
2019/02/13 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
python中使用np.delete()的实例方法
2021/02/01 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
毕业生多媒体设计求职信
2013/10/12 职场文书
企业读书活动总结
2014/06/30 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
员工辞职信范文大全
2015/05/12 职场文书
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL