邮件发送
每次自动化测试需要一定的时间,时间却又不固定,所以不知道什么时候完成了,什么时候还没跑完,那么就需要一个东西来提醒我们已经运行完了,快点去看测试结果,至于提醒的方式是怎么样的,可以根据自己的情况来看,发邮件呢还是发短信呢还是call电话呢,还是微信或者钉钉呢,都可以,不过普遍是邮件吧,邮件还可以带附件信息,所以更方便,承载的信息更多

其实可以再申请一个公司的AutoTest的邮箱号,但是难得麻烦了,所以用的另外一个qq号的邮箱来做为发送邮箱号,为了不显示出了我的qq号码,所以在qq邮箱中设置申请一个工作的邮箱名,这样就不是"号码@qq.com"这种格式了,变成了foxmail的邮箱号了
邮箱在第三方登录的时候,密码使用的都是授权码,所以我们开通各种服务,生成一个授权码
测试完成后,会生成一个测试报告,这测试报告中包含了,失败成功用例名,总数,成功数,失败数,日志等详细信息,我需要把报告中的这些信息全部提取出来,然后自己组装成邮件发送的内容信息,测试报告是html的,所以信息的提取也可以使用之前说的xpath的方式来提取,我使用的是re来直接匹配信息,然后加上各种换行符和tab符,组成一串信息来发送
def read_result(report):
try:
result = []
with open('C:\Auto-Test\Report\\%s' % report,'r',encoding='utf-8') as f:
data = f.read()
top_info = re.findall(r'(?:"testAll":\s)(\d{1,4})|"testFail":\s(\d{1,4})|"testPass":\s(\d{1,4})|"beginTime":\s"(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2})"|"totalTime":\s"(\d{1,4})s"',data)
name_info = re.findall(r'"description": "(.*)"',data)
result_info = re.findall(r'"status": "(.*)"',data)
info = list(zip(name_info,result_info))
for i in top_info:
for t in i:
if t!='':
result.append(t)
email_info = '测试已完成,简要如下:\n\t用例总数:%s\n\t成功数:%s\n\t失败数:%s\n\t开始时间:%s\n\t总耗时:%s秒\n\t成功率:%f\n\t失败率:%f\n\n失败如下:'%(result[1],result[0],result[2],result[3],result[4],float(result[0])/float(result[1])*100,float(result[2])/float(result[1])*100)
index = 1
for i in info:
if i[1]=='失败':
email_info = email_info + '\n\t(%d).%s\t\t'%(index,i[0])
index+=1
index = 1
email_info = email_info + '\n\n成功如下:'
for i in info:
if i[1]=='成功':
email_info = email_info + '\n\t(%d).%s\t\t'%(index,i[0])
index+=1
return email_info
except Exception as e:
logger.error('ERROR:%s'%e)
最终输出的信息是这样子的,包含简要信息,其实还可以加入测试的版本信息,但是我需要获取多个设备的信息,暂时就没有写了,邮件主要起个提示作用和简要信息的输出和详细日志附件的输出,工作使用的是钉钉,那我们将邮件接收则设置为钉钉的邮箱
@dingwalk.com,每当运行完成后,钉钉收到邮件会直接闪烁的方式提醒,感觉很方便
本来想使用html的方式把信息直接嵌入在邮件内容中,以网页的方式在邮件中显示,但是钉钉邮件中的信息都做的处理,便签显示出来都是标签名称,没有生效,所以还是自己组串了
使用python来发送带有附件的邮件,[‘xxxxxx@dingtalk.com’],可以是多个邮件号码,那么则发送给多个邮箱
def send_report_email(info,receivers,report_name):
sender = '@foxmail.com' # 发送方的邮箱
my_pass = '' # 发送方的密码
def send(recv):
message = MIMEMultipart()
message['From'] = Header(sender, 'utf-8')
message['To'] = Header(recv, 'utf-8')
subject = 'AutoTest_Report'
message['Subject'] = Header(subject, 'utf-8')
message.attach(MIMEText(info, 'plain', 'utf-8'))
att1 = MIMEText(open('C:\Auto-Test\Report\\%s' % report_name, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="%s"' % report_name
message.attach(att1)
try:
smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtpObj.login(sender, my_pass)
smtpObj.sendmail(sender, recv, message.as_string())
logger.info("测试已完成! 发送邮件到%s"%recv)
except smtplib.SMTPException as e:
logger.error("Error:%s 无法发送邮件" % e)
for i in receivers:
send(i)
Tool.send_report_email(info,['xxxxxx@dingtalk.com'],'Fgap_Report_quick_check_2020-09-04-17-36-53.html')
几种邮件的格式发送方法
1.发送不带附件的纯文本信息的邮件
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='465xxxxxx@qq.com' # 发件人邮箱账号
my_pass = '这里使用的是qq邮箱生成的密码' # 发件人邮箱密码
my_user=['131xxxx@qq.com','465xxxx@qq.com'] # 收件人邮箱账号
def mail():
ret=True
try:
msg=MIMEText('填写邮件内容','plain','utf-8')
msg['From']=formataddr(["zss",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["zw",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="这是一封测试邮件" # 邮件的主题,也可以说是标题
server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP_SSL服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,my_user,msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret=False
return ret
if __name__ == '__main__':
ret=mail()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
2.发送带附件的纯文本信息的邮件
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
sender = '4xxxxxx@qq.com' #发送方的邮箱
my_pass = '这里使用的是qq邮箱生成的密码' #发送方的密码
receivers = ['xxxxxxxx@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱,列表的形式才存储多个接收方
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("收件人名", 'utf-8')#收件人的姓名
message['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试' #邮件的标题
message['Subject'] = Header(subject, 'utf-8')
#邮件正文内容
message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
att1 = MIMEText(open('zss.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
#构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att2)
try:
smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
smtpObj.login(sender, my_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
3.发送html格式中带有图片的邮件
#coding:utf-8
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
sender = '4xxxxxxx@qq.com'#发送方的邮箱
password = 'qgusxxxxx' #发送方的密码
receivers = ['4xxxxx@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("收件人名", 'utf-8')#收件人的姓名
msgRoot['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试' #邮件的标题
msgRoot['Subject'] = Header(subject, 'utf-8')
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative) #邮件正文内容 表示什么类型,html还是文本
#message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
#html的内容
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.test.top">Test-one链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
try:
smtpObj = smtplib.SMTP_SSL('smtp.qq.com',465) #设置服务器
smtpObj.login(sender,password) #登陆
smtpObj.sendmail(sender, receivers, msgRoot.as_string())#发送
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
关注“码点小干货”公众号,一起分享一起交流各类信息技术和工具资源
愿你眼中总有光芒! - 愿你活成想要的样子!

SMTP模块的相关方法 方法 描述
SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器 SMTP.connect([host[,
port]]) 连接到指定的SMTP服务器 SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
SMTP.verify(address) 判断邮件地址是否在SMTP服务器上 SMTP.starttls([keyfile[,
certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密 SMTP.login(user,
password) 登录SMTP服务器 SMTP.sendmail(from_addr, to_addrs, msg,
mail_options=[], rcpt_options=[]) 发送邮件from_addr:邮件发件人
to_addrs:邮件收件人
msg:发送消息
SMTP.quit() 关闭SMTP会话 SMTP.close() 关闭SMTP服务器连接
本文介绍了如何在自动化测试完成后通过Python发送邮件通知,包括设置授权码、使用SMTP模块发送不同格式的邮件,以及利用钉钉邮箱进行提醒。重点讨论了发送纯文本、带附件及HTML格式邮件的方法,并提到了在钉钉中邮件提醒的便利性。



1348

被折叠的 条评论
为什么被折叠?



