1.1 自动发送邮件
1.1.1 自动发送(无附件)
Python的smtplib模块提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。使用SMTP对象的sendmail方法发送邮件。
内容如下编写:
'''发送邮件:正文''' # coding=utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header #发送邮箱服务器 smtpserver="smtp.126.com" #发送邮箱用户名和密码 username="tianshixia111@126.com" password="1121228" #发送邮箱 sender="tianshi1212@126.com" #接收邮箱 receiver="tianshi1111@126.com" #邮件主题 subject="邮件主题信息:标题,是的,就酱~~~" #html类型的邮件正文 msg=MIMEText('<html><h1>同学你好~!这是自动发给你的邮件,请问怎么文字换行显示呢?</h1></html>','html','utf-8') msg['subject']=Header(subject,'utf-8') #连接发送邮件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username,password) smtp.sendmail(sender,receiver,msg.as_string()) smtp.quit()
邮件内容:
1.1.2 自动发送含附件
# 发送邮件:附件 # coding=utf-8 import smtplib from email.mime.text import MIMEText #MIMRText()定义邮件正文 from email.header import Header from email.mime.multipart import MIMEMultipart #MIMEMulipart模块构造带附件 #发送邮箱服务器 smtpserver="smtp.126.com" #发送邮箱用户名和密码 username="tianshixiao8@126.com" password="jxba0128" #发送邮箱 sender="tianshixiao8@126.com" #接收邮箱 receiver="tianshixiao8@126.com" #邮件主题 subject="邮件主题信息:标题,有附件,是的~就酱~~~" #发送附件 sendfile = open('D:Report_180519-120941.html','rb').read() att = MIMEText(sendfile,'base64','utf-8') att["Content-Type"] = "application/octet-stream" att["Content-Disposition"] = 'attachment;filename = "Report_180519-120941.html"' msgroot = MIMEMultipart('related') msgroot['Subject'] = subject msgroot.attach(att) #连接发送邮件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username,password) smtp.sendmail(sender,receiver,msgroot.as_string()) smtp.quit()
邮件内容:
注:原来本句为如下编写:
att["Content-Disposition"] = "attachment;filename = 'Report_180519-120941.html'"
导致邮件的附件含’’,如下图
后改为:
att["Content-Disposition"] = 'attachment;filename =
"Report_180519-120941.html"' 正常。
1.1.3 查找最新报告(筛选文件)
# 查找最新的html文件 #coding=utf-8 import os #定义文件目录 result_dir=".\" lists=os.listdir(result_dir) #将文件放在列表中 reports = [] for file in lists: if file.startswith("Report") and file.endswith(".html"): #筛选以Report开头的html格式的文件 reports.append(file) # 排序html格式的文件 reports.sort(key=lambda fn: os.path.getmtime(result_dir+"\"+fn)) #打印出最新的文件 print (reports[-1]) file=os.path.join(result_dir,reports[-1]) print (file)
1.1.4 整合自动发送邮件
步骤:
1、 通过unittest框架的discover()找到匹配的测试用例,由HTMLTestRunner的run()方法执行测试用例并生成测试报告;
2、 调用第一种写法的findnew()的findfile()或第二种写法findfile()找到最新的测试报告,返回测试报告的路径;
3、 将该报告传给send_mail()函数,将报告以正文的形式发送。
粗糙暴力写法:
# 因为原目录下不仅仅有report文件,所以对report文件进行了筛选 # =====查找最新的html文件(在筛选后的文件列表中排序寻找最新的) #coding=utf-8 import os class findnew(): def __init__(self,result_dir,lists): self.result_dir = result_dir self.lists = lists def findfile(self): #定义文件目录 self.lists.sort(key=lambda fn: os.path.getmtime(self.result_dir+"\"+fn)) # 排序html格式的文件 file1=os.path.join(self.result_dir,reports[-1]) #返回最新的文件 return file1 # =====发送邮件:附件 # coding=utf-8 import smtplib from email.mime.text import MIMEText #MIMRText()定义邮件正文 from email.header import Header from email.mime.multipart import MIMEMultipart #MIMEMulipart模块构造带附件 def send_mail(reportfile): f = open(reportfile,'rb') #将报告的内容赋给变量mail_body mail_body = f.read() f.close() #发送邮箱服务器 smtpserver="smtp.126.com" #发送邮箱用户名和密码 username="tianshixiao8@126.com" password="jxba0128" #发送邮箱 sender="tianshixiao8@126.com" #接收邮箱 receiver="tianshixiao8@126.com" #邮件主题 subject="邮件主题信息:标题,有附件,是的~就酱~~~" msg = MIMEText(mail_body,'html','utf-8') #正文为报告的内容 msg['subject']=Header(subject,'utf-8') #连接发送邮件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username,password) smtp.sendmail(sender,receiver,msg.as_string()) smtp.quit() # ======生成报告 import unittest from HTMLTestRunner import HTMLTestRunner import time if __name__ == '__main__': #定义测试用例的目录为当前目录 test_dir = '.\' discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py') now = time.strftime("%y%m%d-%H%M%S") filename = test_dir + '/' + 'Report_' + now + '.html' fp = open(filename,'wb') runner = HTMLTestRunner(stream=fp, #stream指定测试报告文件 title='计算器测试报告', #测试报告标题 description='用例执行情况如下:') #副标题 runner.run(discover) fp.close() lists1=os.listdir(test_dir) #将文件放在列表中 reports = [] for file in lists1: if file.startswith("Report") and file.endswith(".html"): #筛选以Report开头的html格式的文件 reports.append(file) newreport = findnew(test_dir,reports).findfile() print(newreport) send_mail(newreport)
另一种精致写法:
import os import smtplib from email.mime.text import MIMEText #MIMRText()定义邮件正文 from email.header import Header from email.mime.multipart import MIMEMultipart #MIMEMulipart模块构造带附件 import unittest from HTMLTestRunner import HTMLTestRunner import time #coding=utf-8 # 因为原目录下不仅仅有report文件,所以对report文件进行了筛选 # =====查找最新的html文件(先对文件进行筛选,然后再在筛选后的文件列表中排序寻找最新的) def findfile(result_dir): lists1=os.listdir(result_dir) #将文件放在列表中 reports = [] for file in lists1: if file.startswith("Report") and file.endswith(".html"): #筛选以Report开头的html格式的文件 reports.append(file) reports.sort(key=lambda fn: os.path.getmtime(result_dir+"\"+fn)) # 排序html格式的文件 file1=os.path.join(result_dir,reports[-1]) #返回最新的文件 return file1 # =====发送邮件:附件 def send_mail(reportfile): f = open(reportfile,'rb') #将报告的内容赋给变量mail_body mail_body = f.read() f.close() #发送邮箱服务器 smtpserver="smtp.126.com" #发送邮箱用户名和密码 username="tianshixiao8@126.com" password="jxba0128" #发送邮箱 sender="tianshixiao8@126.com" #接收邮箱 receiver="tianshixiao8@126.com" #邮件主题 subject="邮件主题信息:标题,有附件,是的~就酱~~~" msg = MIMEText(mail_body,'html','utf-8') #正文为报告的内容 msg['subject']=Header(subject,'utf-8') #连接发送邮件 smtp=smtplib.SMTP() smtp.connect(smtpserver) smtp.login(username,password) smtp.sendmail(sender,receiver,msg.as_string()) smtp.quit() # ======生成报告,并发送 if __name__ == '__main__': #定义测试用例的目录为当前目录 test_dir = '.\' discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py') now = time.strftime("%y%m%d-%H%M%S") filename = test_dir + '/' + 'Report_' + now + '.html' fp = open(filename,'wb') runner = HTMLTestRunner(stream=fp, #stream指定测试报告文件 title='计算器测试报告', #测试报告标题 description='用例执行情况如下:') #副标题 runner.run(discover) fp.close() newreport = findfile(test_dir) send_mail(newreport)
执行结果: