Selenium39-发送邮件

为什么要发送邮件

自动化测试生成了测试报告文件,无法通知相关人员
目标:每次Selenium自动化测试代码运行完毕后,通过自动发送邮件方式告知相关人员具体测试结果信息。

Python发送邮件的库

  • smtplib:以前较为常用
    • smtplib需要设置发件人邮箱中的SMTP服务器,一些主流的邮箱的服务器都可以设置,而可能需求需要使用的某企业邮箱的服务器是没有此项配置的。
  • zmail:简单且容易上手
    • zmail仅支持python3,不需要任何外部依赖,不支持python2。
    • 不需要手动添加服务器地址、端口以及适合的协议。
    • 此外,使用一个python字典来代表邮件内容也更容易理解。

zmail特性

  • 自动寻找服务器地址以及端口
  • 自动使用可靠的链接协议
  • 自动将一个python字典映射成MIME对象(带有附件的)
  • 自动添加头文件以及localhostname来避免服务器拒收你的邮件
  • 轻松自定义你的头文件
  • 支持使用HTML作为邮件内容
  • 仅需python>=3.5,你可以将其嵌入你的项目而无需其他的依赖

安装zmail

pip install zmail==0.2.8
使用须知:
使用Python3,不是Python2

生成邮箱授权码

  • 用浏览器访问:mail.qq.com,用自己的QQ账号登陆进入邮箱,开启smtp服务
    • 开启POP3/SMTP服务
    • 生成授权码,保存下来(注意保密)

测试SMTP和POP功能是否正常

import zmail
server = zmail.server('发件人邮箱地址', '授权码')
if server.smtp_able():
    pass
if server.pop_able():
    pass

自定义服务器配置

  • 如果zmail不能正常工作,可以通过可选参数来自定义server的配置:
server = zmail.server('1111@163.com','授权码',smtp_host='smtp.163.com',smtp_port=994,smtp_ssl=True,pop_host='pop.163.com',pop_port=995,pop_tls=True)
server = zmail.server(username="1111@qq.com",password="授权码",smtp_host="smtp.qq.com", smtp_port=465,config="qq")

zmail使用基本步骤

# 导入zmail模块
import zmail
# 配置邮件账号:
server = zmail.server('发件人邮箱地址', '授权码')
# 发送邮件:
server.send_mail('收件人邮箱地址',{'subject':'标题','content_text':'邮件正文.'})
#一个收件人
# 收件人如果有多个,用列表表示。

增加附件

import zmail
mail_content = {'subject': '标题', 
    'content_text': '邮件正文', 
    'attachments': ['C:\\附件1.zip','C:\\附件2.jpg']
}
server = zmail.server('发件人邮件地址’, '授权码')
server.send_mail('收件人邮件地址', mail_content)

发送HTML作为邮件正文

import zmail
mail_content = {'subject': '标题', 
    'content_text': '邮件正文', 
    'attachments': ['C:\\附件1.zip','C:\\附件2.jpg']
}
server = zmail.server('发件人邮件地址’, '授权码')
server.send_mail('收件人邮件地址', mail_content)
  with open(file_path, 'r',encoding='utf-8') as f:
    mail_content = {
                'from': "1111@qq.com",# 发件人邮箱
                'subject': '最新的测试报告邮件',# 邮件主题
                'content_html': f.read(),# 邮件正文内容
                'attachments': file_path # 邮件附件
            }

使用抄送

  • 抄送cc
    server.send_mail(['邮箱地址1','邮箱地址2'],mail_content,cc=['抄送者邮箱1','抄送者邮箱2'])
    # 邮箱使用元组形式(命名,邮箱地址)
    server.send_mail(['邮箱地址1','邮箱地址2'],mail_content,cc=[('经理','抄送者邮箱1'),'抄送者邮箱2'])
    

设计发送邮件模块

  • utils包里新建一个模块:send_email.py
    • 导入zmail
    • 定义类EmailUtil
    • 定义方法send_email,参数是file_path代表html报告文件路径
    • 打开html报告文件
    • 准备邮件内容
    • 配置邮件账号
    • 发送邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from ecshop.utils.read_mailconf import MailConf
from ecshop.utils.report_utility import Report

class SendMail():
    def send(self,filename):
        # #设置登录及服务器信息
        # mail_host = 'smtp.qq.com'
        # mail_user = '登录者'
        # mail_password = '授权码'
        # sender = '12269576013@qq.com'
        # receivers = ['12269576013@qq.com']
        mc=MailConf()
        mail_host=mc.get_mail_host()
        mail_user=mc.get_mail_user()
        mail_password=mc.get_mail_password()
        sender=mc.get_sender()
        receivers=mc.get_receivers()

        #设置eamil信息
        #添加一个MIMEmultipart类,处理正文及附件
        message = MIMEMultipart()
        message['From'] = sender
        message['To'] = receivers[0]
        message['Subject'] = 'Test Report'+filename
        #推荐使用html格式的正文内容,这样比较灵活,可以附加图片地址,调整格式等
        with open(filename,'r',encoding="utf-8") as f:
            content = f.read()
        #设置html格式参数
        part1 = MIMEText(content,'html','utf-8')
        #添加一个txt文本附件
        with open(filename,'r',encoding="utf-8")as h:
            content2 = h.read()
        #设置txt参数
        part2 = MIMEText(content2,'plain','utf-8')
        #附件设置内容类型,方便起见,设置为二进制流
        part2['Content-Type'] = 'application/octet-stream'
        #设置附件头,添加文件名
        part2['Content-Disposition'] = 'attachment;filename="report.html"'
        # #添加照片附件
        # with open('1.png','rb')as fp:
        #     picture = MIMEImage(fp.read())
        #     #与txt文件设置相似
        #     picture['Content-Type'] = 'application/octet-stream'
        #     picture['Content-Disposition'] = 'attachment;filename="1.png"'
        #将内容附加到邮件主体中
        message.attach(part1)
        message.attach(part2)
        # message.attach(picture)

        #登录并发送
        try:
            smtpObj = smtplib.SMTP()
            smtpObj.connect(mail_host,25)
            smtpObj.login(mail_user,mail_password)
            smtpObj.sendmail(
                sender,receivers,message.as_string())
            print('success')
            smtpObj.quit()
        except smtplib.SMTPException as e:
            print('error',e)

if __name__ == '__main__':
    # SendMail().send("../report/test_report.html")
    SendMail().send(Report().get_lastest_report())

使用发送邮件模块

  • 在测试套件里发送html报告给相关人员
# 导入EmailUtil
from utils.send_mail import EmailUtil
# 测试套件末尾,发送邮件,参数是前面准备好的带有变化数据的测试结果报告文件名称
EmailUtil().send_email(report_file_path)#发送邮件
posted @ 2022-12-29 22:24  暄总-tester  阅读(144)  评论(0)    收藏  举报