#!/usr/bin/python # -*- coding: utf-8 -*- # @version : 1.0 # @Create Time : 2023/3/27 9:48 # @File : send_email.py # @IDE : PyCharm # @desc : 发送邮件封装类 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from typing import List from redis.asyncio import Redis from core.exception import CustomException class EmailSender: def __init__(self, rd: Redis): self.email = None self.password = None self.smtp_server = None self.smtp_port = None self.server = None self.rd = rd async def __get_settings(self, retry: int = 3): """ 获取配置信息 """ web_email = [] self.email = web_email.get("email_access") self.password = web_email.get("email_password") self.smtp_server = web_email.get("email_server") self.smtp_port = int(web_email.get("email_port")) self.server = smtplib.SMTP(self.smtp_server, self.smtp_port) self.server.starttls() try: self.server.login(self.email, self.password) except smtplib.SMTPAuthenticationError: raise CustomException("邮件发送失败,邮箱服务器认证失败!") except AttributeError: raise CustomException("邮件发送失败,邮箱服务器认证失败!") async def send_email(self, to_emails: List[str], subject: str, body: str, attachments: List[str] = None): """ 发送邮件 :param to_emails: 收件人,一个或多个 :param subject: 主题 :param body: 内容 :param attachments: 附件 """ await self.__get_settings() message = MIMEMultipart() message['From'] = self.email message['To'] = ', '.join(to_emails) message['Subject'] = subject body = MIMEText(body) message.attach(body) if attachments: for attachment in attachments: with open(attachment, 'rb') as f: file_data = f.read() filename = attachment.split('/')[-1] attachment = MIMEApplication(file_data, Name=filename) attachment['Content-Disposition'] = f'attachment; filename="{filename}"' message.attach(attachment) try: result = self.server.sendmail(self.email, to_emails, message.as_string()) self.server.quit() print("邮件发送结果", result) if result: return False else: return True except smtplib.SMTPException as e: self.server.quit() print('邮件发送失败!错误信息:', e) return False