参考地址:参考地址:https://www.liaoxuefeng.com/wiki/1016959663602400/1017790702398272

import smtplib
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from datetime import datetime

class PythonSendMail(object):

    def __init__(self, my_addr, password, smtp_server):
        """
        初始化函数
        :param my_addr: 发送方的邮箱地址
        :param password: 发送方的邮箱验证密钥
        :param smtp_server: 发送方的邮箱服务器地址
        """
        self.my_addr = my_addr
        self.password = password
        self.smtp_server = smtp_server

    def _format_addr(self, s):
        """
        格式化邮件地址私有方法
        :return:返回格式化好的邮箱地址
        """
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def get_msg_head(self, msg, from_str, to_str, subject_str):
        """

        :return:
        """
        msg['From'] = self._format_addr(from_str)
        msg['To'] = self._format_addr(to_str)
        msg['Subject'] = Header(subject_str, 'utf-8').encode()
        return msg

    def get_msg_body(self, msg, contents):
        """

        :param msg:
        :param contents:
        :return:
        """
        html = MIMEText(contents, 'html', 'utf-8')
        msg.attach(html)

        return msg

    def get_msg_others(self, msg, filename):
        with open(filename, 'rb') as f:
            # 设置附件的MIME和文件名,这里是png类型:
            mime = MIMEBase('xlsx', 'xlsx', filename=filename)
            # 加上必要的头信息:
            mime.add_header('Content-Disposition', 'attachment', filename=filename)
            mime.add_header('Content-ID', '<0>')
            mime.add_header('X-Attachment-Id', '0')
            # 把附件的内容读进来:
            mime.set_payload(f.read())
            # 用Base64编码:
            encoders.encode_base64(mime)
            # 添加到MIMEMultipart:
            msg.attach(mime)
        return msg

    def get_msg(self, username1, username2, send_addr, subject_str, file_list, contents):
        # 创建一个可以包好附件的对象
        msg = MIMEMultipart()
        # 构造邮件的头部信息
        from_str = username1 + '<%s>' % self.my_addr
        to_str = username2 + '<%s>' % send_addr
        msg = self.get_msg_head(msg=msg, from_str=from_str, to_str=to_str, subject_str=subject_str)
        # 构造邮件主体
        msg = self.get_msg_body(msg=msg, contents=contents)
        # 循环追加邮件附件
        for filename in file_list:
            msg = self.get_msg_others(msg=msg, filename=filename)
        return msg

    def send_mail(self, to_addr_list, msg):
        """
        发送邮件方法
        :param to_addr_list: 接收方的地址列表
        :param msg: 接收方要接收的信息
        :return:
        """
        server = smtplib.SMTP(self.smtp_server, 25)  # 构造邮件服务器对象
        server.set_debuglevel(1)  # 设置debug等级
        server.login(self.my_addr, self.password)  # 让服务器验证发送方身份
        server.sendmail(self.my_addr, to_addr_list, msg.as_string())
        server.quit()


if __name__ == '__main__':
    # 1: 创建邮件对象,初始化发送方地址,发送方密钥,发送方的邮箱服务器地址。
    python_send_mail = PythonSendMail("rsasdadsgshan@163.com", "FGEFFFHZadadsMHWBH", "smtp.163.com")
    # 2:调用构造邮件函数,构造邮件
    username1 = 'asdadsd'
    username2 = 'adadsad'
    send_addr = '1dadada0@qq.com'
    subject_str = '天眼设备统计状况:%s'% datetime.now().strftime('%Y-%m-%d')
    file_list = ['升级记录.xlsx', '系统版本TOP10.xlsx']
    # 主体内容
    contents = '<p>昨日共10000台设备进行了升级。升级记录请参考附件:升级记录.xlsx, 系统版本TOP10.xlsx<p>'
    msg = python_send_mail.get_msg(username1=username1, username2=username2,
                                   send_addr=send_addr, subject_str=subject_str,
                                   file_list=file_list, contents=contents)
    # 3: 调用发送邮件函数,发送邮件
    python_send_mail.send_mail(msg=msg, to_addr_list=['radadahan@163.com', '11737dsadad0@qq.com'])