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+Wordpress制作小说站
Apr 14 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
对python中list的五种查找方法说明
Jul 13 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python tkinter实现连连看游戏
Nov 16 Python
Python 多进程原理及实现
Dec 21 Python
Python基础之Socket通信原理
Apr 22 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
实操Python爬取觅知网素材图片示例
Nov 27 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
深入extjs与php参数交互的详解
2013/06/25 PHP
浅析PHP原理之变量(Variables inside PHP)
2013/08/09 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
详解js中的几种常用设计模式
2020/07/16 Javascript
微信跳一跳游戏python脚本
2020/04/01 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
详解python中eval函数的作用
2019/10/22 Python
基于Python数据结构之递归与回溯搜索
2020/02/26 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
Python错误的处理方法
2020/06/23 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
自荐信格式范文
2013/10/07 职场文书
争论的故事教学反思
2014/02/06 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
公司仓库管理制度
2015/08/04 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android