使用:https://www.yuque.com/u1046159/erg6ec/crqnud#VvPYQ
SendEmail.py
"""
邮件发送工具
Python对SMTP支持有smtplib和email两个模块:
1. email负责构造邮件
2. smtplib负责发送邮件。
"""
import smtplib
import ssl
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import attach as attach
from loguru import logger
from utils.ReadConfig import ReadConfig
class SendMail:
def __init__(self):
"""
初始化smtp服务器连接
smtp 服务器端口,仅能使用25、465和587
25端口(明文传输)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.py
att = 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)