123 lines
4.0 KiB
Python
123 lines
4.0 KiB
Python
|
import os,smtplib
|
||
|
from email.mime.multipart import MIMEMultipart
|
||
|
from email.mime.text import MIMEText
|
||
|
from email.mime.base import MIMEBase
|
||
|
from email.header import Header
|
||
|
from email import encoders
|
||
|
class SMTPMailer():
|
||
|
__send__ = 0
|
||
|
__essl__ = False
|
||
|
__host__ = {
|
||
|
"host": '',
|
||
|
"port": 25
|
||
|
}
|
||
|
__user__ = {
|
||
|
"user": '',
|
||
|
"pass": ''
|
||
|
}
|
||
|
__mail__ = {
|
||
|
"fr": {"name": '', "addr": ''},
|
||
|
"to": [],
|
||
|
"cc": [],
|
||
|
"bc": [],
|
||
|
"attachs": [],
|
||
|
"subject": '',
|
||
|
"content": ''
|
||
|
}
|
||
|
def enableSSL(self, ch=True):
|
||
|
self.__essl__ = ch
|
||
|
|
||
|
def host(self, host, port):
|
||
|
self.__host__["host"] = host
|
||
|
self.__host__["port"] = port
|
||
|
|
||
|
def user(self, user, password):
|
||
|
self.__user__["user"] = user
|
||
|
self.__user__["pass"] = password
|
||
|
|
||
|
def sendFrom(self, name='', addr=''):
|
||
|
self.__mail__["fr"]["name"] = name
|
||
|
self.__mail__["fr"]["addr"] = addr
|
||
|
|
||
|
def sendTo(self,recvlist):
|
||
|
if isinstance(recvlist, str):
|
||
|
recvlist = [recvlist]
|
||
|
self.__mail__["to"] = recvlist
|
||
|
|
||
|
def sendCc(self,recvlist):
|
||
|
if isinstance(recvlist, str):
|
||
|
recvlist = [recvlist]
|
||
|
self.__mail__["cc"] = recvlist
|
||
|
|
||
|
def sendBc(self,recvlist):
|
||
|
if isinstance(recvlist, str):
|
||
|
recvlist = [recvlist]
|
||
|
self.__mail__["bc"] = recvlist
|
||
|
|
||
|
def subject(self,text):
|
||
|
self.__mail__["subject"] = text
|
||
|
|
||
|
def content(self, text):
|
||
|
self.__mail__["content"] = text
|
||
|
|
||
|
def attachs(self,filelist):
|
||
|
if isinstance(filelist, str):
|
||
|
filelist = [filelist]
|
||
|
for value in filelist:
|
||
|
if not os.path.exists(value):
|
||
|
raise Exception('文件未找到 | File not found.')
|
||
|
self.__mail__["attachs"] = filelist
|
||
|
|
||
|
def send(self):
|
||
|
if self.__send__:
|
||
|
return {"code": 1, "message": 'Mail has been sent.'}
|
||
|
message = MIMEMultipart()
|
||
|
messageFrom = Header()
|
||
|
messageFrom.append(self.__mail__["fr"]["name"])
|
||
|
messageFrom.append('<' + self.__mail__["fr"]["addr"] + '>')
|
||
|
message["From"] = messageFrom
|
||
|
message["To"] = ';'.join(self.__mail__["to"])
|
||
|
message["Cc"] = ';'.join(self.__mail__["cc"])
|
||
|
message["Bcc"] = ';'.join(self.__mail__["bc"])
|
||
|
message['Subject'] = Header(self.__mail__["subject"])
|
||
|
message.attach(MIMEText(self.__mail__["content"], 'html', 'utf-8'))
|
||
|
for value in self.__mail__["attachs"]:
|
||
|
mime = MIMEBase('application', 'octet-stream')
|
||
|
mime.add_header('Content-Disposition', 'attachment', filename=os.path.basename(value))
|
||
|
mime.set_payload(open(value, 'rb').read())
|
||
|
encoders.encode_base64(mime)
|
||
|
message.attach(mime)
|
||
|
try:
|
||
|
if self.__essl__:
|
||
|
smtp = smtplib.SMTP_SSL(self.__host__["host"], self.__host__["port"])
|
||
|
else:
|
||
|
smtp = smtplib.SMTP(self.__host__["host"], self.__host__["port"])
|
||
|
except:
|
||
|
return {"code": 1, "message": 'Connection failure.'}
|
||
|
try:
|
||
|
smtp.login(self.__user__["user"], self.__user__["pass"])
|
||
|
except:
|
||
|
return {"code": 1, "message": 'Authentication failed.'}
|
||
|
try:
|
||
|
smtp.sendmail(self.__user__["user"], self.__mail__["to"] + self.__mail__["cc"] + self.__mail__["bc"], message.as_string())
|
||
|
smtp.quit()
|
||
|
self.__send__ = 1
|
||
|
return {"code": 0, "message": ''}
|
||
|
except Exception as error:
|
||
|
return {"code": 1, "message": error}
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
# Example.
|
||
|
mailer = SMTPMailer()
|
||
|
mailer.enableSSL(True)
|
||
|
mailer.host('smtp.qq.com', 465)
|
||
|
mailer.user('', '')
|
||
|
mailer.sendFrom('', '')
|
||
|
mailer.sendTo([''])
|
||
|
mailer.sendCc([''])
|
||
|
mailer.sendBc([''])
|
||
|
mailer.subject('这是一封测试邮件')
|
||
|
mailer.content('<p>邮件发送HTML格式文件测试</p><p><a href="http://www.baidu.com/">这是一个链接</a></p>')
|
||
|
mailer.attachs(['./example.xlsx'])
|
||
|
print(mailer.send())
|