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中的进程、线程、协程
Mar 18 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
浅谈python字典多键值及重复键值的使用
Nov 04 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python实现公司年会抽奖程序
Jan 22 Python
python使用正则筛选信用卡
Jan 27 Python
python gdal安装与简单使用
Aug 01 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
python实现mean-shift聚类算法
Jun 10 Python
Django如何批量创建Model
Sep 01 Python
用Python进行栅格数据的分区统计和批量提取
May 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
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
php DES加密算法实例分析
2019/09/18 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
JS作用域深度解析
2016/12/29 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
python正则表达式re之compile函数解析
2017/10/25 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
html5中监听canvas内部元素点击事件的三种方法
2019/04/28 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
大学生的应聘自我评价
2013/12/13 职场文书
法人委托书
2014/07/31 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
大学同学聚会感言
2015/07/30 职场文书
安全教育的主题班会
2015/08/13 职场文书
初中体育教学随笔
2015/08/15 职场文书
Python中的 enumerate和zip详情
2022/05/30 Python