class Processor(object): def __init__(self, task): # 邮件基本信息 self.task = task self.task_date, self.task_id = task.split(',')[:2] self.model = get_mail_model(self.task_date) self.mail_obj = self.model.objects.get(pk=self.task_id) self.uid = self.mail_obj.customer.id def _init(self): self.key = self.mail_obj.get_mail_filename() self.mail_content = self.mail_obj.get_mail_content() self.size = self.mail_obj.size self.mail_from = self.mail_obj.mail_from.lower() self.mail_to = self.mail_obj.mail_to.lower() self.mail_path = self.mail_obj.get_mail_path() self.subject = self.mail_obj.subject self.same_mails = self.model.objects.filter(mail_id=self.task_id, state__in=['check', 'review']) self.same_keys = [m.get_mail_filename() for m in self.same_mails] self.parse_obj = ParseEmail(self.mail_content) self.parse_data = self.parse_obj.parseMailTemplate() # self.content = strip_tags(self.parse_obj.get_content(self.parse_data)) self.content = self.parse_obj.get_content(self.parse_data) self.customer_setting, _ = CustomerSetting.objects.get_or_create(customer_id=self.uid) self.task_info = self.task.decode('utf-8', 'ignore') self.attachments = self.parse_data.get('attachments', []) self.client_ip = self.mail_obj.client_ip self.real_client_ip = get_real_client_ip(self.parse_obj.obj, self.client_ip) # 运行处理器 @common.fn_timer def run(self): self._init() if not os.path.exists(self.mail_path): outerror(u'not found mail file: {}'.format(self.task)) return # 发件人格式检测 if self._do_check_format(): return # 白名单监测 if self._do_sender_checklist('sender_whitelist'): return # 黑名单监测 if self._do_sender_checklist('c_sender_blacklist'): return # 小危附件监测 if self._do_attach_check(): return # 免审关键字过滤 if self._do_auto_reject(): return # dspam垃圾检测 if self._dspamc(): return # spf 检测 if self._check_spf(): return if self._do_virus(): return # ctasd检测 if self._ctasd_spam(): return # esets 病毒检测 #if self._esets(): # return # savi垃圾检测 # if self._savi(): # return #发件人黑名单检测 if self._do_sender_blacklist(): return #主题关键字黑名单检测 if self._do_subject_keyword_blacklist(): return #内容关键字黑名单检测 if self._do_keyword_blacklist(): return #spam垃圾检测 if self._spamc(): return #高危邮件检测 self._do_high_risk() #收件人强制检测名单 self._do_recipient_checklist() return @common.fn_timer def _dspamc(self): if not self.customer_setting.check_dspam: return False if setting.dspam_max_size and self.size > setting.dspam_max_size: return False try: with gevent.Timeout(60): #res = dspamc2(self.mail_content) res = dspamc(self.mail_path) #self.mail_obj.dspam_sig = res.get('signature', '') result = res.get('class', '') if result in ['virus', 'spam']: message = res.get('message', '') self.mail_obj.check_result = result self.mail_obj.check_message = message outinfo(u'[Dspam] {}: {}'.format(self.task_info, message)) return True except gevent.Timeout: outerror(u'dspam check time out :{}'.format(self.task_info)) outerror(traceback.format_exc()) except BaseException as e: outerror(u'dspam check error :{}'.format(self.task_info)) outerror(traceback.format_exc()) return False # 病毒邮件检测 @common.fn_timer def _do_virus(self): # 进行病毒邮件检测 try: pyclamd.init_unix_socket(clamav_sock) res = pyclamd.scan_file(self.mail_path) except Exception, err: outerror(u'virus check error :{}'.format(self.task_info)) outerror(traceback.format_exc()) return False # 邮件没有病毒时,直接返回 if res: try: detail = res.values()[0][1] except: detail = 'virus' outinfo(u'[ClamAV] {}: {}'.format(self.task_info, detail)) self.mail_obj.check_result = 'virus' self.mail_obj.check_message = detail return True return False
class Processor(object): def __init__(self, task): # 邮件基本信息 self.task = task self.task_date, self.task_id = task.split(',')[:2] model = get_mail_model(self.task_date) self.mail_obj = model.objects.get(pk=self.task_id) self.uid = self.mail_obj.customer.id self.size = self.mail_obj.size self.mail_from = self.mail_obj.mail_from.lower() self.mail_to = self.mail_obj.mail_to.lower() self.mail_path = self.mail_obj.get_mail_path() self.subject = self.mail_obj.subject self.same_mails = model.objects.filter(mail_id=self.task_id, state__in=['check', 'review']) self.mails_count = self.same_mails.count() self.same_keys = [m.get_mail_filename() for m in self.same_mails] self.key = self.mail_obj.get_mail_filename() self.parse_obj = ParseEmail(self.mail_obj.get_mail_content()) self.parse_data = self.parse_obj.parseMailTemplate() # self.content = strip_tags(self.parse_obj.get_content(self.parse_data)) self.content = self.parse_obj.get_content(self.parse_data) self.mail_to_length = model.objects.filter( mail_id=self.task_id).count() + 1 self.check_result = '' self.attachments = self.parse_data.get('attachments', []) self.customer_setting, _ = CustomerSetting.objects.get_or_create( customer_id=self.uid) # 运行处理器 # @Common.fn_timer def run(self): if not os.path.exists(self.mail_path): outerror('not found mail file: {}'.format(self.task)) return # 收件人格式检测 # 无效地址检测 # 收件人黑名单检测 # 发件人格式检测 if self._do_check_format(): return # 发件人白名单检测 if self._do_check_sender_whitelist(): return #小危附件监测 if self._do_attach_check(): return # 发件人域名黑名单检测 if self._do_domain_blacklist(): return # 邮件大小检测 if self._do_check_mail_size(): return # 群发邮件检测 if self._do_bulk_email(): return # 免审关键字过滤 if self._do_auto_reject(): return # dspam垃圾检测 if self._dspamc(): return # dspam垃圾检测 if self._do_virus(): return # 发件人黑名单检测 if self._do_sender_blacklist(): return # 自动回复黑名单检测 if self._do_custom_keyword_blacklist(): return # 高危发件人检测 if self._do_high_sender(): return # 主题关键字黑名单检测 if self._do_subject_keyword_blacklist(): return # 内容关键字黑名单检测 if self._do_keyword_blacklist(): return # spam垃圾检测 if self._spamc(): return # 动态SPAM检测 if self._do_active_spam(): return # 高危邮件检测 if self._do_high_risk(): return if self._ctasd_spam(): return return # @Common.fn_timer def _dspamc(self): if setting.dspam_max_size and self.size > setting.dspam_max_size: return False res = dspamc(self.mail_path) #self.mail_obj.dspam_sig = res.get('signature', '') result = res.get('class', '') if result in ['virus', 'spam']: message = res.get('message', '') self.mail_obj.check_result = result self.mail_obj.check_message = message outinfo('[Dspam] {}: {}'.format(self.task, message)) return True return False # 病毒邮件检测 def _do_virus(self): # 进行病毒邮件检测 try: pyclamd.init_unix_socket(clamav_sock) res = pyclamd.scan_file(self.mail_path) except Exception, err: outerror(u'virus check error :{}'.format(self.task)) outerror(traceback.format_exc()) return False # 邮件没有病毒时,直接返回 if res: try: detail = res.values()[0][1] except: detail = 'virus' outinfo(u'[ClamAV] {}: {}'.format(self.task, detail)) self.mail_obj.check_result = 'virus' self.mail_obj.check_message = detail return True return False