Add Class Mail.

This commit is contained in:
zhaoyafan 2022-06-28 15:13:05 +08:00
parent 38ffac0b70
commit 76fcaa9bb1
4 changed files with 195 additions and 1 deletions

122
Base/Class/Mail.py Normal file
View File

@ -0,0 +1,122 @@
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())

View File

@ -2,7 +2,9 @@ import re,chardet,platform,subprocess,socket
def ping(host='', version=None):
def sh(cmd='', timeout=None):
try:
result = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, timeout=timeout)
result = subprocess.run(
cmd, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, timeout=timeout)
if result.stdout:
return result.stdout.decode(chardet.detect(result.stdout)["encoding"] or 'UTF-8')
return ''

70
main3.py Normal file
View File

@ -0,0 +1,70 @@
import 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
mail_host = {
"host": 'smtp.qq.com',
"port": 465
}
mail_user = {
"user": 'admin@fanscloud.net',
"pass": 'gyzzvmjdlofnbedj'
}
sender = "admin@fanscloud.net"
mailToList = [
"1634991757@qq.com",
"fanscloud@foxmail.com"
]
mailCcList = [
"zhaoyafan@foxmail.com"
]
mailBcList = [
]
html = '''
<p>Python 邮件发送HTML格式文件测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
'''
message = MIMEMultipart()
messageFrom = Header()
messageFrom.append('云凡网络')
messageFrom.append('<admin@fanscloud.net>')
print(messageFrom)
message["From"] = messageFrom
message["To"] = ';'.join(mailToList)
message["Cc"] = ';'.join(mailCcList)
message["Bcc"] = ';'.join(mailBcList)
message['Subject'] = Header('主题333')
message.attach(MIMEText(html, 'html', 'utf-8'))
# 构造附件2传送当前目录下的 runoob.txt 文件
# att2 = MIMEText(open('./1.xlsx', 'rb').read(), 'base64', 'utf-8')
# att2["Content-Type"] = 'application/octet-stream'
# file = Header('attachment; filename=')
#
# att2["Content-Disposition"] = file
# message.attach(att2)
#
#
# print(file)
mime = MIMEBase('application','octet-stream')
mime.add_header('Content-Disposition', 'attachment', filename='文件文件.xlsx')
mime.set_payload(open('./1.xlsx', 'rb').read())
# 用Base64编码:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
message.attach(mime)
print("加密后的发送内容\n", message.as_string()) # 打印输出加密后的发送内容
#
#
smtpObj = smtplib.SMTP_SSL(mail_host['host'], mail_host['port'])
# smtpObj.connect(mail_host['host'], mail_host['port']) # 链接 SMTP 服务器
smtpObj.login(mail_user['user'], mail_user['pass']) # 登录邮箱验证
smtpObj.sendmail(sender, mailToList, message.as_string()) # 发送邮件; "message" 通过 "as_string()" 进行发送内容字符串的加密

0
main4.py Normal file
View File