示例#1
0
def _do_dspam(ids, result):
    """
    :param ids: 学习的ID列表
    :param result: 结果
    :return:
    """
    keys = {}
    # redis = get_redis_connection()
    for k, v in deal_with_ids(ids).iteritems():
        mail_model = get_mail_model(k)
        servers = mail_model.objects.filter(id__in=v).values_list(
            'server_id', flat=True).distinct()
        for s in servers:
            mails = mail_model.objects.filter(id__in=v, server_id=s)
            keys.setdefault(s, []).extend(
                map(lambda mail: mail.get_mail_filename(), mails))
            # keys.extend(map(lambda mail: mail.get_mail_filename(), mails))

    for k, v in keys.iteritems():
        try:
            redis = get_redis_connection2(k)
        except:
            redis = get_redis_connection2('default')
        map(lambda key: redis.lpush('dspam_collect_{}'.format(result), key),
            set(v))
示例#2
0
def save(d):
    date, id = d['mail_ident'].split(',')[:2]

    while True:
        try:
            with atomic():
                mail = get_mail_model(date).objects.get(id=id)
                if 'bounce_result' in d:
                    mail.bounce_time = d['bounce_time']
                    mail.bounce_result = 'success' if d[
                        'bounce_result'] else 'fail'
                    mail.bounce_message = d['bounce_message']
                if mail.state == 'bounce':
                    mail.state = 'fail_finished' if mail.return_code else 'reject'
                else:
                    log.error(
                        u'save: unexpected state, mail_ident={}, state={}'.
                        format(d['mail_ident'], mail.state))
                mail.save(update_fields=[
                    'bounce_time', 'bounce_result', 'bounce_message', 'state'
                ])
            return
        except (DatabaseError, InterfaceError) as e:
            # 如果报数据库异常,关闭连接,重新处理任务
            log.warning(u'DatabaseError: exception', exc_info=1)
            connection.close()
        except BaseException as e:
            log.warning(u'save: exception', exc_info=1)
        gevent.sleep(10)
示例#3
0
def _resend(ids):
    """
    将邮件推送到队列重新投递
    :param ids:
    :return:
    """
    keys = {}
    # redis = get_redis_connection()
    for k, v in deal_with_ids(ids).iteritems():
        mail_model = get_mail_model(k)
        servers = mail_model.objects.filter(id__in=v).values_list(
            'server_id', flat=True).distinct()
        for s in servers:
            mails = mail_model.objects.filter(
                id__in=v,
                server_id=s,
                state__in=['reject', 'finished', 'fail_finished'])
            keys.setdefault(s, []).extend(
                map(lambda mail: mail.get_mail_filename(), mails))
            mails.update(state='retry')
            # keys.extend(map(lambda mail: mail.get_mail_filename(), mails))
    for k, v in keys.iteritems():
        try:
            redis = get_redis_connection2(k)
        except:
            redis = get_redis_connection2('default')
        map(lambda key: redis.lpush('collect_send', key), set(v))
示例#4
0
def get_state_data(date_str):
    key = '_cache:collect_mail_status:{}'.format(date_str)
    if datetime.date.today().strftime('%Y-%m-%d') != date_str:
        rs = cache.get(key)
        if rs:
            return rs
    rs = {}
    model = get_mail_model(date_str.replace('-', ''))
    try:
        rs['count'] = model.objects.count()
        rs['count1'] = model.objects.filter(mail_id=0).count()
    except:
        return rs
    rs['state'] = dict(
        model.objects.values_list("state").annotate(Count("id")))
    rs['check'] = dict(
        model.objects.values_list("check_result").annotate(Count("id")))
    rs['review'] = dict(
        model.objects.values_list("review_result").annotate(Count("id")))
    rs['send'] = {
        'success':
        model.objects.filter(return_code=250).count(),
        'fail':
        model.objects.filter(Q(state='finished') | Q(state='bounce')).exclude(
            return_code=250).count()
    }
    rs['state']['review'] = model.objects.filter(state='review').exclude(
        check_result='spam').count()
    cache.set(key, rs, 0)
    return rs
示例#5
0
def manager_main():
    """
    跟客户管理员发送报告
    :return:
    """
    try:
        t3 = time.time()
        mail_model = get_mail_model(get_mail_date())
        customer_list = mail_model.objects.exclude(customer__gateway_status='disabled') \
            .filter(state='reject', mail_to__isnull=False, review_result='reject',
                    customer__customersetting__m_spamrpt=True, customer__customersetting__is_spamrpt_sendtime=False) \
            .distinct('customer_id') \
            .values_list('customer_id', flat=True)

        pool = gevent.pool.Pool(_MAXTHREAD)
        for customer_id in customer_list:
            pool.spawn(work_send, customer_id, '', 'manager')

        log.info('waiting stop...')
        pool.join()
        t4 = time.time()
        log.info('m_spam_rpt send total time={}'.format(t4 - t3))
        return
    except (DatabaseError, InterfaceError) as e:
        log.error(u'DatabaseError', exc_info=1)
        connection.close()
    except BaseException as e:
        log.error(u'spam_rpt: exception', exc_info=1)
        gevent.sleep(10)
示例#6
0
def _get_active_receiver_list(data, date):
    mail_model = get_mail_model(date)
    customer_id = data.get('customer_id', '')

    if customer_id:
        mails = mail_model.objects.filter(customer_id=customer_id)
    else:
        mails = mail_model.objects.all()
    mails = mails.values("mail_to").annotate(
        total_all=Count("id"),
        size=Sum("size"),
        total=Sum(
            Case(When(mail_id=0, then=Value(1)),
                 default=Value(0),
                 output_field=IntegerField())),
        total_success=Sum(
            Case(When(state='finished', then=Value(1)),
                 default=Value(0),
                 output_field=IntegerField())),
        size_success=Sum(
            Case(When(state='finished', then='size'),
                 default=Value(0),
                 output_field=IntegerField())),
        total_reject=Sum(
            Case(When(Q(state='reject') | Q(state='c_reject'), then=Value(1)),
                 default=Value(0),
                 output_field=IntegerField())),
        size_reject=Sum(
            Case(When(Q(state='reject') | Q(state='c_reject'), then='size'),
                 default=Value(0),
                 output_field=IntegerField())),
        total_fail=Sum(
            Case(When(Q(state='fail_finished') | Q(state='bounce'),
                      then=Value(1)),
                 default=Value(0),
                 output_field=IntegerField())),
        size_fail=Sum(
            Case(When(Q(state='fail_finished') | Q(state='bounce'),
                      then='size'),
                 default=Value(0),
                 output_field=IntegerField())),
        total_out=Sum(
            Case(When(Q(state='finished') | Q(state='fail_finished')
                      | Q(state='bounce'),
                      then=Value(1)),
                 default=Value(0),
                 output_field=IntegerField())),
        size_out=Sum(
            Case(When(Q(state='finished') | Q(state='fail_finished')
                      | Q(state='bounce'),
                      then='size'),
                 default=Value(0),
                 output_field=IntegerField())),
    )
    try:
        mails.exists()
    except:
        mails = []
    return mails
示例#7
0
    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
示例#8
0
def bounce(j):
    d = json.loads(j)
    date, id = d['mail_ident'].split(',')[:2]

    while True:
        try:
            mail = get_mail_model(date).objects.get(id=id)

            try:
                enable = CustomerSetting.objects.filter(customer=mail.customer,
                                                        c_bounce=True).first()
            except ObjectDoesNotExist:
                enable = False

            if enable:
                bounce_setting = BounceSettings.objects.get()

                sender = bounce_setting.mailbox
                receiver = d['sender']

                html_text = safe_format(bounce_setting.template_cn,
                                        receiver=d['receiver'],
                                        subject=mail.subject,
                                        date=d.get('deliver_time'),
                                        reason=mail.return_message_display())

                # origin_message = mail.get_mail_content()
                try:
                    origin_message = lib.del_attach_from_msg.del_attach_from_msg(
                        d['mail_ident'], f='collect')
                except IOError:
                    origin_message = ''

                message = bounce_message(sender, receiver, html_text,
                                         origin_message)

            break
        except BaseException as e:
            log.warning(u'bounce: exception', exc_info=1)
            gevent.sleep(60)

    if enable:
        code, msg = send(bounce_setting.server, bounce_setting.port, sender,
                         bounce_setting.password, receiver, message)
        msg = decode_msg(msg)
        d['bounce_time'] = datetime.datetime.now()
        d['bounce_result'] = code == 250
        d['bounce_message'] = msg
        log.info(
            u'bounce: bounced message, mail_ident={}, code={}, msg={}, reason={}'
            .format(d['mail_ident'], code, msg, mail.return_message_display()))
    else:
        log.info(u'bounce: skip bounced message, mail_ident={}'.format(
            d['mail_ident']))

    (redis.pipeline().lpush('collect_bounced',
                            json.dumps(d, cls=lib.common.ComplexEncoder)).lrem(
                                'collect_bounce_waiting', 0, j).execute())
示例#9
0
def state_logs(request, id):
    date, mail_id = id.split('_')
    logs = MailStateLog.objects.filter(date=date, mail_id=mail_id)
    m = get_mail_model(date).objects.get(id=mail_id)
    return render_to_response("collect_mail/state_logs.html", {
        'logs': logs,
        'm': m,
    },
                              context_instance=RequestContext(request))
示例#10
0
def get_mails_from_sendtime(customer_id,
                            sendtime,
                            mail_to=None,
                            check_result=None):
    """
    获取sendtime往前24个小时内的邮件数据
    :param customer_id:
    :param sendtime:
    :param mail_to:
    :param check_result:
    :return:
    """
    mail_model = get_mail_model(get_mail_date())
    mail_model_today = get_mail_model(time.strftime('%Y%m%d'))
    start_time = datetime.combine((datetime.today() + timedelta(-1)), sendtime)
    end_time = datetime.combine(datetime.today(), sendtime)
    first_mails = mail_model.objects.filter(customer_id=customer_id,
                                            state='reject',
                                            mail_to__isnull=False,
                                            review_result='reject',
                                            created__gte=start_time)
    last_mails = mail_model_today.objects.filter(customer_id=customer_id,
                                                 state='reject',
                                                 mail_to__isnull=False,
                                                 review_result='reject',
                                                 created__lt=end_time)
    if check_result == 'virus':
        first_mails = first_mails.filter(check_result='virus')
        last_mails = last_mails.filter(check_result='virus')
    elif check_result == 'not_virus':
        first_mails = first_mails.exclude(check_result='virus')
        last_mails = last_mails.exclude(check_result='virus')

    if mail_to:
        first_mails = first_mails.filter(mail_to=mail_to)
        last_mails = last_mails.filter(mail_to=mail_to)
    else:
        first_mails = first_mails.order_by('mail_to')
        last_mails = last_mails.order_by('mail_to')
    mails = list(first_mails)
    mails.extend(list(last_mails))
    return mails
示例#11
0
def mail_review_undo(request):
    ids = request.GET.get('id', '')
    date, id = ids.split('_')
    mail_obj = get_mail_model(date).objects.get(id=id)
    # if not mail_obj.get_mail_content():
    #     msg = u'操作失败:邮件内容不存在'
    # else:
    undo_review_result = 'pass' if mail_obj.review_result == 'reject' else 'reject'
    _do_review([ids], undo_review_result, request, flag=False)
    msg = u'误判操作成功:{}'.format(undo_review_result)
    return HttpResponse(json.dumps({'msg': msg}),
                        content_type="application/json")
示例#12
0
def resent(request):
    ids = request.GET.get('id', '')
    date, id = ids.split('_')
    msg = u'发送失败,只有发送完成/失败的邮件可以再次发送'
    m = get_mail_model(date).objects.get(id=id)
    if m.state in ['finished', 'fail_finished']:
        redis = get_redis_connection2(m.server_id)
        redis.lpush('collect_send', m.get_mail_filename())
        m.state = 'retry'
        m.save()
        msg = u'已再次发送邮件'
    return HttpResponse(json.dumps({'msg': msg}),
                        content_type="application/json")
def get_mails_from_interval(customer_id,
                            interval,
                            mail_to=None,
                            check_result=None):
    """
    获取当前时间往前interval个小时内的邮件数据
    :param customer_id:
    :param interval: 间隔时间
    :param mail_to:
    :param check_result:
    :return:
    """
    end_time = datetime.now().strftime("%Y%m%d%H")
    end_time = datetime.strptime('{}0000'.format(end_time), "%Y%m%d%H%M%S")
    start_time = end_time - timedelta(hours=interval)
    mail_model_start = get_mail_model(start_time.strftime('%Y%m%d'))
    mail_model_end = get_mail_model(end_time.strftime('%Y%m%d'))
    if start_time.day == end_time.day:
        mails = mail_model_start.objects.filter(customer_id=customer_id,
                                                state='reject',
                                                mail_to__isnull=False,
                                                review_result='reject',
                                                created__gte=start_time,
                                                created__lt=end_time)
        mails = _get_mails(mails, check_result, mail_to)
    else:
        first_mails = mail_model_start.objects.filter(customer_id=customer_id,
                                                      state='reject',
                                                      mail_to__isnull=False,
                                                      review_result='reject',
                                                      created__gte=start_time)
        last_mails = mail_model_end.objects.filter(customer_id=customer_id,
                                                   state='reject',
                                                   mail_to__isnull=False,
                                                   review_result='reject',
                                                   created__lt=end_time)
        mails = _get_mails(first_mails, check_result, mail_to)
        mails.extend(_get_mails(last_mails, check_result, mail_to))
    return mails
示例#14
0
def get_send_info(obj, type):
    date = datetime.date.today()
    msg = u"""
    <span>总:<a href='/collect_mail/mail_list?{type}={value}'>{total}</a>
    拒:<a href='/collect_mail/mail_list?{type}={value}&review=reject'>{total_reject}</a>
    <span>发:<a href='/collect_mail/mail_list?show=sendlog&{type}={value}'>{count}</a>
    成:<a href='/collect_mail/mail_list?show=sendlog&send=success&{type}={value}'>{success}</a>
    成功率:<code>{rate}</code>%
    </span></br>
    <a href='/collect_mail/statistics?{type}={value}&type={type}'><code>查看历史详情</code></a>
    """

    class DefaultS:
        count = 0
        success = 0
        rate = 0
        total = 0
        total_reject = 0

    s = DefaultS()
    objs = []
    model = get_mail_model(date.strftime('%Y%m%d'))
    if type == 'customer':
        objs = Statistics.objects.filter(date=date, customer=obj)

    if objs:
        s = objs[0]

    if type == 'customer':
        try:
            s.total = model.objects.filter(customer=obj).count()
        except:
            s.total = 0
        try:
            s.total_reject = model.objects.filter(
                customer=obj, review_result='reject').count()
        except:
            s.total_reject = 0
    rs = {
        'total': s.total,
        'total_reject': s.total_reject,
        'type': type,
        'value': obj.id if type != 'ip' else obj.ip,
        'count': s.count,
        'success': s.success,
        'rate': '%.2f' % s.rate,
    }
    return msg.format(**rs)
示例#15
0
def send_mail_file(request):
    if not validate_key(request):
        raise Http404
    date_id = request.GET.get('id', '')
    date, id = date_id.split('_')
    if id and date:
        mail_obj = get_mail_model(date).objects.get(id=id)
        filename = mail_obj.get_mail_path()
        if not os.path.exists(filename):
            filename = mail_obj.get_mail_path_old()
        if os.path.exists(filename):
            wrapper = FileWrapper(file(filename))
            response = HttpResponse(wrapper, content_type='text/plain')
            response['Content-Length'] = os.path.getsize(filename)
            return response
    return HttpResponse('')
示例#16
0
def mail_recheck(request):
    date = request.GET.get('date', '')
    if date:
        mails = get_mail_model(date).objects.filter(check_result='error',
                                                    state='review',
                                                    mail_id=0)
        # mails = get_mail_model(date).objects.filter(state='check', mail_id=0)
        for mail in mails:
            mail.state = 'check'
            mail.save()
            redis = get_redis_connection2(mail.server_id)
            try:
                redis.lpush('collect_incheck', mail.get_mail_filename())
            except:
                pass
    messages.add_message(request, messages.SUCCESS, u'出错邮件已重新加入检测')
    return HttpResponseRedirect(reverse('collect_mail_summary'))
示例#17
0
def save(d):
    date, id = d['mail_ident'].split(',')[:2]

    while True:
        try:
            with atomic():
                mail = get_mail_model(date).objects.get(id=id)
                if mail.state in ('send', 'retry'):
                    mail.state = d['state']
                else:
                    log.error(u'save: unexpected state, mail_ident={}, state={}'
                              .format(d['mail_ident'], mail.state))
                if len(d['result']) == 0:
                    mail.save(update_fields=['state'])
                else:
                    r = d['result'][-1]
                    mail.deliver_ip = r['deliver_ip']
                    mail.deliver_time = r['deliver_time']
                    mail.return_code = r['return_code']
                    mail.return_message = r['return_message']
                    mail.error_type = r['error_type']
                    mail.save(update_fields=['state', 'deliver_ip', 'deliver_time', 'return_code', 'return_message',
                                             'error_type'])
                    for r in d['result']:
                        dl = DeliverLog(
                            date=date,
                            mail_id=id,
                            deliver_ip=r['deliver_ip'],
                            deliver_time=r['deliver_time'],
                            receive_ip=r['receive_ip'],
                            return_code=r['return_code'],
                            return_message=r['return_message'],
                        )
                        dl.save()
            return
        except (DatabaseError, InterfaceError) as e:
            # 如果报数据库异常,关闭连接,重新处理任务
            log.warning(u'DatabaseError', exc_info=1)
            connection.close()
        except BaseException as e:
            log.warning(u'save: exception', exc_info=1)
        gevent.sleep(10)
示例#18
0
def op_keywordlist(request):
    operate = request.GET.get('operate', 'modify')
    msg = u'错误: 没有该关键字信息'
    try:
        # date = request.GET.get('date')
        date, id = request.GET.get('id').split('_')
        mail_obj = get_mail_model(date.replace('-', '')).objects.get(pk=id)
        keyword = mail_obj.check_message.split('----', 1)[0]
        if mail_obj.check_result == 'subject_blacklist' or 'subject_blacklist' in mail_obj.check_message:
            obj = RSubjectKeywordBlacklist.objects.get(keyword=keyword)
            url = reverse('subject_keyword_blacklist_modify', args=(obj.id, ))
        elif mail_obj.check_result == 'keyword_blacklist' or 'keyword_blacklist' in mail_obj.check_message:
            obj = RKeywordBlacklist.objects.get(keyword=keyword)
            url = reverse('keyword_blacklist_modify', args=(obj.id, ))
        elif mail_obj.check_result == 'sender_blacklist' or 'sender_blacklist' in mail_obj.check_message:
            obj = RSenderBlacklist.objects.get(keyword=keyword)
            url = reverse('sender_blacklist_modify', args=(obj.id, ))
        elif mail_obj.check_result == 'sender_whitelist':
            keyword = re.findall('\((.*?)\)',
                                 mail_obj.check_message)[0].split('----', 1)[0]
            obj = SenderWhitelist.objects.get(sender=keyword)
            url = reverse('sender_whitelist_modify', args=(obj.id, ))
        elif mail_obj.check_result in [
                'attach_blacklist', 'high_risk'
        ] or 'attach_blacklist' in mail_obj.check_message:
            obj = AttachmentBlacklist.objects.get(keyword=keyword)
            url = reverse('attachment_blacklist_modify', args=(obj.id, ))

        if operate == 'modify':
            return HttpResponseRedirect(url)
        elif operate == 'delete':
            obj.delete()
            msg = u'删除成功'
            return HttpResponse(json.dumps({'msg': msg}),
                                content_type="application/json")
    except Exception, e:
        if operate == 'modify':
            return HttpResponse(msg)
        elif operate == 'delete':
            return HttpResponse(json.dumps({'msg': msg}),
                                content_type="application/json")
示例#19
0
def load_mail(mail_ident):
    date, id = mail_ident.split(',')[:2]

    while True:
        try:
            mail = get_mail_model(date).objects.get(id=id)
            d = {
                'customer_id': mail.customer_id,
                'domain': address_domain(mail.mail_to),
                'mail_ident': mail_ident,
                'sender': mail.mail_from,
                'receiver': mail.mail_to,
                'result': []
            }
            return d, mail
        except (DatabaseError, InterfaceError) as e:
            # 如果报数据库异常,关闭连接,重新处理任务
            log.warning(u'DatabaseError', exc_info=1)
            connection.close()
        except BaseException as e:
            log.warning(u'load_mail: exception', exc_info=1)
        gevent.sleep(10)
示例#20
0
def get_search_data(data, date=''):
    if not date:
        date = data.get('date', '')
    customers = data.get('customers', '')
    mail_from = data.get('mail_from', '')
    mail_to = data.get('mail_to', '')
    subject = data.get('subject', '')
    state = data.get('state', '')
    error_type = data.get('error_type', '')
    dspam_study = data.get('dspam_study', '')
    check = data.get('check', '')
    check_message = data.get('check_message', '')
    not_check = data.get('not_check', '')
    review = data.get('review', '')
    send = data.get('send', '')
    mail_id = data.get('mail_id', '')
    customer = data.get('customer', '')
    customer_report = data.get('customer_report', '')
    search = data.get('search[value]', '')
    order_column = data.get('order[0][column]', '')
    order_dir = data.get('order[0][dir]', '')
    show = data.get('show', '')
    reviewer_id = data.get('reviewer_id', '')
    client_ip = data.get('client_ip', '')
    server_id = data.get('server_id', '')
    filter_word = data.get('filter_word', '')
    reviewer = data.get('reviewer', '')
    all_check = data.get('all_check', '')
    check_list = data.getlist('check', [])
    time_start = data.get('time_start', '')
    time_end = data.get('time_end', '')
    check_list = data.getlist('check', '')

    if not date:
        date = time.strftime('%Y-%m-%d')

    return_code = data.get('return_code', '')

    if not date:
        date = time.strftime('%Y%m%d')
    else:
        date = date.replace('-', '')
    mail_model = get_mail_model(date)

    mails = mail_model.objects.all()
    if customers:
        mails = mails.filter(
            Q(customer__company__icontains=customers)
            | Q(customer__username__icontains=customers))
    if mail_from:
        mails = mails.filter(mail_from__icontains=mail_from)
    if mail_to:
        mails = mails.filter(mail_to__icontains=mail_to)
    if customer:
        mails = mails.filter(customer_id=customer)
    if error_type:
        mails = mails.filter(error_type=error_type)
    if dspam_study:
        mails = mails.filter(dspam_study=dspam_study)

    if isinstance(check_list, list) and len(check_list) > 1:
        mails = mails.filter(check_result__in=check_list)
    elif check:
        if check == 'subject_and_keyword':
            mails = mails.filter(check_result__in=[
                'keyword_blacklist', 'subject_blacklist', 'sender_blacklist'
            ])
        else:
            mails = mails.filter(check_result=check)
    if not_check:
        mails = mails.exclude(check_result=not_check)
    if review:
        mails = mails.filter(review_result=review)
    if show == 'sendlog':
        mails = mails.exclude(return_code=None)
    elif show == 'reject':
        mails = mails.filter(state='reject').exclude(check_result__in=[
            'auto_reject', 'k_auto_reject', 'auto_reject_attach',
            'error_format'
        ])
    elif show == 'review':
        state = 'review'

    if state:
        mails = mails.filter(state=state)

    if check_message:
        mails = mails.filter(check_message__icontains=check_message)

    if send == 'success':
        return_code = '250'
    elif send == 'fail':
        return_code = '0'

    if mail_id:
        if mail_id == '0':
            # all_check 搜索出mail_id=0被"收件人白名单"通过, 但其他收件人需要审核的邮件
            if len(all_check) > 1:
                _mail_ids = mails.exclude(mail_id=0).values_list(
                    'mail_id', flat=True).distinct()
                mail_ids = mail_model.objects.filter(id__in=_mail_ids).exclude(
                    state='review').values_list('id', flat=True)
                mails = mails.filter(Q(mail_id=0) | Q(mail_id__in=mail_ids))
            else:
                mails = mails.filter(mail_id=0)
        else:
            mails = mails.filter(Q(mail_id=mail_id) | Q(id=mail_id))
    if subject:
        mails = mails.filter(subject__icontains=subject)

    if client_ip:
        mails = mails.filter(client_ip=client_ip)

    if server_id:
        mails = mails.filter(server_id=server_id)

    if reviewer_id:
        mails = mails.filter(reviewer_id=reviewer_id)

    if search:
        mails = mails.filter(
            Q(mail_from__icontains=search) | Q(mail_to__icontains=search)
            | Q(subject__icontains=search))

    if return_code:
        if return_code == '0':
            mails = mails.exclude(return_code=250)
        else:
            mails = mails.filter(return_code=return_code)
    if customer_report:
        mails = mails.filter(customer_report=customer_report)

    if filter_word:
        mails = mails.filter(check_message__icontains=filter_word)

    if reviewer:
        mails = mails.filter(reviewer__username=reviewer)

    if time_start:
        time_start = datetime.datetime.strptime(
            '{} {}:00'.format(date, time_start), '%Y%m%d %H:%M:%S')
        mails = mails.filter(created__gte=time_start)
    if time_end:
        time_end = datetime.datetime.strptime(
            '{} {}:00'.format(date, time_end), '%Y%m%d %H:%M:%S')
        mails = mails.filter(created__lte=time_end)

    try:
        mails.exists()
    except:
        mails = []

    if show == 'review':
        colums = [
            'id', 'customer', 'mail_from', 'subject', 'size', 'created',
            'check_message', 'check_result'
        ]
    elif show == 'sendlog':
        colums = [
            'id', 'customer', 'mail_from', 'subject', 'size', 'mail_id',
            'created', 'mail_to', 'return_code', 'deliver_time',
            'return_message'
        ]
    elif show == 'reject':
        colums = [
            'id', 'sender_name', 'subject', 'attach_name', 'attach_name',
            'check_result'
        ]
    else:
        colums = [
            'id', 'customer', 'mail_from', 'subject', 'size', 'mail_id',
            'created', 'mail_to', 'state', 'check_result', 'review_result',
            'return_code', 'deliver_time', 'return_message'
        ]

    if isinstance(mails, query.QuerySet
                  ) and order_column and int(order_column) < len(colums):
        if order_dir == 'desc':
            mails = mails.order_by('-%s' % colums[int(order_column)])
        else:
            mails = mails.order_by('%s' % colums[int(order_column)])

    return mails
示例#21
0
def get_cmail_count(mail_obj, date):
    model = get_mail_model(date.replace('-', ''))
    mail_id = mail_obj.mail_id if mail_obj.mail_id else mail_obj.id
    return model.objects.filter(mail_id=mail_id).count() + 1
def get_mail_message(customer_id,
                     mail_to,
                     sender_from,
                     type='customer',
                     interval=0):
    mail_model = get_mail_model(get_mail_date())
    if type == 'customer':
        if interval:
            virus_mails = get_mails_from_interval(customer_id,
                                                  interval,
                                                  mail_to=mail_to,
                                                  check_result='virus')
            other_mails = get_mails_from_interval(customer_id,
                                                  interval,
                                                  mail_to=mail_to,
                                                  check_result='not_virus')
        else:
            virus_mails = mail_model.objects.filter(customer__id=customer_id,
                                                    mail_to=mail_to,
                                                    state='reject',
                                                    check_result='virus',
                                                    review_result='reject')
            other_mails = mail_model.objects.filter(
                customer__id=customer_id,
                mail_to=mail_to,
                state='reject',
                review_result='reject').exclude(check_result='virus')
        t = template.Template(html_template)
        mail_subject = u'[垃圾邮件隔离报告] {} — {}'.format(
            mail_to,
            datetime.today().strftime('%Y-%m-%d'))
    else:
        if interval:
            virus_mails = get_mails_from_interval(customer_id,
                                                  interval,
                                                  mail_to='',
                                                  check_result='virus')
            other_mails = get_mails_from_interval(customer_id,
                                                  interval,
                                                  mail_to='',
                                                  check_result='not_virus')
        else:
            virus_mails = mail_model.objects.filter(
                customer__id=customer_id,
                state='reject',
                check_result='virus',
                review_result='reject').order_by('mail_to')
            other_mails = mail_model.objects.filter(
                customer__id=customer_id,
                state='reject',
                review_result='reject').exclude(
                    check_result='virus').order_by('mail_to')
        t = template.Template(m_html_template)
        mail_subject = u'[垃圾邮件隔离报告] {}'.format(
            datetime.today().strftime('%Y-%m-%d'))
    if not virus_mails and not other_mails:
        return None

    context = {
        'virus_mails': virus_mails,
        'other_mails': other_mails,
    }

    html_content = t.render(Context(context))

    mail_message = MIMEText(html_content, _subtype='html', _charset='utf-8')
    mail_message['Subject'] = Header(mail_subject, 'utf-8')
    mail_message['From'] = Header(sender_from, 'utf-8')
    mail_message['To'] = Header(mail_to, 'utf-8')
    return mail_message
示例#23
0
def mail_read(request):
    date_id = request.GET.get('id', '')
    date, id = date_id.split('_')
    cid = request.GET.get('cid', '')
    aid = request.GET.get('aid', '')
    download = request.GET.get('download', '')
    view_body = request.GET.get('view_body', '')
    view_source = request.GET.get('view_source', '')
    export = request.GET.get('export', '')

    if id and date:
        mail_obj = get_mail_model(date).objects.get(id=id)
        content = mail_obj.get_mail_content()
        parse_obj = ParseEmail(content)
        m = parse_obj.parseMailTemplate()

        if cid or aid:
            attachments = m['attachments']
            if aid:
                attach = attachments[int(aid)]
                response = HttpResponse(attach.get('data', ''),
                                        content_type=attach.get(
                                            'content_type', '').split(';')[0])
            else:
                for one in attachments:
                    if one.get('content_id') == cid:
                        attach = one
                        response = HttpResponse(attach.get('data', ''),
                                                content_type=attach.get(
                                                    'content_type',
                                                    '').split(';')[0])
                        break
            if download:
                response[
                    'Content-Disposition'] = 'attachment; filename="{}"'.format(
                        attach.get('decode_name',
                                   '').replace('\n', ' ').encode('utf-8'))
            return response

        if view_body:
            text = m.get('html_text', '')
            charset = m.get('html_charset', '')
            if not text:
                text = m.get('plain_text', '')
                charset = m.get('plain_charset', '')
            link = '{}?id={}&cid=\g<cid>'.format(reverse('collect_mail_read'),
                                                 date_id)
            text = re.sub('"cid:(?P<cid>.*?)"', link, text)

            if mail_obj.check_result in [
                    'keyword_blacklist', 'custom_blacklist'
            ] and text and charset:
                s = mail_obj.check_message.split('----', 1)[-1]
                re_s = u'<span style="background-color: yellow"><b style="color:#A94442;">{}</b></span>'.format(
                    s).encode(charset)
                s = s.encode(charset)
                text = text.replace(s, re_s)
            return HttpResponse(text, charset=charset)
        if view_source:
            return render_to_response(
                "collect_mail/txt.html", {
                    'content': content.decode('gbk', 'ignore'),
                },
                context_instance=RequestContext(request))

        if export:
            response = HttpResponse(content, content_type='text/html')
            response['Content-Disposition'] = 'attachment; filename="eml.eml"'
            return response

        subject = mail_obj.subject
        if mail_obj.check_result in ['subject_blacklist', 'custom_blacklist']:
            s = mail_obj.check_message.split('----', 1)[-1]
            subject = high_light(subject, s)
        hl_mail_from = mail_obj.mail_from
        if mail_obj.check_result == 'sender_blacklist':
            s = mail_obj.check_message.split('----', 1)[-1]
            hl_mail_from = high_light(mail_obj.mail_from, s)
            m['from'] = high_light(m['from'], s)

        return render_to_response("collect_mail/mail_read.html", {
            'm': m,
            'id': id,
            'date': date,
            'mail_obj': mail_obj,
            'subject': subject,
            'hl_mail_from': hl_mail_from,
        },
                                  context_instance=RequestContext(request))
    return HttpResponse(u'no email')
示例#24
0
    def run(self):
        if not os.path.exists(self.mail_path):
            return

        date = time.strftime('%Y%m%d')
        #创建django的mail模型
        mail_model = get_mail_model(date)
        if date not in _dates:
            install_model(mail_model)
            #创建的目录 用户组也有权限修改
            common.make_dir([os.path.join(data_path, 'c_{}'.format(date))],
                            permit=0775)
            _dates.append(date)

        uid, mail_id, client_ip = self.task.split(',')[:3]

        with open(self.mail_path) as f:
            email_str = f.read()

        with open(self.rcpt_path) as f:
            rcpt_list = f.readlines()

        with open(self.from_path) as f:
            mail_from = f.read()

        rcpt_list = [rcpt for rcpt in rcpt_list if can_decode(rcpt)]

        # subject = get_mail_subject(mail_data=email_str)
        p = ParseEmail(email_str)
        subject = p.get_attr('subject')

        try:
            sender_name = re.search('(.*?)\(.*?\)',
                                    p.get_attr('from')).group(1)
        except:
            outerror('get sender_name error: {}'.format(self.task))
            outerror(traceback.format_exc())
            sender_name = ''

        data = p.parseMailTemplate()

        attaches = data.get('attachments', [])
        try:
            attach_name = u'----'.join(
                [a.get('decode_name', '') for a in attaches])
        except:
            outerror('get attach_name error: {}'.format(self.task))
            outerror(traceback.format_exc())
            attach_name = ''

        #被推送到检测队列中的邮件
        #当有多个收件人时, 只推送mail_id=0的一个对象到检测队列
        check_mail = None
        outinfo(self.task)
        outinfo('rcpt_list:{}'.format(rcpt_list))
        #mail id列表
        mail_ids = []

        for rcpt in rcpt_list:
            if rcpt == '': continue
            # remove \n
            rcpt = rcpt.replace('\n', '')
            # 去掉字符串中的引号
            rcpt = rcpt.replace('"', '').replace("'", "")

            rcpt = addr_get(rcpt)

            try:
                mail_obj = mail_model(customer_id=uid,
                                      mail_from=mail_from.lower(),
                                      mail_to=rcpt.lower(),
                                      client_ip=client_ip,
                                      subject=subject,
                                      size=len(email_str),
                                      sender_name=sender_name,
                                      server_id=server_id,
                                      attach_name=attach_name)
                mail_obj.save()
            except (DatabaseError, InterfaceError), e:
                outerror(traceback.format_exc())
                continue

            with open(mail_obj.get_mail_path(), 'w') as f:
                f.write(email_str)

            filename = mail_obj.get_mail_filename()

            if not check_email_format(rcpt,
                                      is_check_suffix=False) or is_same_domain(
                                          rcpt, mail_from):
                outinfo('{}: error format'.format(filename))
                self._do_invalid_mail(mail_obj, 'error_format')
            else:
                outinfo('{}: pass'.format(filename))
                if not check_mail:
                    check_mail = mail_obj

            mail_ids.append(mail_obj.id)
示例#25
0
def mail_modify_spam(request):
    date_id = request.GET.get('id', False)
    mail_date, mail_id = date_id.split('_')
    action = request.GET.get('action', False)
    auth_key = request.GET.get('auth_key', False)
    decoded = base64.b64decode(auth_key)
    private_tr, action2, mail_date2, mail_id2 = decoded.split('_')
    if mail_id and mail_date and action:
        if action == action2 and mail_date == mail_date2 and mail_id == mail_id2:
            try:
                mail_obj = get_mail_model(mail_date).objects.get(id=mail_id)
            except Exception as e:
                return HttpResponse(u'页面不存在 (404)')

            if action == 'delete':
                file_path = mail_obj.get_mail_path()
                if mail_obj.review_result == 'reject':
                    if os.path.exists(file_path):
                        mail_obj.clear_mail()
                        return HttpResponse(u'删除邮件成功')
                    else:
                        return HttpResponse(u'删除邮件成功')
                else:
                    return HttpResponse(u'邮件正在处理中,不能进行删除操作')

                # mail_obj.clear_mail()
                # return HttpResponse(u'删除邮件成功')

            if action == 'whitelist':
                add_sender_whitelist(date_id, is_global=False, is_domain=False)
                if mail_obj.review_result == 'reject':
                    undo_review_result = 'pass'
                    _do_review([date_id],
                               undo_review_result,
                               request,
                               flag=False)
                    return HttpResponse(u'添加白名单成功')
                else:
                    return HttpResponse(u'添加白名单成功')

                # undo_review_result = 'pass' if mail_obj.review_result == 'reject' else 'reject'
                # _do_review([date_id], undo_review_result, request, flag=False)
                # return HttpResponse(u'添加白名单成功')

            if action == 'deliver':
                if mail_obj.review_result == 'reject':
                    undo_review_result = 'pass'
                    _do_review([date_id],
                               undo_review_result,
                               request,
                               flag=False)
                    return HttpResponse(u'邮件放行成功')
                else:
                    return HttpResponse(u'邮件放行成功')

                # undo_review_result = 'pass' if mail_obj.review_result == 'reject' else 'reject'
                # _do_review([date_id], undo_review_result, request, flag=False)
                # return HttpResponse(u'邮件放行成功')

        else:
            return HttpResponse(u'页面不存在 (404)')
    else:
        return HttpResponse(u'页面不存在 (404)')
示例#26
0
def _do_review(ids, result, request, flag=True):
    """
    :param ids: 审核的ID列表
    :param result: 审核结果
    :param flag: 是否正常流程操作, 默认:True, 如果是误判操作,则为False
    :return:
    """
    keys = {}
    # redis = get_redis_connection()
    reviewer = request.user
    review_time = datetime.datetime.now()
    msg = u'通过' if result == 'pass' else u'拒绝'
    for k, v in deal_with_ids(ids).iteritems():
        if flag:
            mails = get_mail_model(k).objects.filter(
                state='review').filter(Q(id__in=v) | Q(mail_id__in=v))
        else:
            mails = get_mail_model(k).objects.filter(id__in=v)

        servers = mails.values_list('server_id', flat=True).distinct()
        for s in servers:
            keys.setdefault(s, []).extend(
                map(lambda mail: mail.get_mail_filename(),
                    mails.filter(server_id=s)))
        # keys.extend(map(lambda mail: mail.get_mail_filename(), mails))
        review_result = result if flag else '{}_undo'.format(result)
        if result == 'pass':
            if flag:
                mails.update(review_result=review_result,
                             state='send',
                             reviewer=reviewer,
                             review_time=review_time)
            else:
                mails.update(review_result=review_result, state='send')
        elif result == 'reject':
            if flag:
                mails.update(review_result=review_result,
                             state='reject',
                             reviewer=reviewer,
                             review_time=review_time)
            else:
                mails.update(review_result=review_result, state='reject')

    count = 0
    for k, v in keys.iteritems():
        count += len(v)
        try:
            redis = get_redis_connection2(k)
        except:
            redis = get_redis_connection2('default')
        for m in set(v):
            if result == 'pass':
                redis.lpush('collect_send', m)
                reason = 'review_pass'
            else:
                reason = 'review_reject'
            redis.lpush('dspam_collect_{}'.format(result), m)
            redis.lpush('csender_credit',
                        '{}----{}'.format('_'.join(m.split(',')), reason))
        """
        if result == 'pass':
            map(lambda key: redis.lpush('collect_send', key), set(v))
        map(lambda key: redis.lpush('dspam_collect_{}'.format(result), key), set(v))
        """

    return msg, count