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中的一些高级编程技巧
Apr 02 Python
简单介绍Python中的round()方法
May 15 Python
使用python加密自己的密码
Aug 04 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
pandas的object对象转时间对象的方法
Apr 11 Python
python更改已存在excel文件的方法
May 03 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
Python通过正则库爬取淘宝商品信息代码实例
Mar 02 Python
Pandas读取csv时如何设置列名
Jun 02 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
yii2 页面底部加载css和js的技巧
2016/04/21 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
jquery validate使用攻略 第四步
2010/07/01 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
对python 命令的-u参数详解
2018/12/03 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
解决c++调用python中文乱码问题
2020/07/29 Python
vscode调试django项目的方法
2020/08/06 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
采购员的工作职责
2013/12/26 职场文书
客服服务心得体会
2013/12/30 职场文书
计算机相关的自我评价
2014/01/15 职场文书
股东授权委托书范本
2014/09/13 职场文书
英语邀请函范文
2015/02/02 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书