示例#1
0
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
示例#2
0
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