Python3:发邮件

  • 利用python的组件进行发邮件
    1.构建邮件服务器设置、连接服务器、登录服务器
    2.构建邮件内容
    3.发送邮件,收件人收件
    步骤1、2通过smtplib实现,步骤3通过email实现
代码片段:构建邮件服务、发邮件
  # 构建smtp对象
   smtp = smtplib.SMTP()

    # 连接到smtp服务
    smtp.connect(self.smtp_server, self.stmp_port)

    # 登录smtp服务
    smtp.login(self.sender, self.password)

    # 发送邮件
    print('收件人为:', self.reveiver)
    res = smtp.sendmail(self.sender, self.reveiver, msg.as_string())
    print("邮件发送结果: ", res)

    # 退出
    smtp.quit()
    print("send email finish")
  • 构建邮件内容
    邮件内容的构建大致为文本内容、html格式、附件、图片四种需求
    使用到的包文件为:
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
代码片段:
 def __content_of_email(self, msg_type):
        """
        邮件正文为文本内容
        :param content:
        :return:
        """
        msg = MIMEMultipart()
        msg["From"] = self.sender
        msg["To"] = ";".join(self.reveiver)
        msg['Subject'] = Header(self.subject, "utf-8")

        # 如果msg为plain,则邮件正文为文本
        if msg_type == 'plain':
            msg.attach(MIMEText(self.content, "plain", "utf-8"))
        # 如果msg为html,则邮件正文为html
        elif msg_type == "html":
            msg.attach(MIMEText(self.content, "html", "utf-8"))
        else:
            print("邮件内容类型不正确")

        if self.attachment is not None:

            # 读取附件内容
            with open(attachment, 'r')as f:
                contents = f.read()
            # 设置html格式参数
            html_content = MIMEText(contents, 'base64', 'utf-8')
            html_content["Content-Type"] = 'application/octet-stream'
            html_content.add_header("Content-Disposition", "attachment", filename=os.path.basename(attachment))
            msg.attach(html_content)

        return msg
  • sendEmail.py全部代码
# __author__ ='wuwa'
# -*- coding: utf-8 -*-

"""
email:构造邮件
1.发送邮件的账号、密码
2.连接邮件服务
3.设置邮件标题、内容
smtplib:发送邮件
4.发送邮件
"""
import os
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


class WriteEmails:
    def __init__(self, smtp_server, stmp_port, sender, password, reveiver, subject, content, msg_type, attachment):
        self.smtp_server = smtp_server
        self.stmp_port = stmp_port
        self.sender = sender
        self.password = password
        self.reveiver = reveiver
        self.subject = subject
        self.content = content
        self.msg_type = msg_type
        self.attachment = attachment

    def __content_of_email(self, msg_type):
        """
        邮件正文为文本内容
        :param content:
        :return:
        """
        msg = MIMEMultipart()
        msg["From"] = self.sender
        msg["To"] = ";".join(self.reveiver)
        msg['Subject'] = Header(self.subject, "utf-8")

        # 如果msg为plain,则邮件正文为文本
        if msg_type == 'plain':
            msg.attach(MIMEText(self.content, "plain", "utf-8"))
        # 如果msg为html,则邮件正文为html
        elif msg_type == "html":
            msg.attach(MIMEText(self.content, "html", "utf-8"))
        else:
            print("邮件内容类型不正确")

        if self.attachment is not None:

            # 读取附件内容
            with open(attachment, 'r')as f:
                contents = f.read()
            # 设置html格式参数
            html_content = MIMEText(contents, 'base64', 'utf-8')
            html_content["Content-Type"] = 'application/octet-stream'
            html_content.add_header("Content-Disposition", "attachment", filename=os.path.basename(attachment))
            msg.attach(html_content)

        return msg

    def senf_send_email(self):
        """
        发邮件
        :return: 
        """
        msg = self.__content_of_email(self.msg_type)

        try:
            # 构建smtp对象
            smtp = smtplib.SMTP()

            # 连接到smtp服务
            smtp.connect(self.smtp_server, self.stmp_port)

            # 登录smtp服务
            smtp.login(self.sender, self.password)

            # 发送邮件
            print('收件人为:', self.reveiver)
            res = smtp.sendmail(self.sender, self.reveiver, msg.as_string())
            print("邮件发送结果: ", res)

            # 退出
            smtp.quit()
            print("send email finish")

        except smtplib.SMTPException as e:
            print('error', e)


if __name__ == "__main__":

    # 邮箱服务地址
    smtp_server = 'xx.xx.com'
    # 邮箱服务的端口
    stmp_port = xx

    # 邮件发送者
    sender = "[email protected]"
    # 邮件发送者密码
    password = "password"

    # 邮件接收者
    receiver = ["xxx@[email protected]", "[email protected]"]
    content = "邮件正文"
    subject = "邮件标题"

    # 邮件正文类型
    msg_type = "html"
    BASE_DIR = os.path.abspath(os.path.dirname(os.getcwd()))
    # 获取ini文件的路径
    attachment = os.path.join(BASE_DIR, "report\\report.html")

    # 实例化
    m = WriteEmails(smtp_server, stmp_port, sender, password, receiver, subject, content, msg_type, attachment)
    # 调用类方法
    m.senf_send_email()

你可能感兴趣的:(Python3:发邮件)