229 lines
8.5 KiB
Python
229 lines
8.5 KiB
Python
|
|
#coding: utf-8
|
|||
|
|
# +-------------------------------------------------------------------
|
|||
|
|
# | YakPanel
|
|||
|
|
# +-------------------------------------------------------------------
|
|||
|
|
# | Copyright (c) 2015-2020 YakPanel(www.yakpanel.com) All rights reserved.
|
|||
|
|
# +-------------------------------------------------------------------
|
|||
|
|
# | Author: 沐落 <cjx@yakpanel.com>
|
|||
|
|
# | Author: lx
|
|||
|
|
# | 消息通道邮箱模块
|
|||
|
|
# +-------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
import os, sys, public, base64, json, re
|
|||
|
|
import sys, os
|
|||
|
|
panelPath = "/www/server/panel"
|
|||
|
|
os.chdir(panelPath)
|
|||
|
|
sys.path.insert(0,panelPath + "/class/")
|
|||
|
|
import smtplib
|
|||
|
|
from email.mime.text import MIMEText
|
|||
|
|
from email.utils import formataddr
|
|||
|
|
|
|||
|
|
class mail_msg:
|
|||
|
|
__module_name = None
|
|||
|
|
__default_pl = "{}/data/default_msg_channel.pl".format(panelPath)
|
|||
|
|
|
|||
|
|
__mail_send_conf = '/www/server/panel/data/stmp_mail.json'
|
|||
|
|
__mail_receive_conf = '/www/server/panel/data/mail_list.json'
|
|||
|
|
__mail_config = None
|
|||
|
|
def __init__(self):
|
|||
|
|
self.__mail_config = {}
|
|||
|
|
if os.path.exists('data/stmp_mail.json'):
|
|||
|
|
self.__mail_config['send'] = json.loads(public.readFile(self.__mail_send_conf))
|
|||
|
|
|
|||
|
|
if os.path.exists('data/mail_list.json'):
|
|||
|
|
self.__mail_config['receive'] = json.loads(public.readFile(self.__mail_receive_conf))
|
|||
|
|
|
|||
|
|
if not 'send' in self.__mail_config: self.__mail_config['send'] = {}
|
|||
|
|
if not 'receive' in self.__mail_config: self.__mail_config['receive'] = {}
|
|||
|
|
|
|||
|
|
if 'qq_mail' not in self.__mail_config['send'] or 'qq_stmp_pwd' not in self.__mail_config['send'] or 'hosts' not in self.__mail_config['send']: self.__mail_config = None
|
|||
|
|
|
|||
|
|
self.__module_name = self.__class__.__name__.replace('_msg','')
|
|||
|
|
|
|||
|
|
def __get_default_channel(self):
|
|||
|
|
"""
|
|||
|
|
@获取默认消息通道
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
if public.readFile(self.__default_pl) == self.__module_name:
|
|||
|
|
return True
|
|||
|
|
except:pass
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def get_version_info(self,get):
|
|||
|
|
"""
|
|||
|
|
获取版本信息
|
|||
|
|
"""
|
|||
|
|
data = {}
|
|||
|
|
data['ps'] = 'Email is used to receive panel message push'
|
|||
|
|
data['version'] = '1.1'
|
|||
|
|
data['date'] = '2022-08-10'
|
|||
|
|
data['author'] = 'YakPanel'
|
|||
|
|
data['title'] = 'Email'
|
|||
|
|
data['help'] = 'http://www.yakpanel.com'
|
|||
|
|
return data
|
|||
|
|
|
|||
|
|
def get_config(self,get):
|
|||
|
|
"""
|
|||
|
|
获取QQ邮箱配置
|
|||
|
|
"""
|
|||
|
|
data = {}
|
|||
|
|
if self.__mail_config:
|
|||
|
|
data = self.__mail_config
|
|||
|
|
if "send" in data:
|
|||
|
|
if not os.path.exists(self.__mail_send_conf):
|
|||
|
|
public.writeFile(self.__mail_send_conf,json.dumps(data["send"]))
|
|||
|
|
if "receive" in data:
|
|||
|
|
if not os.path.exists(self.__mail_receive_conf):
|
|||
|
|
public.writeFile(self.__mail_receive_conf, json.dumps(data["receive"]))
|
|||
|
|
|
|||
|
|
data['default'] = self.__get_default_channel()
|
|||
|
|
return data
|
|||
|
|
|
|||
|
|
def set_config(self,get):
|
|||
|
|
"""
|
|||
|
|
设置邮箱配置
|
|||
|
|
@send 带有此参数表示设置发送者设置
|
|||
|
|
@qq_mail 发送者邮箱
|
|||
|
|
@qq_stmp_pwd 发送者密码
|
|||
|
|
@hosts 发送stmp
|
|||
|
|
@发送端口port
|
|||
|
|
|
|||
|
|
@mails 接收者配置,一行一个(如:111@qq.com\n222@qq.com)
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
if not self.__mail_config:
|
|||
|
|
self.__mail_config = {'send':{},'receive':[]}
|
|||
|
|
|
|||
|
|
if hasattr(get, 'send'):
|
|||
|
|
if not hasattr(get, 'qq_mail') or not hasattr(get, 'qq_stmp_pwd') or not hasattr(get, 'hosts') or not hasattr(get, 'port'): return public.returnMsg(False, public.lang("Please fill in the complete information"))
|
|||
|
|
mail_config = {
|
|||
|
|
"qq_mail": get.qq_mail.strip(),
|
|||
|
|
"qq_stmp_pwd": get.qq_stmp_pwd.strip(),
|
|||
|
|
"hosts": get.hosts.strip(),
|
|||
|
|
"port": get.port
|
|||
|
|
}
|
|||
|
|
self.__mail_config['send'] = mail_config
|
|||
|
|
|
|||
|
|
else:
|
|||
|
|
mails = ''
|
|||
|
|
if hasattr(get, 'mails'):
|
|||
|
|
mails = get.mails.strip()
|
|||
|
|
|
|||
|
|
arrs = []
|
|||
|
|
for mail in mails.split('\n'):
|
|||
|
|
if not mail.strip(): continue
|
|||
|
|
arrs.append(mail.strip())
|
|||
|
|
|
|||
|
|
self.__mail_config['receive'] = arrs
|
|||
|
|
|
|||
|
|
#首次配置同步接收者配置
|
|||
|
|
receive_list = self.__mail_config['receive']
|
|||
|
|
mail_address = self.__mail_config['send']['qq_mail']
|
|||
|
|
if not mail_address in receive_list and len(receive_list) == 0:
|
|||
|
|
if not 'receive' in self.__mail_config:
|
|||
|
|
self.__mail_config['receive'] = []
|
|||
|
|
self.__mail_config['receive'].append(mail_address)
|
|||
|
|
|
|||
|
|
ret = self.send_msg("YakPanel 测试邮件")
|
|||
|
|
if ret['status']:
|
|||
|
|
|
|||
|
|
if ret['success'] <= 0:
|
|||
|
|
return public.returnMsg(False, public.lang("Sending failed, please check whether the sender configuration or receiver information is correct."))
|
|||
|
|
|
|||
|
|
public.writeFile(self.__mail_send_conf, json.dumps(self.__mail_config['send']))
|
|||
|
|
public.writeFile(self.__mail_receive_conf,json.dumps(self.__mail_config['receive']))
|
|||
|
|
|
|||
|
|
return public.returnMsg(True, public.lang("successfully set"))
|
|||
|
|
else:
|
|||
|
|
return ret
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_send_msg(self,msg):
|
|||
|
|
"""
|
|||
|
|
@name 处理md格式
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
title = None
|
|||
|
|
if msg.find("####") >= 0:
|
|||
|
|
try:
|
|||
|
|
title = re.search(r"####(.+)\n", msg).groups()[0]
|
|||
|
|
except:pass
|
|||
|
|
msg = msg.replace("\n\n","<br>").strip()
|
|||
|
|
|
|||
|
|
except:pass
|
|||
|
|
return msg,title
|
|||
|
|
|
|||
|
|
def send_msg(self,msg , title = 'YakPanel panel message push',to_email = None):
|
|||
|
|
"""
|
|||
|
|
邮箱发送
|
|||
|
|
@msg 消息正文
|
|||
|
|
@title 消息标题
|
|||
|
|
@to_email 发送给谁,默认发送所有人
|
|||
|
|
"""
|
|||
|
|
if not self.__mail_config :
|
|||
|
|
return public.returnMsg(False, public.lang("Email information is not configured correctly."))
|
|||
|
|
|
|||
|
|
if not 'port' in self.__mail_config['send']: self.__mail_config['send']['port'] = 465
|
|||
|
|
|
|||
|
|
receive_list = []
|
|||
|
|
if to_email:
|
|||
|
|
for x in to_email.split(','):
|
|||
|
|
receive_list.append(x)
|
|||
|
|
else:
|
|||
|
|
receive_list = self.__mail_config['receive']
|
|||
|
|
|
|||
|
|
res = {}
|
|||
|
|
ret_msg = {}
|
|||
|
|
error ,sucess,total = 0,0,0
|
|||
|
|
msg,n_title = self.get_send_msg(msg)
|
|||
|
|
if n_title: title = n_title
|
|||
|
|
|
|||
|
|
for email in receive_list:
|
|||
|
|
if not email: continue
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
data = MIMEText(msg, 'html', 'utf-8')
|
|||
|
|
data['From'] = formataddr([self.__mail_config['send']['qq_mail'], self.__mail_config['send']['qq_mail']])
|
|||
|
|
data['To'] = formataddr([self.__mail_config['send']['qq_mail'], email.strip()])
|
|||
|
|
data['Subject'] = title
|
|||
|
|
if int(self.__mail_config['send']['port']) == 465:
|
|||
|
|
server = smtplib.SMTP_SSL(str(self.__mail_config['send']['hosts']), str(self.__mail_config['send']['port']))
|
|||
|
|
else:
|
|||
|
|
server = smtplib.SMTP(str(self.__mail_config['send']['hosts']), str(self.__mail_config['send']['port']))
|
|||
|
|
server.login(self.__mail_config['send']['qq_mail'], self.__mail_config['send']['qq_stmp_pwd'])
|
|||
|
|
server.sendmail(self.__mail_config['send']['qq_mail'], [email.strip(), ], data.as_string())
|
|||
|
|
server.quit()
|
|||
|
|
sucess += 1
|
|||
|
|
res[email] = 1
|
|||
|
|
except :
|
|||
|
|
error += 1
|
|||
|
|
res[email] = 0
|
|||
|
|
ret_msg[email] = public.get_error_info()
|
|||
|
|
total += 1
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
if res:
|
|||
|
|
public.write_push_log(self.__module_name,title,res)
|
|||
|
|
else:
|
|||
|
|
public.WriteLog('Alarm notification','[Email] No sender configured, please configure first.')
|
|||
|
|
except:pass
|
|||
|
|
|
|||
|
|
result = public.returnMsg(True,'The sending is complete, a total of [{}] items were sent, [{}] succeeded, and [{}] failed.'.format(total,sucess,error))
|
|||
|
|
result['list'] = ret_msg
|
|||
|
|
result['success'] = sucess
|
|||
|
|
result['error'] = error
|
|||
|
|
return result
|
|||
|
|
|
|||
|
|
def push_data(self,data):
|
|||
|
|
to_email = data.get("to_email", None)
|
|||
|
|
if 'to_user' in data:
|
|||
|
|
to_email = data['to_user']
|
|||
|
|
|
|||
|
|
return self.send_msg(data['msg'],data['title'],to_email)
|
|||
|
|
|
|||
|
|
def uninstall(self):
|
|||
|
|
if os.path.exists(self.__mail_send_conf):
|
|||
|
|
os.remove(self.__mail_send_conf)
|
|||
|
|
if os.path.exists(self.__mail_receive_conf):
|
|||
|
|
os.remove(self.__mail_receive_conf)
|