邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到。在做接口测试的时候,我们不仅需要将测试结果以报告的形式展示,还需要将测试结果以邮件的形式发送给需要知道的人。那么如何发送邮件呢?本节将介绍如何用Python来实现邮件的自动发送,解放我们的双手,让我们有时间去做更有意思的事情。
我们都知道,SMTP(simple mail transfer protocol,简单邮件传送协议)是用于发送邮件的协议,而Python内置支持SMTP,可以发送纯文本邮件、HTML邮件和带附件的邮件。Python主要通过email和smtplib两个库支持SMTP,其中email负责构造邮件,包括信息头、信息主体等,smtplib负责发送邮件,起到服务器之间互相通信的作用。
1.导入需要的包
Python的smtplib库提供了一种很方便的操作来发送电子邮件,它对SMTP进行了简单的封装。
(1)Python创建SMTP对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )?
参数说明如下。
host:SMTP服务器主机,我们可以指定主机的IP地址,这个是可选参数。
port:如果使用了host参数,我们需要指定SMTP服务使用的端口号,一般情况下SMTP端口号为25。
local_hostname:如果SMTP在本地主机上,我们只需要指定服务器地址为localhost即可。
(2)Python的SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数说明如下。
from_addr:邮件发送者地址。
to_addrs:字符串列表,邮件发送地址。
msg:发送消息。
在发送邮件的时候,我们需要注意msg参数的格式,这个格式是SMTP协议中定义的格式。我们知道邮件一般由标题、发信人、收件人、邮件内容、附件等构成,msg是一个字符串,表示邮件。例如,Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。
另外,如果要发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造。通常需要导入如下几个方法:
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
2.准备邮件
email支持文本邮件、带有附件的邮件等,构造示例如下。
首先,准备邮件相关的配置内容:
f_user = "发件人地址"
t_user = "收件人地址"
content = "邮件的正文"
subject = "邮件的主题"
若是发送文本邮件,则使用email构造邮件如下:
msg = MIMEText(content, _subtype='plain', _charset="utf8")
若是发送带附件的邮件,则首先读取要发送的附件的内容:
file_content = open("附件文件名", "rb").read()
然后使用email构造邮件,构造一封多组件的邮件:
msg = MIMEMultipart()
往多组件邮件中加入文本内容:
text_msg = MIMEText(content, _subtype='plain', _charset="utf8")
msg.attach(text_msg)
往多组件邮件中加入文件附件:
file_msg = MIMEApplication(file_content)
file_msg.add_header('content-disposition', 'attachment', filename='发送附件的名称(可自定义)')
msg.attach(file_msg)
最后,添加发件人、收件人和邮件主题;
# 添加发件人
msg["From"] = f_user
# 添加收件人
msg["To"] = t_user
# 添加邮件主题
msg["subject"] = subject
3.发送邮件完整封装
一个项目中多个地方都需要发送邮件,这时就需要封装上文中的代码,供项目中所有需要发送邮件的地方直接调用。我们对发送邮件的操作进行封装,主要封装了3个方法:
send_text()用于发送文本邮件;
send_html()用于发送HTML格式邮件;
send_attachment()用于发送带有附件的邮件。
完整示例代码如代码清单4-4所示。
# -*- coding: utf-8 -*-
# @Time : 2022/2/15 11:20 上午
# @Project : sendEmail
# @File : emailUtil.py
# @Author : hutong
# @Describe: 微信公众号:大话性能
# @Version: Python3.9.8
?
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import os
?
class SendEMail(object):
"""封装发送邮件类"""
def __init__(self, host: str, port: int, user: str, pwd: str):
self.host = host
self.port = port
self.user = user
self.pwd = pwd
def __send(self, msg):
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(self.host, self.port)
smtpObj.login(self.user, self.pwd)
smtpObj.sendmail(self.user, msg["To"], msg.as_string())
print("邮件发送成功")
except Exception as e:
print("邮件发送失败")
def send_text(self, to_user: str, content: str, subject: str):
"""
发送文本邮件
:param to_user: 对方邮箱
:param content: 邮件正文,文本格式
:param subject: 邮件主题
:return:
"""
# 使用email构造邮件
msg = MIMEText(content, _subtype='plain', _charset="utf8")
msg["From"] = self.user
msg["To"] = to_user
msg["subject"] = subject
self.__send(msg)
def send_html(self, to_user: str, content: str, subject: str):
"""
发送HTML格式邮件
:param to_user: 对方邮箱
:param content: 邮件正文,HTML格式
:param subject: 邮件主题
:return:
"""
# 使用email构造邮件
msg = MIMEText(content, _subtype='html', _charset="utf8")
msg["From"] = self.user
msg["To"] = to_user
msg["subject"] = subject
self.__send(msg)
def send_attachment(self, to_user: str, content: str, subject: str, files: list):
"""
发送附件邮件
:param to_user: 对方邮箱
:param content: 邮件正文,文本格式
:param subject: 邮件主题
:return:
"""
# 创建一个带附件的实例
msg = MIMEMultipart()
msg['From'] = self.user
msg['To'] = to_user
msg['subject'] = subject
# 邮件正文内容
msg.attach(MIMEText(content, 'plain', 'utf-8'))
# 构造附件
for file in files:
att = MIMEText(open(file, 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字邮件中就显示什么名字
_, file_name = os.path.split(file)
att["Content-Disposition"] = 'attachment; filename="{}"'.format(file_name)
msg.attach(att)
self.__send(msg)
?
if __name__ == '__main__':
pass
代码清单4-4 emailUtil
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责