邮件发送(SMTP)

发送邮件

import smtplib
from email.mime.text import MIMEText  # 负责构造文本
from email.mime.multipart import MIMEMultipart  # 负责将多个对象集合起来
from email.header import Header


class SendEmail:
    """邮件发送类"""

    def __init__(self, sub_title, sub_content):
        """
        初始化
        :param sub_title: 邮件主题
        :param sub_content: 邮件正文
        """
        self.host = "100.100.100.100"  # smtp服务器地址
        self.sender = "sender@sender.com"  # 发件人邮箱
        self.s_name = self.sender.split('@')[0]
        self.password = "admin"  # 邮箱授权码(不一定是密码)
        self.receivers = ["receiver1@receiver.com", "receiver2@receiver.com"]  # 收件人邮箱,可以为多个
        self.r_name_list = []
        self.subject_content = sub_title
        self.body_content = sub_content
        self.port = 25  # 端口地址默认为 25
        # 构造文本, 参数: 正文内容, 文本格式, 编码方式
        self.message_text = MIMEText(self.body_content, "plain", "utf-8")
        # 创建邮件对象
        self.mm = MIMEMultipart('related')
        # 创建SMTP对象
        self.stp = smtplib.SMTP(
        # 邮件信息设置
        self.set_info()

    def receiver_handle(self):
        """
        收件人处理
        设置接受者, 注意严格遵守格式, 里面邮箱为接受者邮箱
        self.mm["To"] = f"{self.r_name}<{self.receivers[0]}>"
        """
        for receiver in self.receivers:
            r_name = receiver.split('@')[0]
            to_result = f'{r_name}<{receiver}>'
            self.r_name_list.append(to_result)
        for r_name in self.r_name_list:
            self.mm['To'] = r_name

    def set_info(self):
        """设置邮件信息"""

        # 设置发送者, 注意严格遵守格式, 里面邮箱为发件人邮箱
        self.mm["From"] = f"{self.s_name}<{self.sender}>"
        # 设置接受者
        self.receiver_handle()
        # 设置邮件主题
        self.mm["Subject"] = Header(self.subject_content, 'utf-8')
        # 向MIMEMultipart对象中添加文本对象
        self.mm.attach(self.message_text)

    def add_file(self, f_path, f_name, charset='utf-8'):
        """
        添加附件
        :param f_path: 附件路径
        :param f_name: 重命名附件
        :param charset: 文件名编码格式
        """
        # 构造附件
        self.atta = MIMEText(open(f_path, 'rb').read(), 'base64', 'utf-8')
        # 设置附件信息
        self.atta.add_header("Content-Disposition", "attachment", filename=(charset, '', f_name))
        # 添加附件到邮件信息当中去
        self.mm.attach(self.atta)

    def send_mail(self, is_ssl=False, debug=False):
        """
        发送邮件
        :param is_ssl: 是否使用SSL
        :param debug: 是否打印交互信息
        """
        if is_ssl:
            self.stp = smtplib.SMTP_SSL(self.host)  # 不加此段代码则用25的端口, 否则要用465端口
            self.port = 465

        self.stp.connect(self.host, self.port)  # 设置发件人邮箱的域名和端口

        if debug:
            self.stp.set_debuglevel(1)  # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息

        # 登录邮箱, 参数: 邮箱地址, 邮箱授权码
        self.stp.login(self.sender, self.password)
        # 发送邮件, 参数: 发件人邮箱地址, 收件人邮箱地址, 把邮件内容格式改为str
        self.stp.sendmail(self.sender, self.receivers, self.mm.as_string())

    def quit(self):
        # 关闭 SMTP 对象
        self.stp.quit()
上一篇:keepalived 配置笔记


下一篇:SMTP 协议入门教程