import smtplib, email, os, time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header #设置smtplib所需的参数
smtpserver = 'smtp.qq.com' #SMTP服务器地址
username = 'xxx@qq.com' # 发件人地址,通过控制台创建的发件人地址
password = '******' # 发件人密码,通过控制台创建的发件人密码
receiver = ['xxx@dadaodata.com'] #单个收件人
# receivers = ['xxx@dadaodata.com', 'xxx@qq.com'] # 收件人地址或是地址列表,支持多个收件人,最多30个 # 构造邮件MIMEMultipart对象
msg = MIMEMultipart('mixed')
msg['Subject'] = Header('自动化测试报告' + time.strftime("%Y-%m-%d"), 'utf-8').encode()#自定义邮件主题
msg['From'] = '%s <%s>' % (username, username)#邮件发送者
msg['To'] = ";".join(receiver)#邮件接受者
msg['Message-id'] = email.utils.make_msgid()
msg['Date'] = email.utils.formatdate() # 构造文字内容
text_plain = MIMEText('附件为接口自动化测试报告,请查收!', 'plain', 'utf-8')#邮件内容
msg.attach(text_plain) #构造附件
test_report = r'F:\PythonAutomation\Python_PyCharm\TestReport' #存放文件的目录
lists = os.listdir(test_report) #列出目录的下所有文件保存到lists
lists.sort(key=lambda fn:os.path.getmtime(test_report + "\\" + fn)) #按时间排序
file_new = os.path.join(test_report,lists[-1]) #获取最新的文件保存到file_new
sendfile = open(file_new,'rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8')
text_att["Content-Type"] = 'application/octet-stream'
text_att["Content-Disposition"] = 'attachment; filename="report.html"'#重新命名附件
msg.attach(text_att) # 发送邮件
try:
# client = smtplib.SMTP()
# client.connect(smtpserver, 25) #SMTP普通端口为25
client = smtplib.SMTP_SSL() #python 2.7以上版本,若需要可使用SSL
client.connect(smtpserver, 465) #SSL端口465
# client.set_debuglevel(1) #用set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
client.login(username, password)
client.sendmail(username, receiver, msg.as_string())
client.quit()
print('邮件发送成功')
except smtplib.SMTPConnectError as e:
print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error)
except smtplib.SMTPAuthenticationError as e:
print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error)
except smtplib.SMTPSenderRefused as e:
print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error)
except smtplib.SMTPRecipientsRefused as e:
print('邮件发送失败,收件人被拒绝:', e.args, e.recipients)
except smtplib.SMTPDataError as e:
print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error)
except smtplib.SMTPException as e:
print('邮件发送失败: ', str(e))
except Exception as e:
print('邮件发送失败: ', str(e)) 执行结果如下:

【学习笔记】使用python将最新的测试报告以附件的形式发到指定邮箱的更多相关文章

  1. 吴裕雄--天生自然python学习笔记:python文档操作自动查找替换 Word 文件中的指定文字

    Win32com 组件提供了自动替换 Word 文件中指定文字 的功能 .在使用“查找” 功能替换文字之前,可先清除源文字及目标文字的格式,以免影响替换效果,语法为 : 替换 Word 文件特定文字的 ...

  2. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  3. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  4. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  5. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  6. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  7. 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接

    [学习笔记]Python 3.6模拟输入并爬取百度前10页密切相关链接 问题描述 通过模拟网页,实现百度搜索关键词,然后获得网页中链接的文本,与准备的文本进行比较,如果有相似之处则代表相关链接. me ...

  8. 学习笔记之Python 3

    学习笔记之Python 3 教程 https://www.cnblogs.com/pegasus923/p/7624416.html 学习笔记之X分钟速成Python3 https://www.cnb ...

  9. python 学习笔记 9 -- Python强大的自省简析

    1. 什么是自省? 自省就是自我评价.自我反省.自我批评.自我调控和自我教育,是孔子提出的一种自我道德修养的方法.他说:“见贤思齐焉,见不贤而内自省也.”(<论语·里仁>)当然,我们今天不 ...

随机推荐

  1. springcloud实践(一)服务发现:Eureka

    Eureka 入门 是什么? Eureka 是 Netflix 开源的一个 RESTful服务,主要用于服务注册与发现. 它由Eureka server 和Eureka client组成. Eurek ...

  2. mysql random 字母大小写和数字

    delimiter $$drop function if exists rand_string;create function rand_string(n int) returns varchar(2 ...

  3. Spring Security 解决X-Frame-Options deny

    错误信息: Refused to display 'https://github.com/hwclass/awesome-sound' in a frame because it set 'X-Fra ...

  4. 通过JS完成电梯动画效果

    实习单位要求做一个在Vue项目中比较能适配的来反映货梯当前状况的页面效果 用JS写了一个 <!DOCTYPE html> <html> <head> <met ...

  5. The Semantics of Constructors(拷贝构造函数之编译背后的行为)

    本文是 Inside The C++ Object Model's Chapter 2  的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)ob ...

  6. CodeForces - 369E Valera and Queries(树状数组)

    CodeForces - 369E Valera and Queries 题目大意:给出n个线段(线段的左端点和右端点坐标)和m个查询,每个查询有cnt个点,要求给出有多少条线段包含至少其中一个点. ...

  7. Vue_(组件)计算属性

    Vue计算属性中文文档 传送门 Vue计算属性:更强大的属性声明方式,可以对定义的属性进行逻辑处理与数据监视; 注意:模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑 ...

  8. JNA调用DLL

    1.引入pom <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna< ...

  9. Java企业版文档地址

    地址:http://docs.oracle.com/javaee/7/index.html

  10. 2、记录代码----Ajax

    $.ajax({ url:'/content-engine/index.php/tracker/confirmSendEmail', async: false, //默认为true,同意异步传输 da ...