python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)

宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入

1.简介

  本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮

件服务软件或者调用运营商邮箱服务器。

  对于Python来说,需要编写脚本调用邮件服务器来发送邮件,使用的协议是SMTP。接收邮件,使用的协议是POP3和IMAP。我想有必要说明下 ,POP3和IMAP的区别:POP3在客户端邮箱中所做的操作不会反馈到邮箱服务器,比如删除一封邮件,邮箱服务器并不

会删除。IMAP则会反馈到邮箱服务器,会做相应的操作。

  Python分别提供了收发邮件的库,smtplib、poplib和imaplib。

  本章主要讲解如果使用smtplib库实现发送各种形式的邮件内容。在smtplib库中,主要主要用smtplib.SMTP()类,用于连接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服务器连接

看下官方给的示例:

我们根据示例给自己发一个邮件测试下:

我这里测试使用本地的SMTP服务器,也就是要装一个支持SMTP协议的服务,比如sendmail、postfix等。

CentOS安装sendmail:yum install sendmail

1 >>> import smtplib
2 >>> s = smtplib.SMTP("localhost")
3 >>> tolist = ["xxx@qq.com", "xxx@163.com"]
4 >>> msg = '''\
5 ... From: Me@my.org
6 ... Subject: test
7 ... This is a test '''
8 >>> s.sendmail("me@my.org", tolist, msg)
9 {}

进入腾讯和网易收件人邮箱,就能看到刚发的测试邮件,一般都被邮箱服务器过滤成垃圾邮件,所以收件箱没有,你要去垃圾箱看看。

可以看到,多个收件人可以放到一个列表中进行群发。msg对象里From表示发件人,Subject是邮件标题,换行后输入的是邮件内容。

1.1 Python发送邮件并抄送

 1 #!/usr/bin/python
 2 # -*- coding: utf-8 -*-
 3 import smtplib
 4 def sendMail(body):
 5     smtp_server = 'smtp.163.com'
 6     from_mail = 'hongge@163.com'
 7     mail_pass = 'xxx'
 8     to_mail = ['xxx@qq.com', 'xxx@163.com']
 9     cc_mail = ['hongge@xxx.com']
10     from_name = 'monitor' 
11     subject = u'监控'.encode('gbk')   # 以gbk编码发送,一般邮件客户端都能识别
12 #     msg = '''\
13 # From: %s <%s>
14 # To: %s
15 # Subject: %s
16 # %s''' %(from_name, from_mail, to_mail_str, subject, body)  # 这种方式必须将邮件头信息靠左,也就是每行开头不能用空格,否则报SMTP 554
17     mail = [
18         "From: %s <%s>" % (from_name, from_mail),
19         "To: %s" % ','.join(to_mail),   # 转成字符串,以逗号分隔元素
20         "Subject: %s" % subject,
21         "Cc: %s" % ','.join(cc_mail),
22         "",
23         body
24         ]
25     msg = '\n'.join(mail)  # 这种方式先将头信息放到列表中,然后用join拼接,并以换行符分隔元素,结果就是和上面注释一样了
26     try:
27         s = smtplib.SMTP()
28         s.connect(smtp_server, '25')
29         s.login(from_mail, mail_pass)
30         s.sendmail(from_mail, to_mail+cc_mail, msg)   
31         s.quit()
32     except smtplib.SMTPException as e:
33         print "Error: %s" %e
34 if __name__ == "__main__":
35     sendMail("This is a test!")

s.sendmail(from_mail, to_mail+cc_mail, msg) 在这里注意下,收件人和抄送人为什么放一起发送呢?其实无论是收件人还是抄送人,它们收到的邮件都是一样的,SMTP都是认为收件人这样一封一封的发出。所以实际上并没有抄送这个概念,只是在邮件头加了抄送人的信息罢了!另外,如果不需要抄送人,直接把上面cc的信息去掉即可。

另外以上代码发送的邮件会出现主题中文乱码:

解决方案:三行代码即可,修改成红色框代码即可

1.2 Python发送邮件带附件

由于SMTP.sendmail()方法不支持添加附件,所以可以使用email模块来满足需求。email模块是一个构造邮件和解析邮件的模块。

先看下如何用email库构造一个简单的邮件:

message = Message()
message['Subject'] = '邮件主题'
message['From'] = from_mail
message['To'] = to_mail
message['Cc'] = cc_mail
message.set_payload('邮件内容')

基本的格式就是这样的!

继续回到主题,发送邮件带附件:

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-5-9
 7 @author: 北京-宏哥
 8 Project:学习和使用邮箱发带有附件邮件
 9 '''
10 #3.导入模块
11 import smtplib
12 from email.mime.text import MIMEText
13 from email.mime.multipart import MIMEMultipart
14 from email.header import Header
15 from email import encoders
16 from email.mime.base import MIMEBase
17 
18 def send_mail(file_new):
19     #-----------1.跟发件相关的参数------
20     smtpserver = 'smtp.mxhichina.com'                #发件服务器
21     port = 0                      #端口
22     username = 'noreply@cxx.cn'  #发件箱用户名
23     password = 'xx@@123'        #发件箱密码
24     sender = 'noreply@cxx.cn'    #发件人邮箱
25     receiver = ['hongge@cedex.cn','1918991791@qq.com'] #收件人邮箱
26     # ----------2.编辑邮件的内容------
27     #读文件内容
28     f = open(file_new, 'rb')
29     mail_body = f.read()
30     f.close()
31     # 邮件正文是MIMEText
32     body = MIMEText(mail_body, 'html', 'utf-8')
33     # 邮件对象
34     msg = MIMEMultipart()
35     msg['Subject'] = Header("自动化测试报告", 'utf-8').encode()#主题
36     msg['From'] = Header(u'测试机 <%s>'%sender)                #发件人
37     msg['To'] = Header(u'测试负责人 <%s>'%receiver)            #收件人
38     msg['To'] = ';'.join(receiver)
39     msg.attach(body)
40     # # MIMEBase表示附件的对象
41     att = MIMEText(mail_body, "base64", "utf-8")
42     att["Content-Type"] = "application/octet-stream"
43     # filename是显示附件名字
44     att["Content-Disposition"] = 'attachment; filename="test_report.html"'
45     msg.attach(att)
46     # ----------3.发送邮件------
47     try:
48         smtp = smtplib.SMTP()
49         smtp.connect(smtpserver)  # 连服务器
50         smtp.login(sender, password)
51     except:
52         smtp = smtplib.SMTP_SSL(smtpserver, port)
53         smtp.login(sender, password)  # 登录
54     smtp.sendmail(sender, receiver, msg.as_string())  # 发送
55     smtp.quit()
56 
57 if __name__ == "__main__":
58     #本地文件的路径
59     att_path= r'E:\pythontest\text.txt'
60     send_mail(att_path)

1.3 Python发送HTML邮件

 1 # coding=utf-8
 2 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
 3 
 4 #2.注释:包括记录创建时间,创建人,项目名称。
 5 '''
 6 Created on 2019-5-9
 7 @author: 北京-宏哥
 8 Project:学习和使用邮箱发HTML邮件
 9 '''
10 #3.导入模块
11 #"-*- coding: utf-8 -*-"
12 import smtplib
13 from email.mime.text import MIMEText
14 
15 mail_user="XXX@163.com"
16 mail_password="******q1125"
17 mailto_list=["1918991791<1918991791@qq.com>","2014816656@qq.com"]
18 mail_host="smtp.163.com"
19 mail_postfix="163.com"
20 
21 def sendmail(to_list,sub,content):
22     me="北京-宏哥"+"<"+mail_user+"@"+mail_postfix+">"
23     msg=MIMEText("<a href='https://www.cnblogs.com/du-hong'><font color='red'>北京-宏哥</font></a>","html","utf-8")
24     msg['Subject']=sub
25     msg['From']=me
26     msg['To']=",".join(to_list)
27     try:
28         server=smtplib.SMTP()
29         server.connect(mail_host)
30         server.login(mail_user,mail_password)
31         server.sendmail(me,to_list,msg.as_string())
32         server.close()
33         return True
34     except Exception as e:
35         print (str(e))
36         return False
37 if sendmail(mailto_list,"标题:发送的是html格式","<a href='https://www.cnblogs.com/du-hong'>北京-宏哥</a>"):
38     print ("done!")
39 else:
40     print ("falsed!")

1.4 Python发送图片邮件

# coding=utf-8
#1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

#2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-5-9
@author: 北京-宏哥
Project:学习和使用1邮箱发HTML邮件
'''
#3.导入模块
#"-*- coding: utf-8 -*-"
import smtplib
from email.mime.text import MIMEText

mail_user="@@@@@163.com"
mail_password="@@@@"
mailto_list=["1918991791<1918991791@qq.com>","2014816656@qq.com"]
mail_host="smtp.163.com"
mail_postfix="163.com"

def sendmail(to_list,sub,content):
    me="北京-宏哥"+"<"+mail_user+"@"+mail_postfix+">"
    msg=MIMEText('<html><body><img hidefocus="true" class="index-logo-src" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129" usemap="#mp"></body></html>', 'html', 'utf-8')
    msg['Subject']=sub
    msg['From']=me
    msg['To']=",".join(to_list)
    try:
        server=smtplib.SMTP()
        server.connect(mail_host)
        server.login(mail_user,mail_password)
        server.sendmail(me,to_list,msg.as_string())
        server.close()
        return True
    except Exception as e:
        print (str(e))
        return False
if sendmail(mailto_list,"标题:发送的是HTML格式","<a href='https://www.cnblogs.com/du-hong'>北京-宏哥</a>"):
    print ("done!")
else:
    print ("falsed!")

上面发邮件的几种常见的发邮件方法基本满足日常需求了。

2.小结

1、linux环境下提示AttributeError: module 'smtplib' has no attribute 'SMTP',Windows环境运行代码也报如下错误:

2、原因当然不是模块的问题,检查了一下拼写也没有出问题,最后在这个帖子(链接)的启发下发现,发现自己的文件命名为email.py,和模块中的函数有冲突,改名之后Linux环境邮件正常发送。

    每天学习一点,今后必成大神-

往期推荐(由于跳转参数丢失了,所有建议选中要访问的右键,在新标签页中打开链接即可访问)或者微信搜索: 北京宏哥  公众号提前解锁更多干货。

Appium自动化系列,耗时80天打造的从搭建环境到实际应用精品教程测试

Python接口自动化测试教程,熬夜87天整理出这一份上万字的超全学习指南

Python+Selenium自动化系列,通宵700天从无到有搭建一个自动化测试框架

Java+Selenium自动化系列,仿照Python趁热打铁呕心沥血317天搭建价值好几K的自动化测试框架

Jmeter工具从基础->进阶->高级,费时2年多整理出这一份全网超详细的入门到精通教程

Fiddler工具从基础->进阶->高级,费时100多天吐血整理出这一份全网超详细的入门到精通教程

Pycharm工具基础使用教程

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在进行接口自动化测试时,生成一份详细的测试报告十分重要,方便开发人员、测试人员和项目经理查看测试结果、定位问题并及时解决。其中,HTML 测试报告是一种简洁明了、易于阅读的报告形式,具有良好的视觉效果和交互性,常被用于接口自动化测试报告的生成。 下面,我们就来详细介绍一下如何使用 Python 生成 HTML 测试报告。 ## 1. 安装 HTMLTestRunner 在 Python 中,我们可以使用第三方库 HTMLTestRunner 来生成 HTML 测试报告。该库可以在 Python2 和 Python3 中使用,提供了多种生成测试报告的方式,并且支持自定义样式和模板。 我们可以使用 pip 命令安装 HTMLTestRunner: ``` pip install html-testRunner ``` ## 2. 编写测试用例 接下来,我们需要编写测试用例,并使用 unittest 框架运行测试用例。这里以一个简单的加法测试用例为例: ```python import unittest class TestAdd(unittest.TestCase): def test_add(self): self.assertEqual(1+2, 3) ``` ## 3. 生成 HTML 测试报告 使用 HTMLTestRunner 生成 HTML 测试报告非常简单。我们只需要在测试用例中添加几行代码即可: ```python import unittest from html_testRunner import HTMLTestRunner class TestAdd(unittest.TestCase): def test_add(self): self.assertEqual(1+2, 3) if __name__ == '__main__': # 定义测试套件 suite = unittest.TestSuite() suite.addTest(TestAdd('test_add')) # 定义测试报告的路径和文件名 report_path = './test_report.html' # 打开文件,准备写入测试报告 with open(report_path, 'wb') as report_file: # 定义测试运行器 runner = HTMLTestRunner(stream=report_file, title='接口测试报告', description='测试报告详情') # 运行测试用例 runner.run(suite) ``` 其中,HTMLTestRunner 接受一个 stream 参数,用于指定测试报告输出的文件流,title 参数用于指定测试报告的标题,description 参数用于指定测试报告的详细描述。在运行测试用例之前,我们需要先定义一个测试套件,将要运行的测试用例添加到测试套件中。最后,使用测试运行器运行测试套件,即可生成 HTML 测试报告。 ## 4. 查看测试报告 运行完测试用例后,我们可以在指定的路径下找到生成的测试报告文件 test_report.html。打开该文件,即可查看生成的 HTML 测试报告。 HTML 测试报告中包含了测试用例的执行结果、用例名称、用例执行时间、错误信息等信息,方便开发人员快速定位问题。此外,我们还可以自定义测试报告的样式和模板,使其更符合项目的需求。 至此,我们就介绍了使用 Python 生成 HTML 测试报告的方法。HTML 测试报告的优势在于其可读性高,易于阅读和理解,同时还具有良好的可视化效果和交互性。在接口自动化测试中,HTML 测试报告是一种非常实用的报告形式,可以帮助我们更好地管理测试用例和测试结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值