diff --git a/plugins/mail/ico.png b/plugins/mail/ico.png
new file mode 100755
index 000000000..fd5d7fad1
Binary files /dev/null and b/plugins/mail/ico.png differ
diff --git a/plugins/mail/index.html b/plugins/mail/index.html
new file mode 100755
index 000000000..dfa65bf45
--- /dev/null
+++ b/plugins/mail/index.html
@@ -0,0 +1,54 @@
+
+
\ No newline at end of file
diff --git a/plugins/mail/index.py b/plugins/mail/index.py
new file mode 100755
index 000000000..37ffe8ffc
--- /dev/null
+++ b/plugins/mail/index.py
@@ -0,0 +1,241 @@
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+
+sys.path.append(os.getcwd() + "/class/core")
+import mw
+
+app_debug = False
+if mw.isAppleSystem():
+ app_debug = True
+
+
+def getPluginName():
+ return 'mail'
+
+
+def getPluginDir():
+ return mw.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return mw.getServerDir() + '/' + getPluginName()
+
+
+def getInitDFile():
+ if app_debug:
+ return '/tmp/' + getPluginName()
+ return '/etc/init.d/' + getPluginName()
+
+
+def getConf():
+ path = getServerDir() + "/redis.conf"
+ return path
+
+
+def getConfTpl():
+ path = getPluginDir() + "/config/redis.conf"
+ return path
+
+
+def getInitDTpl():
+ path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
+ return path
+
+
+def getArgs():
+ args = sys.argv[2:]
+ tmp = {}
+ args_len = len(args)
+
+ if args_len == 1:
+ t = args[0].strip('{').strip('}')
+ t = t.split(':')
+ tmp[t[0]] = t[1]
+ elif args_len > 1:
+ for i in range(len(args)):
+ t = args[i].split(':')
+ tmp[t[0]] = t[1]
+
+ return tmp
+
+
+def status():
+ data = mw.execShell(
+ "ps -ef|grep redis |grep -v grep | grep -v python | grep -v mdserver-web | awk '{print $2}'")
+
+ if data[0] == '':
+ return 'stop'
+ return 'start'
+
+
+def initDreplace():
+
+ file_tpl = getInitDTpl()
+ service_path = os.path.dirname(os.getcwd())
+
+ initD_path = getServerDir() + '/init.d'
+ if not os.path.exists(initD_path):
+ os.mkdir(initD_path)
+ file_bin = initD_path + '/' + getPluginName()
+
+ # initd replace
+ if not os.path.exists(file_bin):
+ content = mw.readFile(file_tpl)
+ content = content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(file_bin, content)
+ mw.execShell('chmod +x ' + file_bin)
+
+ # log
+ dataLog = getServerDir() + '/data'
+ if not os.path.exists(dataLog):
+ mw.execShell('chmod +x ' + file_bin)
+
+ # config replace
+ dst_conf = getServerDir() + '/redis.conf'
+ dst_conf_init = getServerDir() + '/init.pl'
+ if not os.path.exists(dst_conf_init):
+ conf_content = mw.readFile(getConfTpl())
+ conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(dst_conf, conf_content)
+ mw.writeFile(dst_conf_init, 'ok')
+
+ # systemd
+ systemDir = mw.systemdCfgDir()
+ systemService = systemDir + '/redis.service'
+ systemServiceTpl = getPluginDir() + '/init.d/redis.service.tpl'
+ if os.path.exists(systemDir) and not os.path.exists(systemService):
+ service_path = mw.getServerDir()
+ se_content = mw.readFile(systemServiceTpl)
+ se_content = se_content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(systemService, se_content)
+ mw.execShell('systemctl daemon-reload')
+
+ return file_bin
+
+
+def redisOp(method):
+ file = initDreplace()
+
+ if not mw.isAppleSystem():
+ data = mw.execShell('systemctl ' + method + ' redis')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+ data = mw.execShell(file + ' start')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def start():
+ return redisOp('start')
+
+
+def stop():
+ return redisOp('stop')
+
+
+def restart():
+ status = redisOp('restart')
+
+ log_file = runLog()
+ mw.execShell("echo '' > " + log_file)
+ return status
+
+
+def reload():
+ return redisOp('reload')
+
+
+def runInfo():
+ cmd = getServerDir() + "/bin/redis-cli info"
+ data = mw.execShell(cmd)[0]
+ res = [
+ 'tcp_port',
+ 'uptime_in_days', # 已运行天数
+ 'connected_clients', # 连接的客户端数量
+ 'used_memory', # Redis已分配的内存总量
+ 'used_memory_rss', # Redis占用的系统内存总量
+ 'used_memory_peak', # Redis所用内存的高峰值
+ 'mem_fragmentation_ratio', # 内存碎片比率
+ 'total_connections_received', # 运行以来连接过的客户端的总数量
+ 'total_commands_processed', # 运行以来执行过的命令的总数量
+ 'instantaneous_ops_per_sec', # 服务器每秒钟执行的命令数量
+ 'keyspace_hits', # 查找数据库键成功的次数
+ 'keyspace_misses', # 查找数据库键失败的次数
+ 'latest_fork_usec' # 最近一次 fork() 操作耗费的毫秒数
+ ]
+ data = data.split("\n")
+ result = {}
+ for d in data:
+ if len(d) < 3:
+ continue
+ t = d.strip().split(':')
+ if not t[0] in res:
+ continue
+ result[t[0]] = t[1]
+ return mw.getJson(result)
+
+
+def initdStatus():
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ shell_cmd = 'systemctl status redis | grep loaded | grep "enabled;"'
+ data = mw.execShell(shell_cmd)
+ if data[0] == '':
+ return 'fail'
+ return 'ok'
+
+
+def initdInstall():
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ mw.execShell('systemctl enable redis')
+ return 'ok'
+
+
+def initdUinstall():
+
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ mw.execShell('systemctl disable redis')
+ return 'ok'
+
+
+def runLog():
+ return getServerDir() + '/data/redis.log'
+
+if __name__ == "__main__":
+ func = sys.argv[1]
+ if func == 'status':
+ print(status())
+ elif func == 'start':
+ print(start())
+ elif func == 'stop':
+ print(stop())
+ elif func == 'restart':
+ print(restart())
+ elif func == 'reload':
+ print(reload())
+ elif func == 'initd_status':
+ print(initdStatus())
+ elif func == 'initd_install':
+ print(initdInstall())
+ elif func == 'initd_uninstall':
+ print(initdUinstall())
+ elif func == 'run_info':
+ print(runInfo())
+ elif func == 'conf':
+ print(getConf())
+ elif func == 'run_log':
+ print(runLog())
+ else:
+ print('error')
diff --git a/plugins/mail/info.json b/plugins/mail/info.json
new file mode 100755
index 000000000..b8dd1eace
--- /dev/null
+++ b/plugins/mail/info.json
@@ -0,0 +1,18 @@
+{
+ "sort": 7,
+ "ps": "简单邮件服务[DEV]",
+ "name": "mail",
+ "title": "mail",
+ "shell": "install.sh",
+ "versions":["1.0"],
+ "updates":["1.0"],
+ "tip": "soft",
+ "checks": "server/mail",
+ "path": "server/mail",
+ "display": 1,
+ "author": "midoks",
+ "date": "2022-09-13",
+ "home": "https://github.com/midoks/mdserver-web",
+ "type": 0,
+ "pid": "2"
+}
\ No newline at end of file
diff --git a/plugins/mail/install.sh b/plugins/mail/install.sh
new file mode 100755
index 000000000..04a563fe9
--- /dev/null
+++ b/plugins/mail/install.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+curPath=`pwd`
+rootPath=$(dirname "$curPath")
+rootPath=$(dirname "$rootPath")
+serverPath=$(dirname "$rootPath")
+
+install_tmp=${rootPath}/tmp/mw_install.pl
+
+action=$1
+type=$2
+
+if [ "${2}" == "" ];then
+ echo '缺少安装脚本...' > $install_tmp
+ exit 0
+fi
+
+if [ ! -d $curPath/versions/$2 ];then
+ echo '缺少安装脚本2...' > $install_tmp
+ exit 0
+fi
+
+sh -x $curPath/versions/$2/install.sh $1
diff --git a/plugins/mail/versions/1.0/install.sh b/plugins/mail/versions/1.0/install.sh
new file mode 100755
index 000000000..7ec7a436e
--- /dev/null
+++ b/plugins/mail/versions/1.0/install.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+curPath=`pwd`
+rootPath=$(dirname "$curPath")
+rootPath=$(dirname "$rootPath")
+serverPath=$(dirname "$rootPath")
+
+install_tmp=${rootPath}/tmp/mw_install.pl
+VERSION=$2
+
+cpu_arch=`arch`
+if [[ $cpu_arch != "x86_64" ]];then
+ echo 'Does not support non-x86 system installation'
+ exit 0
+fi
+
+# if [ -f "/usr/bin/apt-get" ];then
+# systemver='ubuntu'
+# elif [ -f "/etc/redhat-release" ];then
+# systemver=`cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/'`
+# postfixver=`postconf mail_version|sed -r 's/.* ([0-9\.]+)$/\1/'`
+# else
+# echo 'Unsupported system version'
+# exit 0
+# fi
+
+bash ${rootPath}/scripts/getos.sh
+OSNAME=`cat ${rootPath}/data/osname.pl`
+OSNAME_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'`
+
+
+
+Install_debain(){
+
+}
+
+Install_App()
+{
+ echo '正在安装脚本文件...' > $install_tmp
+ mkdir -p $serverPath/source
+
+ if [[ $OSNAME = "centos" ]]; then
+
+ if [[ $OSNAME_ID == "7" ]];then
+ Install_centos7
+ fi
+
+ if [[ $OSNAME_ID == "8" ]];then
+ Install_centos8
+ fi
+
+ elif [[ $OSNAME = "debian" ]]; then
+ Install_debain
+ else
+ Install_ubuntu
+ fi
+}
+
+Uninstall_App()
+{
+
+ if [ -f $serverPath/mail/initd/mail ];then
+ $serverPath/mail/initd/mail stop
+ fi
+
+ rm -rf $serverPath/mail
+ echo "Uninstall_Mail" > $install_tmp
+}
+
+action=$1
+if [ "${1}" == 'install' ];then
+ Install_App
+else
+ Uninstall_App
+fi
diff --git a/plugins/php/versions/common/gettext.sh b/plugins/php/versions/common/gettext.sh
new file mode 100755
index 000000000..602671413
--- /dev/null
+++ b/plugins/php/versions/common/gettext.sh
@@ -0,0 +1,113 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+curPath=`pwd`
+
+rootPath=$(dirname "$curPath")
+rootPath=$(dirname "$rootPath")
+rootPath=$(dirname "$rootPath")
+rootPath=$(dirname "$rootPath")
+serverPath=$(dirname "$rootPath")
+sourcePath=${serverPath}/source/php
+
+actionType=$1
+version=$2
+
+LIBNAME=gettext
+LIBV=0
+
+# if [ "$version" == "53" ];then
+# echo "i wont support it"
+# exit
+# fi
+
+LIB_PATH_NAME=lib/php
+if [ -d $serverPath/php/${version}/lib64 ];then
+ LIB_PATH_NAME=lib64
+fi
+
+NON_ZTS_FILENAME=`ls $serverPath/php/${version}/${LIB_PATH_NAME}/extensions | grep no-debug-non-zts`
+extFile=$serverPath/php/${version}/${LIB_PATH_NAME}/extensions/${NON_ZTS_FILENAME}/${LIBNAME}.so
+
+sysName=`uname`
+if [ "$sysName" == "Darwin" ];then
+ BAK='_bak'
+else
+ BAK=''
+fi
+
+Install_lib()
+{
+
+ isInstall=`cat $serverPath/php/$version/etc/php.ini|grep "${LIBNAME}.so"`
+ if [ "${isInstall}" != "" ];then
+ echo "php-$version 已安装${LIBNAME},请选择其它版本!"
+ return
+ fi
+
+ if [ ! -f "$extFile" ];then
+
+ if [ ! -d $sourcePath/php${version}/ext ];then
+ cd $serverPath/mdserver-web/plugins/php && /bin/bash install.sh install ${version}
+ fi
+
+ cd $sourcePath/php${version}/ext/${LIBNAME}
+
+ $serverPath/php/$version/bin/phpize
+ ./configure --with-php-config=$serverPath/php/$version/bin/php-config
+
+ FIND_C99=`cat Makefile|grep c99`
+ if [ "$FIND_C99" == "" ];then
+ sed -i $BAK 's/CFLAGS \=/CFLAGS \= -std=c99/g' Makefile
+ fi
+
+ make clean && make && make install && make clean
+
+ fi
+
+ if [ ! -f "$extFile" ];then
+ echo "ERROR!"
+ return
+ fi
+
+
+ echo "" >> $serverPath/php/$version/etc/php.ini
+ echo "[${LIBNAME}]" >> $serverPath/php/$version/etc/php.ini
+ echo "extension=${LIBNAME}.so" >> $serverPath/php/$version/etc/php.ini
+
+ bash ${rootPath}/plugins/php/versions/lib.sh $version restart
+ echo '==========================================================='
+ echo 'successful!'
+}
+
+
+Uninstall_lib()
+{
+ if [ ! -f "$serverPath/php/$version/bin/php-config" ];then
+ echo "php-$version 未安装,请选择其它版本!"
+ return
+ fi
+
+ if [ ! -f "$extFile" ];then
+ echo "php-$version 未安装${LIBNAME},请选择其它版本!"
+ return
+ fi
+
+ echo $serverPath/php/$version/etc/php.ini
+ sed -i $BAK "/${LIBNAME}.so/d" $serverPath/php/$version/etc/php.ini
+ sed -i $BAK "/${LIBNAME}/d" $serverPath/php/$version/etc/php.ini
+
+ rm -f $extFile
+ bash ${rootPath}/plugins/php/versions/lib.sh $version restart
+ echo '==============================================='
+ echo 'successful!'
+}
+
+
+
+if [ "$actionType" == 'install' ];then
+ Install_lib
+elif [ "$actionType" == 'uninstall' ];then
+ Uninstall_lib
+fi
\ No newline at end of file
diff --git a/plugins/php/versions/phplib.conf b/plugins/php/versions/phplib.conf
index 765163585..3862c4a68 100755
--- a/plugins/php/versions/phplib.conf
+++ b/plugins/php/versions/phplib.conf
@@ -219,6 +219,28 @@
"shell": "igbinary.sh",
"check": "igbinary.so"
},
+ {
+ "name": "gettext",
+ "versions": [
+ "52",
+ "53",
+ "54",
+ "55",
+ "56",
+ "70",
+ "71",
+ "72",
+ "73",
+ "74",
+ "80",
+ "81",
+ "82"
+ ],
+ "type": "通用扩展",
+ "msg": "国际化与本地化!",
+ "shell": "gettext.sh",
+ "check": "gettext.so"
+ },
{
"name": "gd",
"versions": [