python 使用SMTP发送邮件

本文的python发送邮件,使用的是SMTP协议,端口为25.

下面是完整的 代码片段

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


class SendEmail():
    _from_addr = None
    _attachments = []

    def __init__(self, smtp_server, port):
        self.smtp = smtplib.SMTP(smtp_server, port)
        self.smtp.set_debuglevel(1)

    def _format_addr(self, s):
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def login(self, user, password):
        self._from_addr = user
        self.smtp.login(user, password)

    def add_file(self, file_name_list):
        """
        添加附件
        :param file_name_list: 附件地址列表
        :return: 
        """
        file = MIMEMultipart()
        for file_name in file_name_list:
            with open(file_name, 'rb') as f:
                attach_file_base = MIMEBase('application', 'octet-stream')
                attach_file_base.set_payload(f.read())
                attach_file_base.add_header('Content-Disposition', 'attachment',
                                            filename=('utf-8', '', file_name.split("\\")[-1]))
                encoders.encode_base64(attach_file_base)
                file.attach(attach_file_base)
        self._attachments.append(file)

    def send_email(self, to_addr, send_word, from_nickname, to_nickname, header, type):
        """
        发送email
        :param to_addr: 接收方邮箱
        :param from_nickname: 发送人昵称
        :param to_nickname: 接收人昵称
        :param send_word: 发送信息
        :param header: 标语
        :param type: 发送的信息格式(plain: text, html:html)
        :return:
        """
        # MIMEMultipart 可以组合发送HTML或者Plain,但是要指定subtype是alternative:
        msg = MIMEMultipart('alternative')
        # 邮件正文是 MIMEText
        contents = MIMEText(send_word, type, _charset='utf-8')
        # 发送人名字
        msg['From'] = self._format_addr('{} <{}>'.format(from_nickname, self._from_addr))
        # 接收人名字
        msg['To'] = self._format_addr('{} <{}>'.format(to_nickname, to_addr))
        # 邮件主题
        msg['Subject'] = Header(header, 'utf-8').encode()
        for data in self._attachments:
        	# 添加到MIMEMultipart
            msg.attach(data)
        msg.attach(contents)
        try:
            self.smtp.sendmail(self._from_addr, to_addr, msg.as_string())
        except Exception as e:
            print(e)
        finally:
            self.smtp.quit()

if __name__ == '__main__':
    new_obj = SendEmail('smtp.qq.com', 25)
    new_obj.login('258428@qq.com', '密码')
    new_obj.add_file(['文件地址'])
    new_obj.send_email(to_addr=['757098@qq.com'], send_word='CSDN', from_nickname="Dozt", to_nickname='Dozt', header="生活愉快", type='html')

密码是你进行smtp权限开通时的密码,不是邮箱登陆密码
python 使用SMTP发送邮件

上一篇:安装GIT


下一篇:Laravel 5.8 做个知乎 13 —— Api token用户认证