邮件处理——测试工程师Python开发实战(07)

发表于:2023-7-28 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡通    来源:51Testing软件测试网原创

#
Python
  邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到。在做接口测试的时候,我们不仅需要将测试结果以报告的形式展示,还需要将测试结果以邮件的形式发送给需要知道的人。那么如何发送邮件呢?本节将介绍如何用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软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号