使用python发送QQ邮件

使用python发送QQ邮件
可以给多人发送邮件
可以添加附件
代码和使用方法如下
注:只能发送QQ邮件
首先按照一下步骤设置自己的邮箱,打开SMTP
请添加图片描述
请添加图片描述
开启后获取授权码才可以使用

import os
import datetime
import smtplib  # smtplib 用于邮件的发信动作
from email.mime.text import MIMEText  # email 用于构建邮件内容
from email.mime.multipart import MIMEMultipart  # 用于实例化附件(处理多种形态的邮件主体我们需要 MIMEMultipart 类)
from email.header import Header  # Header 用来构建邮件头
from email.mime.image import MIMEImage  # 图片
from email.mime.application import MIMEApplication  # pdf、word、csv、zip
from email.utils import formataddr


class SendQQEmail:
    """
    注意:发送附件文件名如果是中文的话会乱码
    发送QQ邮件
    使用方式:
    实例化发邮件这个类
    qqEmail = SendQQEmail(sender="xxxx@qq.com",  # 发送邮件的邮箱
                          password=r"xxxx",  # 获取的授权码
                          senderName="发件人:你的姓名",  # 你发的邮件得让人知道你是谁吧
                          receivers=["xxxx@qq.com", 'xxxx@qq.com'])  # 接收人,多个就是list[str, str, ...]
    # 设置邮件标题
    qqEmail.setEmailTitle("Title")
    # 设置邮件正文内容
    qqEmail.setEmailContent("Content")
    # 添加附件
    qqEmail.addAttachFile(r"Path")
    # 发送邮件
    qqEmail.sendEmail()
    """

    def __init__(self, sender, password, senderName, receivers: list):
        """

        :param sender: 发送邮箱str
        :param password: qq邮箱的授权码str
        :param senderName: 发件人姓名
        :param receivers: 接收邮箱list[str, str, str, ...]
        """
        self._sender = sender
        self._password = password
        self._senderName = senderName
        self._receivers = receivers

        # 邮件内容
        self._EmailContent = f"e-mail from {self._sender}."

        # 设置邮件主体
        self._EmailTitle = f"e-mail from {self._sender}."

        # 保存附件
        self._AttachFiles = []

    def setEmailContent(self, message: str):
        """
        设置发送邮件的内容
        默认:"e-mail from {self._sender}."
        :param message:
        :return:
        """
        self._EmailContent = message

    def setEmailTitle(self, title: str):
        """
        设置邮件主题
        默认:"e-mail from {self._sender}."
        :param title:
        :return:
        """
        self._EmailTitle = title

    def addAttachFile(self, path):
        """
        添加发送的附件,自动判断添加的附件使用对应的方法发送
        :param path:
        :return:
        """
        # 文件名
        baseName = os.path.basename(path)
        # 后缀名:.pdf/.txt/.cxv/.zip
        postfix = os.path.splitext(path)[-1]

        if os.path.exists(path):
            if postfix in ['.txt', ]:
                # 这里就得是发送bin的数据,我尝试使用str转换格式,但是接收的图片不能查看
                file = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8')
                file["content_Type"] = 'application/octet-stream'
                # 表示这是附件,名字是啥
                file["Content-Disposition"] = f'attachment; filename="{baseName}"'
                self._AttachFiles.append(file)

            elif postfix.lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
                file = MIMEImage(open(path, 'rb').read(), postfix)
                file.add_header('Content-Disposition', 'attachment', filename=baseName)
                self._AttachFiles.append(file)

            # ['.pdf', '.doc', '.docx', '.csv', '.zip', '.json', '.ppt', '.pptx']
            else:
                file = MIMEApplication(open(path, 'rb').read())
                file.add_header('Content-Disposition', 'attachment', filename=baseName)
                self._AttachFiles.append(file)

        else:
            print(f"{path} not exist.")

    def Application(self, path):
        """
        发送pdf、word、zip、csv附件接口
        ['pdf', 'doc', 'docx', 'csv', 'zip', '.json']
        :param path:
        :return:
        """
        # 文件名
        baseName = os.path.basename(path)
        # 后缀名
        postfix = os.path.splitext(path)[-1]
        if os.path.exists(path):
            file = MIMEApplication(open(path, 'rb').read())
            file.add_header('Content-Disposition', 'attachment', filename=baseName)
            self._AttachFiles.append(file)

        else:
            print(f"{path} not exist.")

    def Image(self, path):
        """
        发送图片接口
        :param path:
        :return:
        """
        # 文件名
        baseName = os.path.basename(path)
        # 后缀名
        postfix = os.path.splitext(path)[-1]
        if os.path.exists(path) and postfix.lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
            file = MIMEImage(open(path, 'rb').read(), postfix)
            file.add_header('Content-Disposition', 'attachment', filename=baseName)
            self._AttachFiles.append(file)

        else:
            print(f"{path} not exist.")

    def sendEmail(self):
        """
        使用该方法发送邮件
        :return:
        """
        if len(self._AttachFiles):  # 带有附件
            # 实例化附件邮件实例
            message = MIMEMultipart()

            # 发件人:name e-mail
            message['From'] = formataddr((Header(self._senderName, 'utf-8').encode(), self._sender))
            # 邮件主题
            message['Subject'] = Header(self._EmailTitle)
            # 收件人
            message['To'] = Header(','.join(self._receivers))
            # 邮件内容
            information = f"{self._EmailContent}\n\n发件人:{self._senderName}\n{self.getDataTime()}"
            content = MIMEText(information, 'plain', 'utf-8')
            message.attach(content)

            # 邮件附件
            for file in self._AttachFiles:
                message.attach(file)

        else:  # 只有文本
            information = f"{self._EmailContent}\n\n发件人:{self._senderName}\n{self.getDataTime()}"
            message = MIMEText(information, 'plain', 'utf-8')
            # 发件人
            message['From'] = formataddr((Header(self._senderName, 'utf-8').encode(), self._sender))
            # 邮件主题
            message['Subject'] = Header(self._EmailTitle)
            # 收件人
            message['To'] = Header(','.join(self._receivers))

        try:
            # 连接QQ邮箱的SMTP服务器和对应端口
            server = smtplib.SMTP_SSL("smtp.qq.com", 465)
            # 登录账号
            server.login(self._sender, self._password)
            # 发送邮件
            server.sendmail(self._sender, self._receivers, message.as_string())
            # 关闭服务器
            server.quit()
            print("send successful...")

        except smtplib.SMTPException as E:
            print('error', E)
        
        finally:
            # 不论发送成功还是失败,都要将本次添加的附件删除。否则会导致附件越来越多
            self._AttachFiles.clear()

    @staticmethod
    def getDataTime():
        return datetime.datetime.now().strftime('data:%Y-%m-%d(week:%w) time:%H:%M:%S')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值