转载自:https://blog.csdn.net/qq_34897661/article/details/79871359
通常情况想,我们希望执行完一套的自动化脚本后能够顺带的将自动化脚本发送给指定的某些人查看执行结果,于是需要在脚本执行完毕后去执行发送邮件的脚本,将生成的报告作为附件发送出去。
期初本人参考的文档是https://www.cnblogs.com/liyanqi/p/7885014.html
其源码如下:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import
smtplib
from
email.mime.base
import
MIMEBase
from
email.mime.text
import
MIMEText
from
email.mime.multipart
import
MIMEMultipart
from
email.header
import
Header
from
email
import
encoders
# Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
def
get_email_obj(email_subject, email_from, to_addr_list):
'''
构造邮件对象,并设置邮件主题、发件人、收件人,最后返回邮件对象
:param email_subject:邮件主题
:param email_from:发件人
:param to_addr_list:收件人列表
:return :邮件对象 email_obj
'''
# 构造 MIMEMultipart 对象做为根容器
email_obj
=
MIMEMultipart()
email_to
=
','
.join(to_addr_list)
# 将收件人地址用“,”连接
# 邮件主题、发件人、收件人
email_obj[
'Subject'
]
=
Header(email_subject,
'utf-8'
)
email_obj[
'From'
]
=
Header(email_from,
'utf-8'
)
email_obj[
'To'
]
=
Header(email_to,
'utf-8'
)
return
email_obj
def
attach_content(email_obj, email_content, content_type
=
'plain'
, charset
=
'utf-8'
):
'''
创建邮件正文,并将其附加到跟容器:邮件正文可以是纯文本,也可以是HTML(为HTML时,需设置content_type值为 'html')
:param email_obj:邮件对象
:param email_content:邮件正文内容
:param content_type:邮件内容格式 'plain'、'html'..,默认为纯文本格式 'plain'
:param charset:编码格式,默认为 utf-8
:return:
'''
content
=
MIMEText(email_content, content_type, charset)
# 创建邮件正文对象
email_obj.attach(content)
# 将邮件正文附加到根容器
def
attach_part(email_obj, source_path, part_name):
'''
添加附件:附件可以为照片,也可以是文档
:param email_obj:邮件对象
:param source_path:附件源文件路径
:param part_name:附件名
:return:
'''
part
=
MIMEBase(
'application'
,
'octet-stream'
)
# 'octet-stream': binary data 创建附件对象
part.set_payload(
open
(source_path,
'rb'
).read())
# 将附件源文件加载到附件对象
encoders.encode_base64(part)
part.add_header(
'Content-Disposition'
,
'attachment; filename="%s"'
%
part_name)
# 给附件添加头文件
email_obj.attach(part)
# 将附件附加到根容器
def
send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list):
'''
发送邮件
:param email_obj:邮件对象
:param email_host:SMTP服务器主机
:param host_port:SMTP服务端口号
:param from_addr:发件地址
:param pwd:发件地址的授权码,而非密码
:param to_addr_list:收件地址
:return:发送成功,返回 True;发送失败,返回 False
'''
try
:
'''
# import smtplib
# smtp_obj = smtplib.SMTP([host[, port[, local_hostname]]] )
# host: SMTP服务器主机。
# port: SMTP服务端口号,一般情况下SMTP端口号为25。
# smtp_obj = smtplib.SMTP('smtp.qq.com', 25)
'''
smtp_obj
=
smtplib.SMTP_SSL(email_host, host_port)
# 连接 smtp 邮件服务器
smtp_obj.login(from_addr, pwd)
smtp_obj.sendmail(from_addr, to_addr_list, email_obj.as_string())
# 发送邮件:email_obj.as_string():发送的信息
smtp_obj.quit()
# 关闭连接
print
(
"发送成功!"
)
return
True
except
smtplib.SMTPException:
print
(
"发送失败!"
)
return
False
if
__name__
=
=
"__main__"
:
# (QQ邮箱)
email_host
=
"smtp.qq.com"
# smtp 邮件服务器
host_port
=
465
# smtp 邮件服务器端口:SSL 连接
from_addr
=
"发件地址"
# 发件地址
pwd
=
"授权码"
# 发件地址的授权码,而非密码
# (163邮箱)
# email_host = "smtp.163.com" # smtp 邮件服务器
# host_port = 465 # smtp 邮件服务器端口:SSL 连接
# from_addr = "发件地址" # 发件地址
# pwd = "授权码" # 发件地址的授权码,而非密码
to_addr_list
=
[
"邮箱1"
,
"邮箱2"
]
# 收件地址
email_content
=
"邮件主题"
email_content_html
=
"""
Python 邮件发送...
图片:

"""
email_subject
=
"邮件主题"
email_from
=
"发件人"
source_path
=
r
"D:\我的文档\My Pictures\avatar.jpg"
part_name
=
'avatar.png'
email_obj
=
get_email_obj(email_subject, email_from, to_addr_list)
attach_content(email_obj, email_content)
attach_part(email_obj, source_path, part_name)
send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list)
其基本符合我的要求,包括整个邮件的所有内容,但是唯一不好的是不能和我的项目结合。于是,我做了适当的修改,将原代码的__main__部分去掉,只保留方法部分,并将整体封装成一个类,修改后代码如下,保存为myemail.py
#!/usr/bin/python # -*- coding:utf-8 -*- import smtplib from email.mime.base import MIMEBase from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header from email import encoders # Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。 class Email(): def get_email_obj(email_subject, email_from, to_addr_list): ''' 构造邮件对象,并设置邮件主题、发件人、收件人,最后返回邮件对象 :param email_subject:邮件主题 :param email_from:发件人 :param to_addr_list:收件人列表 :return :邮件对象 email_obj ''' # 构造 MIMEMultipart 对象做为根容器 email_obj = MIMEMultipart() email_to = ','.join(to_addr_list) # 将收件人地址用“,”连接 # 邮件主题、发件人、收件人 email_obj['Subject'] = Header(email_subject, 'utf-8') email_obj['From'] = Header(email_from, 'utf-8') email_obj['To'] = Header(email_to, 'utf-8') return email_obj def attach_content(email_obj, email_content, content_type='plain', charset='utf-8'): ''' 创建邮件正文,并将其附加到跟容器:邮件正文可以是纯文本,也可以是HTML(为HTML时,需设置content_type值为 'html') :param email_obj:邮件对象 :param email_content:邮件正文内容 :param content_type:邮件内容格式 'plain'、'html'..,默认为纯文本格式 'plain' :param charset:编码格式,默认为 utf-8 :return: ''' content = MIMEText(email_content, content_type, charset) # 创建邮件正文对象 email_obj.attach(content) # 将邮件正文附加到根容器 def attach_part(email_obj, source_path, part_name): ''' 添加附件:附件可以为照片,也可以是文档 :param email_obj:邮件对象 :param source_path:附件源文件路径 :param part_name:附件名 :return: ''' part = MIMEBase('application', 'octet-stream') # 'octet-stream': binary data 创建附件对象 part.set_payload(open(source_path, 'rb').read()) # 将附件源文件加载到附件对象 encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % part_name) # 给附件添加头文件 email_obj.attach(part) # 将附件附加到根容器 def send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list): ''' 发送邮件 :param email_obj:邮件对象 :param email_host:SMTP服务器主机 :param host_port:SMTP服务端口号 :param from_addr:发件地址 :param pwd:发件地址的授权码,而非密码 :param to_addr_list:收件地址 :return:发送成功,返回 True;发送失败,返回 False ''' try: ''' # import smtplib # smtp_obj = smtplib.SMTP([host[, port[, local_hostname]]] ) # host: SMTP服务器主机。 # port: SMTP服务端口号,一般情况下SMTP端口号为25。 # smtp_obj = smtplib.SMTP('smtp.qq.com', 25) ''' smtp_obj = smtplib.SMTP_SSL(email_host, host_port) # 连接 smtp 邮件服务器 smtp_obj.login(from_addr, pwd) smtp_obj.sendmail(from_addr, to_addr_list, email_obj.as_string()) # 发送邮件:email_obj.as_string():发送的信息 smtp_obj.quit() # 关闭连接 print("发送成功!") return True except smtplib.SMTPException: print("发送失败!") return False
这样专门的发送邮件类就有了,使用的时候只要设置好相应参数,直接调用函数就可以了。在原本生成报告的脚本下添加如下代码:
# 邮件发送报告 # (QQ邮箱) email_host = "smtp.qq.com" # smtp 邮件服务器 host_port = 465 # smtp 邮件服务器端口:SSL 连接 from_addr = "发件地址" # 发件地址 pwd = "授权码" # 发件地址的授权码,而非密码------每次发送报告前需要修改 # (163邮箱) # email_host = "smtp.163.com" # smtp 邮件服务器 # host_port = 465 # smtp 邮件服务器端口:SSL 连接 # from_addr = "发件地址" # 发件地址 # pwd = "授权码" # 发件地址的授权码,而非密码 # 获取最新生成的测试报告附件 result_dir = r'D:\PyCharm\untitled\test_report' # 将文件都放到一个数组中 lists = os.listdir(result_dir) # 将目录下的文件排序 lists.sort() # 找到最新生成的文件 file_new = os.path.join(lists[-1]) source_path = result_dir + '\\' + file_new # 邮件内容 to_addr_list = ["[email protected],[email protected]"] # 收件地址 email_content = "这是本次自动化测试报告,请查收" email_content_html = "test" email_subject = "自动化测试报告" email_from = "tester" part_name = 'test.html' email_obj = Email.get_email_obj(email_subject, email_from, to_addr_list) Email.attach_content(email_obj, email_content) Email.attach_part(email_obj, source_path, part_name) Email.send_email(email_obj, email_host, host_port, from_addr, pwd, to_addr_list)
文件开头需要引入上面的发送邮件类:
from framework.myemail import Email
这样就可以直接在脚本执行完后将生成的报告发送到指定的邮箱。至于如何生成报告的相关代码请查看之前发的《selenium使用HTMLTestRunner成功报告》
参考资料:
https://www.cnblogs.com/liyanqi/p/7885014.html Selenium3+python3-发送添加附件的邮件
http://www.51testing.com/html/58/492258-3601835.html Python实现测试报告自动发送邮件