用 yagmail 发送邮件,整合自动发送邮件功能
自动发送邮件功能是自动化测试项目的重要需求之一,当自动化测试用例运行完成之后,可自动向相关人员的邮箱发送测试报告。严格来讲,这里介绍的发送邮件模块并不属于 unittest 的扩展,不过,我们仍然可以将它与 unittest 结合使用。
SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,是一组由源地址到目的地址传送邮件的规则,可以控制信件的中转方式。Python 的 smtplib 模块提供了简单的 API用来实现发送邮件功能,它对 SMTP 进行了简单的封装。
在实现发送邮件功能之前,需要补充一个基础知识。在给其他人发送邮件之前,首先需要有一个自己的邮箱。通过浏览器打开邮箱网址(如 www.126.com),或打开邮箱客户端(如 Foxmail),登录自己的邮箱账号。如果是邮箱客户端,则还需要配置邮箱服务器地址(如 smtp.126.com)。然后填写收件人地址、邮件的主题和正文,以及添加附件等。即便通过 Python 实现发送邮件功能,也需要设置这些信息。
python自带的方法请参考:
https://www.cnblogs.com/yinzuopu/p/15544559.html
yagmail 是 Python 的一个第三方库,可以让我们以非常简单的方法实现自动发送邮件功能。
GitHub 项目地址:
https://github.com/kootenpv/yagmail
通过 pip 命令安装:
pip install yagmail
项目文档提供了的简单发送邮件的例子:
# -*- coding:utf-8 -*-
# filename: test_text.py
# author: hello,yin
# date: 2021/11/17 13:44
import yagmail
sender = "zuopuyin@126.com"
passwd = "ADQGQOUKUDVWKRS"
receiver = "zuopuyin2@126.com"
smtp_host = "smtp.126.com"
# 连接邮箱服务器
mail_connect = yagmail.SMTP(user=sender, password=passwd, host=smtp_host)
subject = "这是主题:有梦想,能坚持,永远积极向上~"
contents = "这是正文:hello.yin,要加油呀~"
mail_connect.send(receiver, subject, contents)
发送结果展示:
如果想给多个用户发送邮件,那么只需把收件人放到一个 list 中即可:
# 发送邮件
yag.send(['aa@126.com','bb@qq.com','cc@gmail.com'], 'subject', contents)
如果想发送带附件的邮件,那么只需指定本地附件的路径即可:
# 发送邮件
yag.send('aa@126.com', 'subject', contents, ["d://log.txt","d://baidu_img.jpg"])
另外,还可以通过 list 指定多个附件。yagmail 库极大地简化了发送邮件的代码。
在学习了如何用 Python 实现发送邮件之后,现在只需将功能集成到自动化测试项目中即可。打开 run_tests.py 文件,修改代码如下。
# -*- coding:utf-8 -*-
# filename: run_test.py
# author: hello.yin
# date: 2021/11/17
import time
import yagmail
import unittest
from HTMLTestRunner import HTMLTestRunner
# 报测试报告作为附件发送到指定邮箱
def send_mail(report):
yag = yagmail.SMTP(user="zuopuyin@126.com", password="ADQGQOUKUDVWRIS", host="smtp.126.com")
subject = "主题:这是一封自动化测试报告"
contents = "您好,正文请参考附件!"
yag.send("zuopuyin2@126.com", subject, contents, report)
print("邮件发送成功!")
if __name__ == "__main__":
test_dir = "./test_case"
now_time = time.strftime("%Y%m%d%H%M%S")
html_report = "./test_report/" + now_time + "_result.html"
fp = open(html_report, "wb")
suit = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
runner = HTMLTestRunner(stream=fp, title="baidu_search test", description="author:hello yin")
runner.run(suit)
fp.close()
send_mail(html_report) # 发送报告
执行结果:
C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe D:/00test/base_practice/ddt_test/run_test.py
.....FFFFFFFFF.<_io.TextIOWrapper name='<stderr>' mode='w' encoding='GBK'>
Time Elapsed: 0:01:36.213218
邮件发送成功!
Process finished with exit code 0
整个程序的执行过程可以分为两部分:
(1)定义测试报告文件,并赋值给变量 html_report,通过 HTMLTestRunner 运行测试用例,将结果写入文件后关闭。
(2)调用 send_mail()函数,并传入 html_report 文件。在 send_mail()函数中,把测试报告作为邮件的附件发送到指定邮箱。
为什么不把测试报告的内容读取出来作为邮件正文发送呢?因为 HTMLTestRunner 报告在展示时引用了 Bootstrap 样式库,当作为邮件正文“写死”在邮件中时,会导致样式丢失,所以作为附件发送更为合适。附件中的自动化测试报告如图所示: