在我们日常的自动化测试中,可能会使用到邮件的发送功能来进行自动发送测试报告,那么如何利用Python发送邮件呢?本文主要讲述利用Python来发送邮件的一些基本操作。
本文主要包含知识点:
- 邮件发送原理简述(smtp邮箱服务器)
- 发送文字邮件
- 发送html邮件
我们一般发送邮件时,用到的代理有outlook,qq邮箱,网易邮箱等,不管用什么代理,你都需要登录你的邮箱,而这个邮箱就是在各大邮箱服务器上开辟的一部分空间,用来接收、发送和存储你的邮件信息。
说到邮件发送,不得不了解一下SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。邮件发送原理,简单的讲就是代理通过SMTP协议将信息发送到邮箱服务器上,邮箱服务器再通过POP3协议转发到收件人的邮件服务器中,如下图:
因此使用Python发送邮件时,可以将Python的解释器当做一个代理,首先需要连接到邮箱服务器,将邮件发过去。由于不同公司的邮箱服务器地址不尽相同,连接时需要选择邮箱对应的服务器地址,这里列出了一些常用的地址如下:
既然已经知道邮件发送原理,接下来用Python连接smtp服务器,不就可以发送邮件了。其实强大的python早就封装好了一个package:email, 利用其中的几个类即可实现,具体代码如下:
import smtplib # 引用smtplib模块
from email.mime.multipart import MIMEMultipart # 多形式组合,可包含文本和组合
from email.mime.text import MIMEText # 纯文本,HTML页面
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage # 图片
from email.header import Header # 邮件头
from email.utils import parseaddr, formataddr
from common.logger import GetLogger
from Conf.conf import *
class Email():
def __init__(self):
'''
一些初始化的信息
'''
self.smtp = EMAIL_SMTP # 邮箱服务器地址
self.username = EMAIL_USERNAME # 发件人地址
self.password = EMAIL_PASSWORD # 授权码
self.subject = EMAIL_SUBJECT # 邮件主题
self.sender = EMAIL_SENDER # 发件人
self.receiver = EMAIL_RECEIVER # 收件人
self.cc = EMAIL_CC # 抄送人
self.logger = GetLogger().get_logger()
@staticmethod
def _format_addr(s):
name, addr = parseaddr(s)
# 将邮件的name转换成utf-8格式,addr如果是unicode,则转换utf-8输出,否则直接输出addr
return formataddr((Header(name, 'utf-8').encode(), addr))
def message_init(self, html):
'''
对即将发送的内容进行初始化
:param html: 发送邮件正文内容
:return:
'''
message = MIMEMultipart() # 内容接收池
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self._format_addr('xxx <%s>' % self.sender)
message['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc)
# 解决乱码,html是html格式的字符串
message_content = MIMEText(html, _subtype='html', _charset='utf-8')
# 邮件的正文内容
message.attach(message_content)
return message
email自定义类中的属性包含了邮箱服务器的地址,邮箱登录的用户名和授权码,邮件主题,发件人,收件人和抄送人。这里需要注意的是,收件人和抄送人是个list,添加的时候应该使用append()。
message_init(self, html)即将发送内容进行初始化,包括邮件主题、发送人和收件人的初始化。其中 MIMEText(html, _subtype=‘html’, _charset=‘utf-8’) 中,参数一为发送的邮件内容,是字符串;参数二表示设置文本格式为html(邮件都是使用html格式发送的);参数三表示设置编码格式为utf-8。如上这样一个邮件信息包就构造好了,万事俱备只欠东风,发送邮件的核心代码如下:
def send_email(self, html):
'''
发送邮件
:param html: 邮件正文内容
'''
message = self.message_init(html)
try:
# 连接邮箱的服务器及端口号
smtp_obj = smtplib.SMTP(self.smtp, 25) # smtp服务器端口默认是25
# 登录邮箱:用户名及密码
smtp_obj.login(self.username, self.password)
# 发送邮件
smtp_obj.sendmail(self.sender, self.receiver + self.cc, message.as_string())
self.logger.info('邮件发送成功')
smtp_obj.quit() # 关闭服务器
except Exception as e:
self.logger.error('邮件发送失败:{}'.format(e))
模拟正常客户端邮件发送,遵循登录->发送->退出原则, 这里注意sendmail的第二个参数为收件人和抄送人的合集。
下面测试数据:
if __name__ == '__main__':
print('开始测试邮件发送')
send = Email()
len_result = len(RESULT_lIST)
message = 'Dear all,<br/><br/>本次接口自动化报告如下:<br/><br/>' + '  执行脚本数为:' + str(len_result)
send.send_email(message)
print('测试结束')
若发送邮件失败,需检查邮箱是否开启smtp服务。登录邮箱->开启服务->获取授权码。
那么如何发送html格式文件呢?其实想想也很简单,将html文件全部读取出来之后,转为str即可。
利用Python如何发送邮件已经学会了,那么如何添加附件?如何发送图片呢? 关注我,下期为你解答。