From 0041cbdff3e90428942db8b29498f05b5fcb2a81 Mon Sep 17 00:00:00 2001
From: midoks
Date: Thu, 30 Mar 2023 17:18:40 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=82=AE=E4=BB=B6=E9=80=9A?=
=?UTF-8?q?=E7=9F=A5=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
class/core/mw.py | 37 +++++-
class/plugin/memail.py | 43 +++++++
route/static/app/config.js | 193 +++++++++++++++++++++++++++-
route/templates/default/config.html | 20 +++
4 files changed, 291 insertions(+), 2 deletions(-)
create mode 100644 class/plugin/memail.py
diff --git a/class/core/mw.py b/class/core/mw.py
index 503c0699b..fa9278cff 100755
--- a/class/core/mw.py
+++ b/class/core/mw.py
@@ -1697,7 +1697,7 @@ def getNotifyData(is_parse=False):
data = json.loads(notify_data)
if is_parse:
- tag_list = ['tgbot']
+ tag_list = ['tgbot', 'email']
for t in tag_list:
if t in data and 'cfg' in data[t]:
data[t]['data'] = json.loads(deDoubleCrypt(t, data[t]['cfg']))
@@ -1759,6 +1759,34 @@ def tgbotNotifyTest(app_token, chat_id):
return tgbotNotifyHttpPost(app_token, chat_id, msg)
+def emailNotifyMessage(data):
+ '''
+ 邮件通知
+ '''
+ sys.path.append(os.getcwd() + "/class/plugin")
+ import memail
+ try:
+ if data['smtp_ssl'] == 'ssl':
+ memail.sendSSL(data['smtp_host'], data['smtp_port'],
+ data['username'], data['password'],
+ data['to_mail_addr'], data['subject'], data['content'])
+ else:
+ memail.send(data['smtp_host'], data['smtp_port'],
+ data['username'], data['password'],
+ data['to_mail_addr'], data['subject'], data['content'])
+ return True
+ except Exception as e:
+ print(getTracebackInfo())
+ return False
+
+
+def emailNotifyTest(data):
+ print(data)
+ data['subject'] = 'MW通知测试'
+ data['content'] = data['mail_test']
+ return emailNotifyMessage(data)
+
+
def notifyMessageTry(msg, stype='common', trigger_time=300, is_write_log=True):
lock_file = getPanelTmp() + '/notify_lock.json'
@@ -1796,6 +1824,13 @@ def notifyMessageTry(msg, stype='common', trigger_time=300, is_write_log=True):
else:
do_notify = tgbotNotifyMessage(
t['app_token'], t['chat_id'], msg)
+
+ if 'email' in data and 'enable' in data['email']:
+ if data['email']['enable']:
+ t = data['email']['data']
+ t['subject'] = 'MW通知'
+ t['content'] = msg
+ do_notify = emailNotifyMessage(t)
return do_notify
diff --git a/class/plugin/memail.py b/class/plugin/memail.py
new file mode 100644
index 000000000..6ba7b62d5
--- /dev/null
+++ b/class/plugin/memail.py
@@ -0,0 +1,43 @@
+# coding: utf-8
+
+import smtplib
+
+from email import encoders
+from email.header import Header
+from email.mime.text import MIMEText
+from email.utils import parseaddr, formataddr
+
+
+def _format_addr(s):
+ name, addr = parseaddr(s)
+ return formataddr((Header(name, 'utf-8').encode(), addr))
+
+
+def send(smtp_host, smtp_port, username, password, to_mail, subject, content):
+
+ smtp = smtplib.SMTP()
+ smtp.connect(smtp_host, port=smtp_port)
+ smtp.login(user=username, password=password)
+
+ msg = MIMEText(content, 'plain', 'utf-8')
+ msg['From'] = _format_addr(username)
+ msg['To'] = _format_addr(to_mail)
+ msg['Subject'] = Header(subject, 'utf-8').encode()
+
+ smtp.sendmail(from_addr=username, to_addrs=to_mail, msg=msg.as_string())
+ return True
+
+
+def sendSSL(smtp_host, smtp_port, username, password, to_mail, subject, content):
+
+ smtp = smtplib.SMTP_SSL(smtp_host, port=smtp_port)
+ smtp.login(user=username, password=password)
+
+ msg = MIMEText(content, 'plain', 'utf-8')
+ msg['From'] = _format_addr(username)
+ msg['To'] = _format_addr(to_mail)
+ msg['Subject'] = Header(subject, 'utf-8').encode()
+
+ smtp.sendmail(from_addr=username, to_addrs=to_mail, msg=msg.as_string())
+ smtp.quit()
+ return True
diff --git a/route/static/app/config.js b/route/static/app/config.js
index af18eb853..5912f8cd0 100755
--- a/route/static/app/config.js
+++ b/route/static/app/config.js
@@ -382,7 +382,7 @@ function getTgbot(){
layer.open({
type: 1,
area: "500px",
- title: '配置TgBot配置',
+ title: 'TgBot配置',
closeBtn: 1,
shift: 5,
btn:["确定","关闭","验证"],
@@ -401,6 +401,17 @@ function getTgbot(){
var pdata = {};
pdata['app_token'] = $('input[name="app_token"]').val();
pdata['chat_id'] = $('input[name="chat_id"]').val();
+
+ if (pdata['app_token'] == ''){
+ layer.msg('app_token不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['chat_id'] == ''){
+ layer.msg('chat_id不能为空!', {icon:2});
+ return false;
+ }
+
$.post('/config/set_notify',{'tag':'tgbot', 'data':JSON.stringify(pdata)},function(rdata){
showMsg(rdata.msg, function(){
if (rdata.status){
@@ -414,6 +425,17 @@ function getTgbot(){
var pdata = {};
pdata['app_token'] = $('input[name="app_token"]').val();
pdata['chat_id'] = $('input[name="chat_id"]').val();
+
+ if (pdata['app_token'] == ''){
+ layer.msg('app_token不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['chat_id'] == ''){
+ layer.msg('chat_id不能为空!', {icon:2});
+ return false;
+ }
+
$.post('/config/set_notify_test',{'tag':'tgbot', 'data':JSON.stringify(pdata)},function(rdata){
showMsg(rdata.msg, function(){
if (rdata.status){
@@ -427,6 +449,175 @@ function getTgbot(){
});
}
+function getEmailCfg(){
+ var loadT = layer.msg('正在获取邮件配置信息...',{icon:16,time:0,shade: [0.3, '#000']});
+ $.post('/config/get_notify',{},function(data){
+ layer.close(loadT);
+
+ var smtp_host = 'smtp.163.com';
+ var smtp_port = '25';
+ var username = 'admin';
+ var password = '';
+ var to_mail_addr = '';
+
+ var smtp_ssl_no = 'checked';
+ var smtp_ssl_yes = '';
+
+ if (data.status){
+ if (typeof(data['data']['email']) !='undefined'){
+ smtp_host = data['data']['email']['data']['smtp_host'];
+ smtp_port = data['data']['email']['data']['smtp_port'];
+ username = data['data']['email']['data']['username'];
+ password = data['data']['email']['data']['password'];
+ to_mail_addr = data['data']['email']['data']['to_mail_addr'];
+
+
+ var smtp_ssl = data['data']['email']['data']['smtp_ssl'];
+ if (smtp_ssl == 'ssl'){
+ smtp_ssl_no = '';
+ smtp_ssl_yes = 'checked';
+ }
+ }
+ }
+
+ layer.open({
+ type: 1,
+ area: "500px",
+ title: '邮件配置',
+ closeBtn: 1,
+ shift: 5,
+ btn:["确定","关闭","验证"],
+ shadeClose: false,
+ content: "",
+ yes:function(index){
+ var pdata = {};
+ pdata['smtp_host'] = $('input[name="smtp_host"]').val();
+ pdata['smtp_port'] = $('input[name="smtp_port"]').val();
+ pdata['smtp_ssl'] = $('input[name="smtp_ssl"]:checked').val();
+ pdata['username'] = $('input[name="username"]').val();
+ pdata['password'] = $('input[name="password"]').val();
+ pdata['to_mail_addr'] = $('input[name="to_mail_addr"]').val();
+
+ if (pdata['smtp_host'] == ''){
+ layer.msg('SMTP服务器不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['smtp_port'] == ''){
+ layer.msg('SMTP端口不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['username'] == ''){
+ layer.msg('用户名不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['password'] == ''){
+ layer.msg('授权码不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['to_mail_addr'] == ''){
+ layer.msg('发送地址不能为空!', {icon:2});
+ return false;
+ }
+
+ $.post('/config/set_notify',{'tag':'email', 'data':JSON.stringify(pdata)},function(rdata){
+ showMsg(rdata.msg, function(){
+ if (rdata.status){
+ layer.close(index);
+ }
+ },{icon:rdata.status?1:2},2000);
+ });
+ },
+
+ btn3:function(index){
+ var pdata = {};
+ pdata['smtp_host'] = $('input[name="smtp_host"]').val();
+ pdata['smtp_port'] = $('input[name="smtp_port"]').val();
+ pdata['smtp_ssl'] = $('input[name="smtp_ssl"]:checked').val();
+ pdata['username'] = $('input[name="username"]').val();
+ pdata['password'] = $('input[name="password"]').val();
+ pdata['to_mail_addr'] = $('input[name="to_mail_addr"]').val();
+ pdata['mail_test'] = $('textarea[name="mail_test"]').val();
+
+
+ if (pdata['smtp_host'] == ''){
+ layer.msg('SMTP服务器不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['smtp_port'] == ''){
+ layer.msg('SMTP端口不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['username'] == ''){
+ layer.msg('用户名不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['password'] == ''){
+ layer.msg('授权码不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['to_mail_addr'] == ''){
+ layer.msg('发送地址不能为空!', {icon:2});
+ return false;
+ }
+
+ if (pdata['mail_test'] == ''){
+ layer.msg('验证测试不能为空!', {icon:2});
+ return false;
+ }
+ $.post('/config/set_notify_test',{'tag':'email', 'data':JSON.stringify(pdata)},function(rdata){
+ showMsg(rdata.msg, function(){
+ if (rdata.status){
+ layer.close(index);
+ }
+ },{icon:rdata.status?1:2},2000);
+ });
+ return false;
+ }
+ });
+ });
+}
+
function getPanelSSL(){
var loadT = layer.msg('正在获取证书信息...',{icon:16,time:0,shade: [0.3, '#000']});
$.post('/config/get_panel_ssl',{},function(cert){
diff --git a/route/templates/default/config.html b/route/templates/default/config.html
index b3e67d46e..f4147ed1d 100755
--- a/route/templates/default/config.html
+++ b/route/templates/default/config.html
@@ -161,7 +161,27 @@
Telegram Bot机器人通知【国内可能无法使用】
+
+ 邮件通知
+
+
+
+ 邮件通知
+
+
+
+