使用python3的email模块和smtplib模块可以实现发送邮件的动能。email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并发送给项目组的人,在Common文件夹下新建my_email.py文件,项目结构如下。

#!/usr/bin/python3import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
import getcwd
import os
from Logs.log import log1
import timerq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
sender = '2474xxx@qq.com'  #发件人邮箱
password = 'ryhnx****fybifj'  #发件人邮箱密码
addressed_eamil = '24741xxx@qq.com' #收件人邮箱

path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxx接口自动化测试报告.html')#测试报告地址def mail():try:# 创建一个带附件的实例message = MIMEMultipart()message['From']=formataddr(['发件人姓名',sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号log1.info('发件人邮箱:%s' % sender)message['To']= formataddr(['收件人姓名',addressed_eamil])    # 括号里的对应收件人邮箱昵称、收件人邮箱账号log1.info('收件人邮箱:%s' % addressed_eamil)message['Subject']=rq+"xxx接口自动化测试报告"    # 邮件的主题,也可以说是标题# 邮件正文内容message.attach(MIMEText('附件为xxx接口自动化测试报告', 'plain', 'utf-8'))# 构造附件1att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')log1.info('读取附件')att1["Content-Type"] = 'application/octet-stream'# filename是附件名,附件名称为中文时的写法att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxx接口自动化测试报告.html"))# 附件名称非中文时的写法# att["Content-Disposition"] = 'attachment; filename="test.html")'
        message.attach(att1)log1.info('添加附件')server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP服务器,一般端口是25log1.info('连接QQ邮箱smtp服务')server.login(sender,password)  # 括号中对应的是发件人邮箱账号、邮箱密码log1.info('连接成功')server.sendmail(sender, addressed_eamil, message.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件server.quit()  # 关闭连接log1.info("邮件发送成功")except Exception:  log1.error("邮件发送失败",exc_info=1)mail()

收件人和发件人可以都填自己的QQ邮箱,from是发件人那一栏的展示。to是收件人的展示。如果要显示多个收件人,需要使用‘,’.join(邮箱数组)。最下面sendmail中第二个传收件人邮箱,如果要发给多个人,传数组。

email展示内容可以跟代码中对照着来看,更容易理解一点

以qq邮箱为例,在使用qq邮箱的SMTP服务时,需要在qq邮箱-账户中先开启,并且生成授权码,然后密码那里填写授权码

这样虽然实现了发邮件,但是也把邮件的收发人写死了,所以还是要完善。通过读取配置文件来确定收发人,在Common文件夹下Base_test.py文件增加如下代码

    def config_options(self,section):'''读取配置文件某section下所有键'''config = configparser.ConfigParser()config.read(config_path,encoding="utf-8-sig")username = config.options(section)return usernamedef get_addkey(self,user):'''遍历获得配置文件收件人email'''sum = 0L = []for i in user:if sum < len(user):emails = self.confige_get('addressed', i)L.append(emails)sum += 1return L

然后修改配置文件

sender是设置发件人的,username是发件人的姓名,email是发件人邮箱,password是邮箱密码

addressed是设置收件人的,之后随便往下加就行了。xxx = 邮箱就可以了。

这样谁发邮件,哪些人收到邮件,都是可以配置的。

将my_email.py文件代码修改成如下

#!/usr/bin/python3import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
import getcwd
import os
from Logs.log import log1
from Common.Base_test import webrequests
import timerq = time.strftime('%Y%m%d', time.localtime(time.time()))#获取本地时间 转换成日期
my_mail = webrequests()
sender = my_mail.config_get('sender','email')  # 发件人邮箱账号
password = my_mail.config_get('sender','password')  # 发件人邮箱密码
usernmae = my_mail.config_get('sender','username') #发件人姓名
users = my_mail.config_options('addressed')     #收件人
addressed_eamils = my_mail.get_addkey(users)  #收件人邮箱

path = getcwd.get_cwd()
file = os.path.join(path, 'report/xxx接口自动化测试报告.html')def mail():try:# 创建一个带附件的实例message = MIMEMultipart()message['From']=formataddr([usernmae,sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号log1.info('发件人姓名:%s' % usernmae)log1.info('发件人邮箱:%s' % sender)message['To']=';'.join(addressed_eamils)    # 括号里的对应收件人邮箱昵称、收件人邮箱账号log1.info('收件人邮箱:' + ';'.join(addressed_eamils))message['Subject']=rq + "xxx接口自动化测试报告.html"    # 邮件的主题,也可以说是标题# 邮件正文内容message.attach(MIMEText('附件为xxx接口自动化测试报告.html', 'plain', 'utf-8'))# 构造附件1,传送当前目录下的 test.txt 文件att1 = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')log1.info('读取附件')att1["Content-Type"] = 'application/octet-stream'# 这里的filename可以任意写,写什么名字,邮件中显示什么名字att1.add_header("Content-Disposition", "attachment", filename=("gbk", "", "xxx接口自动化测试报告.html"))# 附件名称非中文时的写法# att["Content-Disposition"] = 'attachment; filename="test.html")'
        message.attach(att1)log1.info('添加附件')server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP服务器,端口是25log1.info('连接QQ邮箱smtp服务')server.login(sender,password)  # 括号中对应的是发件人邮箱账号、邮箱密码log1.info('连接成功')server.sendmail(sender, addressed_eamils, message.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件server.quit()  # 关闭连接log1.info("邮件发送成功")except Exception: log1.error("邮件发送失败",exc_info=1)

在entrance.py文件开头加上import Common.my_email,在最后加上Common.my_email.mail(),然后执行

整个框架系列就介绍到这里了

转载于:https://www.cnblogs.com/myal/p/9337588.html

python3+requests库框架设计08-发送邮件相关推荐

  1. python3 requests库爬虫

    requests库爬虫 1 安装模块 1.1 使用pip安装requests 2 简单爬取网页的源代码 2.1 引入模块 2.2 获取网页的状态(404.500.200等) 2.3 获取网页源码 3 ...

  2. python3 requests 库学习

    #requests #http 请求 import requests url='http://www.baidu.com' requests.post('url') requests.get('url ...

  3. python3.8安装requests库_再见requests!Python下一代 http客户端出炉啦!

    小编玩Python大概是3-4年前,那个时间爬虫非常流行,到处都是爬虫的文章和视频,很多人入门Python都是从爬虫开始.几乎所有学Python都知道requests这个库,它大名鼎鼎K神的得意之作, ...

  4. python3中使用requests库出现的编码问题

    最近在使用python完成爬虫任务时遇到了编码问题,查看了很多资料,现总结一些编码的知识. 1.编码解码 1.1 字符和字节 "字节"是一个8位的物理存贮单元.而"字符& ...

  5. python怎么安装requests库-Python3.6安装及引入Requests库

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

  6. python怎么安装requests库-Python3.6安装及引入Requests库的实现方法

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

  7. 手机版python3.6.6的requests库下载_Python爬虫之Python3.6 Requests库的基本使用方法

    Python爬虫之Python3.6 Requests库的基本使用方法 未分类 在使用Python过程中,使用http处理各种请求是我们绕不过去的,在Python中开发爬虫用来抓取各种网络上的资源,就 ...

  8. Python3.6安装及引入Requests库

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

  9. 手机版python3.6.6的requests库下载_Python3.6安装及引入Requests库

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

最新文章

  1. Python访问MySQL数据库
  2. Apollo分布式配置中心在本地的安装教程
  3. 命令回复mysql数据库_用命令行恢复MySQL数据库
  4. 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题
  5. 全局稳定性收敛平衡点为0吗_该平衡点处的小扰动稳定性判据是什?
  6. 智能小车37:异常在ARM、JAVA、硬件里的实现
  7. Java实现Base64编码和解码的方式
  8. java 内存管理 知乎_[知乎]Java 语言的 GC 为什么不实时释放内存?
  9. app 之间发送文件 ios
  10. 突然发现,工作已满四年了
  11. win7便签怎么一直在桌面显示
  12. 蓝桥杯 Java B组省赛真题【2017】
  13. kvm的乾坤大挪移-虚拟机迁移
  14. depot_tools下载
  15. 未能成功加载扩展程序_该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的解决办法...
  16. python图片标记_python提取那些被“标记”照片的实例详解
  17. CRM如何管理企业销售流程
  18. Win7加密访问共享文件夹
  19. Android 系统应用开发实战
  20. 扫地机器人噪音响_硬件老兵拆机分析:扫地机器人噪音大小到底与何相关?

热门文章

  1. spring单元测试
  2. hibernate配置相关知识
  3. GitLab安装文档
  4. Rad Studio IDE 代码编辑器增强工具 RADSplit
  5. ListIterator特有的方法
  6. 图像几何变换之透视变换
  7. Android ImageView的ScaleType属性
  8. FlexUnit单元测试(第三章FlexUnit事件断言)
  9. MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决
  10. Java多线程引发的性能问题,怎么解决?