使用:https://www.yuque.com/u1046159/erg6ec/crqnud#VvPYQ
SendEmail.py
"""邮件发送工具Python对SMTP支持有smtplib和email两个模块:1. email负责构造邮件2. smtplib负责发送邮件。"""import smtplibimport sslfrom email.header import Headerfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextimport attach as attachfrom loguru import loggerfrom utils.ReadConfig import ReadConfigclass SendMail:def __init__(self):"""初始化smtp服务器连接smtp 服务器端口,仅能使用25、465和58725端口(明文传输)465端口(SSL 加密) 587端口(STARTTLS 加密)"""self.cf = ReadConfig()# qq邮箱服务器地址self.mail_host = self.cf.get_email('mail_host')# 端口self.mail_port = self.cf.get_email('mail_port')# 用户名self.mail_user = self.cf.get_email('mail_user')# 密码(部分邮箱为授权码)self.mail_pass = self.cf.get_email('mail_pass')self.mail_sender = self.cf.get_email('mail_sender')# 根据不同的端口,用不同的方式连接if self.mail_port == "587":ctx = ssl.SSLContext(ssl.PROTOCOL_TLS)self.smtpObj = smtplib.SMTP(self.mail_host, self.mail_port)self.smtpObj.ehlo()self.smtpObj.starttls(context=ctx)elif self.mail_port == "25":self.smtpObj = smtplib.SMTP(self.mail_host, self.mail_port)elif self.mail_port == "465":self.smtpObj = smtplib.SMTP_SSL(self.mail_host, self.mail_port)# 连接self.smtpObj.connect(self.mail_host, self.mail_port)# 登录self.smtpObj.login(self.mail_user, self.mail_pass)def send_text_mail(self, subject, content, receivers):"""发送文本邮件:param subject: 邮件主题:param message: 邮件内容:param receivers: 邮件接受者:return:"""# 邮件内容message = MIMEText(content, 'plain', 'utf-8')# 邮件主题message['Subject'] = Header(subject, 'UTF-8')# 发送方信息message['From'] = Header(self.mail_sender, 'utf-8')message['To'] = ','.join(receivers)try:# 发送self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())logger.info("mail has been send successfully. send to {} ".format(receivers))except smtplib.SMTPException as e:logger.error('error', e)def send_html_mail(self,subject, content, receivers):"""发送HTML格式邮件:param subject: 邮件主题:param message: 邮件内容:param receivers: 邮件接受者:return:"""# 邮件内容message = MIMEText(content, 'html', 'utf-8')# 邮件主题message['Subject'] = Header(subject, 'UTF-8')# 发送方信息message['From'] = Header(self.mail_sender, 'utf-8')message['To'] = ','.join(receivers)try:# 发送self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())logger.info("mail has been send successfully. send to {} ".format(receivers))except smtplib.SMTPException as e:logger.error('error', e)def send_appendix_mail(self,subject, content, receivers):"""发送带附件的邮件"""# 创建一个带附件的实例message = MIMEMultipart()message['From'] = Header(self.mail_sender, 'utf-8')message['To'] = ','.join(receivers)# 邮件主题message['Subject'] = Header(subject, 'UTF-8')# 邮件正文内容message.attach(MIMEText(content, 'plain', 'utf-8'))# 构造附件,传送当前目录下的 extract.pyatt = MIMEText(open('extract.py','rb').read(),'base64', 'utf-8')# 这里的filename可以任意写,写什么名字,邮件中显示什么名字att["Content-Disposition"] = 'attachment; filename="extract.py"'message.attach(att)try:# 发送self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())logger.info("mail has been send successfully. send to {} ".format(receivers))except smtplib.SMTPException as e:logger.error('error', e)def exit(self):# 关闭会话self.smtpObj.quit()
邮件配置通过读取配置文件实现的
调用:
if __name__ == '__main__':mail = SendMail()subject = "邮件工具类测试"message = "这是一个test"receivers = ['zhengxianyi@touch-spring.com']mail.send_appendix_mail(subject, message, receivers)
