Python实现发送邮件的功能(初级)

  在我们日常的自动化测试中,可能会使用到邮件的发送功能来进行自动发送测试报告,那么如何利用Python发送邮件呢?本文主要讲述利用Python来发送邮件的一些基本操作。

本文主要包含知识点:

  1. 邮件发送原理简述(smtp邮箱服务器)
  2. 发送文字邮件
  3. 发送html邮件

  我们一般发送邮件时,用到的代理有outlook,qq邮箱,网易邮箱等,不管用什么代理,你都需要登录你的邮箱,而这个邮箱就是在各大邮箱服务器上开辟的一部分空间,用来接收、发送和存储你的邮件信息。

  说到邮件发送,不得不了解一下SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。邮件发送原理,简单的讲就是代理通过SMTP协议将信息发送到邮箱服务器上,邮箱服务器再通过POP3协议转发到收件人的邮件服务器中,如下图:
Python实现发送邮件的功能(初级)_第1张图片
  因此使用Python发送邮件时,可以将Python的解释器当做一个代理,首先需要连接到邮箱服务器,将邮件发过去。由于不同公司的邮箱服务器地址不尽相同,连接时需要选择邮箱对应的服务器地址,这里列出了一些常用的地址如下:
Python实现发送邮件的功能(初级)_第2张图片
  既然已经知道邮件发送原理,接下来用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,

本次接口自动化报告如下:

'
+ '  执行脚本数为:' + str(len_result) send.send_email(message) print('测试结束')

  若发送邮件失败,需检查邮箱是否开启smtp服务。登录邮箱->开启服务->获取授权码。
Python实现发送邮件的功能(初级)_第3张图片Python实现发送邮件的功能(初级)_第4张图片

  那么如何发送html格式文件呢?其实想想也很简单,将html文件全部读取出来之后,转为str即可。

  利用Python如何发送邮件已经学会了,那么如何添加附件?如何发送图片呢? 关注我,下期为你解答。

你可能感兴趣的:(Python自动化,python,smtp)