From 372dbc8995128c785f8b29a55ab3391e33446dc0 Mon Sep 17 00:00:00 2001 From: midoks Date: Sun, 18 Sep 2022 00:05:45 +0800 Subject: [PATCH] =?UTF-8?q?mail=20=20=E6=B7=BB=E5=8A=A0=E5=9F=9F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/mail/index.py | 80 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/plugins/mail/index.py b/plugins/mail/index.py index b6ff50b03..d7f8470ba 100755 --- a/plugins/mail/index.py +++ b/plugins/mail/index.py @@ -5,7 +5,20 @@ import io import os import time +from datetime import datetime + +try: + import dns.resolver +except: + if os.path.exists(os.getcwd() + '/bin'): + mw.mw(os.getcwd() + '/bin/pip install dnspython') + else: + mw.execShell('pip install dnspython') + import dns.resolver + + sys.path.append(os.getcwd() + "/class/core") + import mw app_debug = False @@ -52,7 +65,7 @@ def status(): return 'start' -def pSqliteDb(dbname='domain'): +def M(dbname='domain'): file = getServerDir() + '/postfixadmin.db' name = 'mail' if not os.path.exists(file): @@ -72,9 +85,74 @@ def pSqliteDb(dbname='domain'): return conn +def __check_a(hostname): + key = '{0}:{1}'.format(hostname, 'A') + now = int(time.time()) + + value = "" + error_ip = "" + + ipaddress = mw.getLocalIp() + if not ipaddress: + return False, {"status": 0, "v_time": now, "value": error_ip} + + try: + resolver = dns.resolver.Resolver() + resolver.timeout = 1 + try: + result = resolver.resolve(hostname, 'A') + except: + result = resolver.query(hostname, 'A') + + for i in result.response.answer: + for j in i.items: + error_ip = j + if str(j).strip() in ipaddress: + value = str(j).strip() + + if value: + return True, {"status": 1, "v_time": now, "value": value} + return False, {"status": 0, "v_time": now, "value": error_ip} + except Exception as e: + raise e + return False, {"status": 0, "v_time": now, "value": error_ip} + + def addDomain(): args = getArgs() + if 'domain' not in args: + return mw.returnJson(False, '请传入域名') + + domain = args['domain'] + a_record = args['a_record'] + + if not a_record.endswith(domain): + return mw.returnJson(False, 'A记录 [{}] 不属于该域名'.format(a_record)) + + if not mw.isDebugMode(): + check = __check_a(a_record) + if not check[0]: + return mw.returnJson(False, 'A记录解析失败
域名:{}
IP:{}'.format(a_record, check[1]['value'])) + + if M('domain').where("domain=?", (domain,)).count() > 0: + return mw.returnJson(False, '该域名已存在') + + cur_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + try: + M('domain').add('domain,a_record,created', + (domain, a_record, cur_time)) + except: + return mw.returnJson(False, '邮局没有初始化成功!
' + '请尝试重新初始化,
' + '如果以下端口没访问将无法初始化
port 25 [outbound direction]
' + '你可以尝试执行以下命令测试端口是否开启:

[ telnet gmail-smtp-in.l.google.com 25 ]
') + + # 在虚拟用户家目录创建对应域名的目录 + if os.path.exists('/www/vmail'): + if not os.path.exists('/www/vmail/{0}'.format(domain)): + os.makedirs('/www/vmail/{0}'.format(domain)) + mw.execShell('chown -R vmail:mail /www/vmail/{0}'.format(domain)) return mw.returnJson(False, 'OK')