import json import re import sys import time from mailModel.base import Base sys.path.append("class/") import public class main(Base): def __init__(self): pass def check_main_conf(self, get=None): """ 检查主配置文件 @return: """ main_conf = public.readFile("/etc/postfix/main.cf") if not main_conf: return {"status": False, "msg": "主配置文件不存在"} conf = "virtual_alias_maps = sqlite:/etc/postfix/sqlite_virtual_alias_new_maps.cf, sqlite:/etc/postfix/sqlite_virtual_alias_domain_new_maps.cf, sqlite:/etc/postfix/sqlite_virtual_alias_domain_catchall_new_maps.cf, sqlite:/etc/postfix/bt_catchnone_maps.cf" if conf not in main_conf: public.print_log("主配置文件检查不通过,开始修改") main_conf = re.sub(r'virtual_alias_maps\s*=.*', conf, main_conf) public.writeFile("/etc/postfix/main.cf", main_conf) return {"status": True, "msg": "主配置文件检查完成"} def check_maps_conf(self, get=None): """ 检查maps配置文件 @return: """ if public.FileMd5("/etc/postfix/sqlite_virtual_alias_new_maps.cf") != "11ea7f20ced0b1b5cfff7aa8bb818600": public.print_log("开始下载maps配置文件") public.ExecShell( 'wget -O /etc/postfix/sqlite_virtual_alias_new_maps.cf {}/mail_sys/postfix/sqlite_virtual_alias_new_maps.cf -T 10'.format( public.get_url())) if public.FileMd5("/etc/postfix/sqlite_virtual_alias_domain_new_maps.cf") != "523b9217adfb715b1e0badd874e30904": public.print_log("开始下载maps配置文件") public.ExecShell( 'wget -O /etc/postfix/sqlite_virtual_alias_domain_new_maps.cf {}/mail_sys/postfix/sqlite_virtual_alias_domain_new_maps.cf -T 10'.format( public.get_url())) if public.FileMd5("/etc/postfix/sqlite_virtual_alias_domain_catchall_new_maps.cf") != "a6c4368fef0b6c27be690f354e970344": public.print_log("开始下载maps配置文件") public.ExecShell( 'wget -O /etc/postfix/sqlite_virtual_alias_domain_catchall_new_maps.cf {}/mail_sys/postfix/sqlite_virtual_alias_domain_catchall_new_maps.cf -T 10'.format( public.get_url())) if public.FileMd5("/etc/postfix/bt_catchnone_maps.cf") != "d41d9d8159ada493f1278ab737e1c47c": public.print_log("开始下载maps配置文件") public.ExecShell( 'wget -O /etc/postfix/bt_catchnone_maps.cf {}/mail_sys/postfix/bt_catchnone_maps.cf -T 10'.format( public.get_url())) return {"status": True, "msg": "maps配置文件检查完成"} def get_mail_forward(self, get): """ 获取邮件转发 @param get: @return: """ dtype = "0" if "dtype" in get: dtype = get.dtype if dtype == "1": data = self.M("alias_domain").field('alias_domain as address,alias_domain as domain,alias_domain as forwarder,target_domain as goto,created,modified,active').order('created desc').select() else: data = self.M("alias").order('created desc').select() for i in data: user = i["address"].split("@")[0] if not user: i["rule"] = "none" i["rule_str"] = "" i["forwarder"] = "[不存在的邮箱]" else: if user == "%": i["rule"] = "all" i["rule_str"] = "" i["forwarder"] = "[全部邮箱]" elif user[0] == "%" and user[-1] == "%": i["rule"] = "contain" i["rule_str"] = user[1:-1] i["forwarder"] = "包含[{}]的邮箱".format(user[1:-1]) elif user[0] == "%": i["rule"] = "suffix" i["rule_str"] = user[1:] i["forwarder"] = "以[{}]结尾的邮箱".format(user[1:]) elif user[-1] == "%": i["rule"] = "prefix" i["rule_str"] = user[:-1] i["forwarder"] = "以[{}]开头的邮箱".format(user[:-1]) else: i["rule"] = "" i["rule_str"] = "" i["forwarder"] = i["address"] i["goto"] = i["goto"].replace(",", "\n") return {"status": True, "msg": "", "data": data} def add_forward(self, get): """ 添加邮件转发 @param get: @return: """ modified_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) if get.forward_type == "1": if self.M("alias_domain").where("alias_domain=?", (get.domain,)).count() > 0: return {"status": False, "msg": "域名【{}】转发规则已存在".format(get.domain)} self.M("alias_domain").add("alias_domain,target_domain,created,modified,active", (get.domain, get.receiver, modified_time, modified_time, int(get.status))) else: if "rule"not in get or not get.rule: if not get.rule_str: return {"status": False, "msg": "被转发邮箱不能为空", "bind_success": []} address = get.rule_str elif get.rule in ("all","none") : if get.rule == "all": address = "%@"+get.domain if self.M("alias").where("address=?", ("@"+get.domain,)).count() > 0: return {"status": False, "msg": "同一域名,捕获全部邮箱转发和捕获不存在的邮箱转发不能同时存在"} else: address = "@"+get.domain if self.M("alias").where("address=?", ("%@"+get.domain,)).count() > 0: return {"status": False, "msg": "同一域名,捕获全部邮箱转发和捕获不存在的邮箱转发不能同时存在"} elif get.rule in ("contain","suffix","prefix"): if len(get.rule_str) > 10: return {"status": False, "msg": "规则内容长度不能大于10", "bind_success": []} if not re.match(r"^[a-zA-Z0-9_]+$", get.rule_str): return {"status": False, "msg": "规则内容只能包含字母、数字和下划线", "bind_success": []} if get.rule == "contain": address = "%"+get.rule_str+"%@"+get.domain elif get.rule == "suffix": address = "%"+get.rule_str+"@"+get.domain else: address = get.rule_str+"%@"+get.domain else: return {"status": False, "msg": "规则错误"} if self.M("alias").where("address=?", (address,)).count() > 0: return {"status": False, "msg": "此规则已存在,请勿重复添加"} receiver = get.receiver.strip().replace("\n", ",") self.M("alias").add("address,goto,domain,created,modified,active", (address, receiver, get.domain, modified_time, modified_time, int(get.status))) return {"status": True, "msg": "添加成功"} def edit_forward(self, get): """ 编辑邮件转发 @param get: @return: """ modified_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) if get.forward_type == "1": self.M("alias_domain").where("alias_domain=?", (get.address,)).update( {"target_domain": get.receiver, "modified": modified_time, "active": int(get.status)}) else: receiver = get.receiver.strip().replace("\n", ",") self.M("alias").where("address=?", (get.address,)).update( {"goto": receiver, "modified": modified_time, "active": int(get.status)}) return {"status": True, "msg": "修改成功"} def del_forward(self, get): """ 删除邮件转发 @param get: @return: """ address = get.address.split(",") if get.forward_type == "1": self.M("alias_domain").where("alias_domain in ('{}')".format("','".join(address)), ()).delete() else: self.M("alias").where("address in ('{}')".format("','".join(address)), ()).delete() return {"status": True, "msg": "删除成功"} def _conf(): try: main().check_main_conf() main().check_maps_conf() public.ExecShell("postfix reload") except: public.print_log(public.get_error_info()) _conf() del _conf