示例#1
0
def export_address(request, list_id):
    data = request.GET
    cr = connections['mm-pool'].cursor()
    tablename = 'ml_subscriber_' + str(request.user.id)
    file_name = data.get('file_name', '').strip()
    var_lists = get_addr_var_fields(cr, request.user.id)
    forloops = [i + 1 for i in xrange(len(var_lists))]
    if request.user.lang_code == 'en-us':
        alist = [
            [u'email', u'name', u'gender', u'birthday', u'phone', u'area'] +
            var_lists
        ]
    else:
        alist = [[u'邮件地址', u'姓名', u'性别', u'生日', u'手机', u'地区'] +
                 [u'变量{}'.format(i) for i in forloops]]
    sql = u"""
    SELECT address, fullname, sex, birthday, phone, area, {2}
    FROM {0} WHERE list_id={1};
    """.format(tablename, list_id, ','.join(var_lists))
    cr.execute(sql)
    for row in cr.fetchall():
        address, fullname, sex, birthday, phone, area = row[:6]
        aaData = list(row[6:])
        if sex == 'M':
            sex = u'男'
        elif sex == 'F':
            sex = u'女'
        else:
            sex = ''
        alist.append([address, fullname, sex, birthday, phone, area] + aaData)
    return ExcelResponse(alist, file_name, encoding='gbk')
示例#2
0
def ml_subscribe_list(request, list_id):
    obj = model_addresses.get_address_obj(request, list_id)
    user_id = obj.customer_id
    if request.user.id == user_id:
        is_modify_flag = obj.is_allow_export
    else:
        is_modify_flag = False
    # obj = get_object(MailList, request.user, list_id)
    # is_modify_flag = obj.is_allow_export
    subject = model_addresses.get_subject(request, list_id, obj)
    is_subscribe = request.GET.get('is_subscribe', '')
    cr = connections['mm-pool'].cursor()
    address_sqls.checkTable(cr, user_id)
    if request.method == "POST":
        obj2 = get_object(MailList, request.user, list_id)
        tablename = 'ml_subscriber_' + str(request.user.id)
        id = request.POST.get('id', False)
        ids = request.POST.get('ids', '')
        status = int(request.POST.get('status', False))
        redis = get_redis_connection()
        if int(status) == -2:  # 单个删除
            sql = "DELETE FROM {0} WHERE address_id={1}".format(tablename, id)
            cr.execute(sql)
            messages.add_message(request, messages.SUCCESS, _(u'成功删除'))
            redis.rpush(EDM_WEB_USER_MAIL_IMPORT_COUNT_QUEUE,
                        '{}_{}'.format(request.user.id, list_id))
            return HttpResponseRedirect(
                "/address/subscribe/{}/".format(list_id))
        if int(status) == -1:  # 批量删除
            sql = "DELETE FROM {0} WHERE address_id IN ({1})".format(
                tablename, ids)
            cr.execute(sql)
            messages.add_message(request, messages.SUCCESS, _(u'成功删除'))
            redis.rpush(EDM_WEB_USER_MAIL_IMPORT_COUNT_QUEUE,
                        '{}_{}'.format(request.user.id, list_id))
            return HttpResponseRedirect(
                "/address/subscribe/{}/".format(list_id))

    var_lists = get_addr_var_fields(cr, request.user.id)
    field_lists = []
    for i in xrange(len(var_lists) - 10):
        field_lists.append(u'变量{}'.format(11 + i))
    return render(request,
                  'address/ml_subscribe_list.html',
                  context={
                      'subject': subject,
                      'list_id': list_id,
                      'is_subscribe': is_subscribe,
                      'field_lists': field_lists,
                      'is_modify_flag': is_modify_flag,
                  })
示例#3
0
def export_template_format(request):
    data = request.GET
    file_ext = data.get('file_ext', '').strip()
    cr = connections['mm-pool'].cursor()
    var_lists = get_addr_var_fields(cr, request.user.id)
    forloops = [i + 1 for i in xrange(len(var_lists))]
    if request.user.lang_code == 'en-us':
        list = [
            [u'Address', u'Name', u'Gender', u'birthday', u'phone', u'area'] +
            var_lists
        ]
    else:
        list = [[u'邮件地址', u'姓名', u'性别', u'生日', u'手机', u'地区'] +
                [u'变量{}'.format(i) for i in forloops]]
    if file_ext == 'csv':
        force_csv = True
        mimetype = 'text/csv'
        response = FormatExcelResponse(data=list,
                                       output_name='address',
                                       force_csv=force_csv,
                                       encoding='gbk',
                                       mimetype=mimetype,
                                       file_ext=file_ext)
    elif file_ext == 'txt':
        force_csv = False
        mimetype = 'text/plain'
        response = FormatExcelResponse(data=list,
                                       output_name='address',
                                       force_csv=force_csv,
                                       encoding='gbk',
                                       mimetype=mimetype,
                                       file_ext=file_ext)
    elif file_ext == 'xls':
        force_csv = False
        mimetype = 'application/vnd.ms-excel'
        response = FormatExcelResponse(data=list,
                                       output_name='address',
                                       force_csv=force_csv,
                                       encoding='gbk',
                                       mimetype=mimetype,
                                       file_ext=file_ext)
    elif file_ext == 'xlsx':
        force_csv = False
        mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        response = FormatExcelResponse(data=list,
                                       output_name='address',
                                       force_csv=force_csv,
                                       encoding='gbk',
                                       mimetype=mimetype,
                                       file_ext=file_ext)
    return response
示例#4
0
def ml_subscribe_modify(request, list_id, address_id):
    cr = connections['mm-pool'].cursor()
    tablename = 'ml_subscriber_' + str(request.user.id)
    var_lists = get_addr_var_fields(cr, request.user.id)
    if request.method == "POST":
        data = request.POST
        address = data.get('address', '').strip()
        fullname = data.get('fullname', '').strip()
        if not fullname:
            fullname = '@'.join(address.split("@")[:-1])
        phone = data.get('phone', '')
        area = data.get('area', '')
        sex = data.get('sex', '')
        birthday = data.get('birthday', '')
        vars_x = []
        for var_i in var_lists:
            var_x = data.get(var_i, '')
            vars_x.append(var_x)

        sql_parts, sql_args = get_fields_args(var_lists, vars_x)
        sql = "UPDATE `mm-pool`.`ml_subscriber_%s` SET fullname=%s, sex=%s, birthday=%s, phone=%s, area=%s, created=%s{} WHERE list_id=%s AND address=%s".format(
            sql_parts)
        args = [
            request.user.id, fullname, sex, birthday, phone, area,
            time.strftime("%Y-%m-%d %H:%M:%S")
        ] + sql_args + [list_id, address]
        cr.execute(sql, args)
        messages.add_message(request, messages.SUCCESS, _(u'修改成功'))
        return HttpResponseRedirect("/address/subscribe/{}/".format(list_id))

    field_str = ','.join(var_lists)
    sql = u"""
    SELECT address, fullname, phone, area, sex, birthday, {3}
    FROM {0} WHERE address_id={1} AND list_id={2};
    """.format(tablename, address_id, list_id, field_str)
    cr.execute(sql)
    res = cr.fetchone()
    address, fullname, phone, area, sex, birthday, var1, var2, var3, var4, var5, var6, var7, var8, var9, var10 = res[:
                                                                                                                     16]
    varsList = res[16:]
    forloops = [i + 11 for i in xrange(len(varsList))]
    var_vals = zip(forloops, var_lists[:10], varsList)
    return render(
        request, 'address/ml_subscribe_modify.html', {
            'list_id': list_id,
            'address_id': address_id,
            'address': address,
            'fullname': fullname,
            'phone': phone,
            'area': area,
            'sex': sex,
            'birthday': birthday,
            'var1': var1,
            'var2': var2,
            'var3': var3,
            'var4': var4,
            'var5': var5,
            'var6': var6,
            'var7': var7,
            'var8': var8,
            'var9': var9,
            'var10': var10,
            'var_vals': var_vals,
        })
示例#5
0
def ajax_subscribe_list(request, list_id):
    data = request.GET
    order_column = data.get('order[0][column]', '')
    order_dir = data.get('order[0][dir]', '')
    search = data.get('search[value]', '')
    is_subscribe = data.get('is_subscribe', '')
    colums = [
        'address_id', 'address_id', 'address', 'is_subscribe', 'activity'
    ]

    obj = model_addresses.get_address_obj(request, list_id)
    user_id = obj.customer_id
    if request.user.id == user_id:
        is_modify_flag = obj.is_allow_export
    else:
        is_modify_flag = False
    # obj = get_object(MailList, request.user, list_id)
    # is_modify_flag = obj.is_allow_export

    where_str = u'list_id={}'.format(list_id)
    if is_subscribe == '1':
        where_str += u" and is_subscribe=0 "
    elif is_subscribe == '2':
        where_str += u" and is_subscribe=1 "
    elif is_subscribe == '3':
        where_str += u" and is_subscribe=2 "

    order_by_str = ''
    if order_column and int(order_column) < len(colums):
        if order_dir == 'desc':
            order_by_str = u'order by %s desc' % colums[int(order_column)]
        else:
            order_by_str = u'order by %s asc' % colums[int(order_column)]

    if not is_modify_flag:
        if validators.check_email(search):
            where_str += u""" and address='{}' """.format(search)
        elif search:
            where_str += u""" and 1=0 """
    elif is_modify_flag and search:
        where_str += u""" and address like '%{0}%' """.format(search)

    cr = connections['mm-pool'].cursor()
    tablename = 'ml_subscriber_' + str(user_id)
    sql = u"SELECT COUNT(1) FROM %s WHERE %s;" % (tablename, where_str)
    cr.execute(sql)
    rows = cr.fetchall()
    count = rows[0][0]

    var_lists = get_addr_var_fields(cr, user_id)
    field_str = ','.join(var_lists)

    try:
        length = int(data.get('length', 1))
    except ValueError:
        length = 1
    if not is_modify_flag and length > 25:
        length = 25
    else:
        length = min(length, 500)

    try:
        start_num = int(data.get('start', '0'))
    except ValueError:
        start_num = 0
    if start_num >= count:
        start_num = 0
    page = start_num / length + 1

    if not is_modify_flag and page > 5:
        rows = []
    else:
        limit_str = u'limit %s offset %s' % (length, start_num)
        sql = u"""
        SELECT address_id, address, fullname, is_subscribe,
                sex, birthday, phone, activity, area, created, updated,
                %s
        FROM %s WHERE %s %s %s;
        """ % (field_str, tablename, where_str, order_by_str, limit_str)
        cr.execute(sql)
        rows = cr.fetchall()
    rs = {
        "sEcho": 0,
        "iTotalRecords": count,
        "iTotalDisplayRecords": count,
        "aaData": []
    }

    # number = length * (page - 1) + 1
    _lambda_var = lambda s: s if s else ''
    for r in rows:
        address_id, address, fullname, is_subscribe, sex, birthday, phone, activity, area, created, updated = r[:
                                                                                                                11]
        varList = [_lambda_var(i) for i in list(r[11:])]
        if is_modify_flag:
            operate = u"""
            <a data-toggle="modal" href="/address/subscribe/modify/{0}/{1}/" data-target="#myModal" data-whatever="" class="btn btn-outline btn-primary btn-xs">{2}</a>
            <a type="button" class="btn btn-outline btn-danger btn-xs" href="Javascript: SetStatus({1}, '-2')">{3}</a>
            """.format(list_id, address_id, _(u'修改'), _(u'删除'))
        else:
            operate = ""
        issubscribe = u'是' if is_subscribe else u'否'
        if sex == 'M':
            sex = _(u'男')
        elif sex == 'F':
            sex = _(u"女")
        else:
            sex = ''

        activity_obj = EmailOpenClick.objects.filter(email=address).first()
        activity = activity_obj.activity if activity_obj else 0

        birthday = birthday if birthday != '0000-00-00' else '-'
        activity_s = u'<i class="fa fa-star myself-text-color-ccc"></i>' * 5
        if 0 < activity < 5:
            activity_r = u'<i class="fa fa-star text-primary"></i>' * activity
            activity_v = u'<i class="fa fa-star myself-text-color-ccc"></i>' * (
                5 - activity)
            activity_s = u"{}{}".format(activity_r, activity_v)
        elif activity >= 5:
            activity_s = u'<i class="fa fa-star text-primary"></i>' * 5
        other = u"""
        <span class="text-nowrap">{6}: <span>{0}</span></span><br>
        <span class="text-nowrap">{7}: <span>{1}</span></span><br>
        <span class="text-nowrap">{8}: <span>{2}</span></span><br>
        <span class="text-nowrap">{9}: <span>{3}</span></span><br>
        <span class="text-nowrap">{10}: <span>{4}</span></span><br>
        <span class="text-nowrap display_none">{11}: <span>{5}</span></span><br>
        """.format(fullname, sex, show_click_date(birthday), phone,
                   area, activity_s, _(u'姓名'), _(u'性别'), _(u'生日'), _(u'手机'),
                   _(u'地区'), _(u'活跃度'))
        aaData = [address_id, address, issubscribe, other] + varList + [
            # u"<span class='text-nowrap'>{}</span><br><span class='text-nowrap'>{}</span>".format(
            #     show_click_datetime(created), show_click_datetime(updated)
            # ),
            operate,
            "",
        ]
        rs["aaData"].append(aaData)
        # number += 1
    return HttpResponse(json.dumps(rs, ensure_ascii=False),
                        content_type="application/json")
示例#6
0
def ajax_add_address(request, list_id):
    data = request.POST
    post_data = data.get('post_data', '')
    cr = connections['mm-pool'].cursor()
    customer_id = request.user.id
    address_sqls.checkTable(cr, customer_id)
    tablename = 'ml_subscriber_' + str(customer_id)
    values, _addresses = [], []
    success, fail, repeat, valid = 0, 0, 0, 0
    p = re.compile('^(\w|[-+=.])+@\w+([-.]\w+)*\.(\w+)$')
    p_phone = re.compile(
        r'((\+?86)|(\(\+86\)))?(\s)?(13[012356789][0-9]{8}|15[012356789][0-9]{8}|18[02356789][0-9]{8}|14[57][0-9]{8}|1349[0-9]{7}|177[0-9]{8})'
    )
    var_lists = get_addr_var_fields(cr, request.user.id)
    # field_str = u'(list_id, address, fullname, sex, birthday, phone, area, {}, created)'.format(','.join(var_lists))
    mongo = pymongo.MongoClient(
        host='mongodb://{username}:{password}@{host}:{port}/{dbname}'.format(
            **mongo_cfg))
    db = mongo['mm-mc'].badmail

    import_obj = AddressImportLog.objects.create(
        maillist_id=list_id,
        customer=request.user,
        filename=None,
        filepath=None,
        status='1',
        count_all=0,
        count_err_1=0,
        count_err_2=0,
        time_import=time.strftime("%Y-%m-%d %H:%M:%S"),
        time_finish=time.strftime("%Y-%m-%d %H:%M:%S"))
    # 错误类型 1
    err_t1_name = '{}_maillist_err_t1.txt'.format(import_obj.id)
    err_t1_path = os.path.join("/usr/local/mail-import/data/", err_t1_name)
    fp_err_t1 = open(err_t1_path, "a")

    # 错误类型 2
    err_t2_name = '{}_maillist_err_t2.txt'.format(import_obj.id)
    err_t2_path = os.path.join("/usr/local/mail-import/data/", err_t2_name)
    fp_err_t2 = open(err_t2_path, "a")

    redis = get_redis_connection()
    for d in post_data.split('\n'):
        l = d.strip().replace('\r', '').replace(u';', ';')
        l = l.split(";")
        length = len(l)
        if (length == 1 and not l[0].strip()) or (not l):
            continue

        # 判断邮箱地址格式
        if l and not p.match(l[0].strip()):
            fail += 1
            address_tools.save_error_addr(fp_err_t1, l[0])
            continue

        address = l[0].strip()
        if address.split('@')[-1] in (u'yahoo.com.cn', u'yahoo.cn'):
            valid += 1
            address_tools.save_error_addr(fp_err_t1, l[0])
            continue

        if db.find_one({"addr": address}):
            valid += 1
            address_tools.save_error_addr(fp_err_t1, l[0])
            continue

        # 判断重复
        cr.execute(
            u"SELECT address_id FROM {} WHERE address='{}' AND list_id={} LIMIT 1;"
            .format(tablename, address, list_id))
        if cr.fetchone():
            repeat += 1
            address_tools.save_error_addr(fp_err_t2, l[0])
            continue

        if address in _addresses:
            repeat += 1
            address_tools.save_error_addr(fp_err_t2, l[0])
            continue

        if check_qq_addr(address):
            redis.lpush(GLB_REDIS_REMOTE_GET_QQ, address)

        _addresses.append(address)
        try:
            fullname = l[1].strip() if l[1].strip() else '@'.join(
                address.split("@")[:-1])
        except:
            fullname = '@'.join(address.split("@")[:-1])

        sex = l[2].strip() if length > 2 else ''
        sex = address_tools.handleSex(sex)

        birthday = l[3].strip() if length > 3 else ''
        birthday = address_tools.hanfBirthday(birthday)

        phone = l[4].strip() if length > 4 else ''
        m = p_phone.search(phone)
        phone = m.group() if m else ''

        area = l[5].strip() if length > 5 else ''
        vars = l[6:]
        sql_parts, sql_args = get_fields_args(var_lists, vars)
        sql = "INSERT INTO `mm-pool`.`ml_subscriber_%s` SET list_id=%s, address=%s, fullname=%s, sex=%s, birthday=%s, phone=%s, area=%s, created=%s{}".format(
            sql_parts)
        args = [
            customer_id, list_id, address, fullname, sex, birthday, phone,
            area,
            time.strftime("%Y-%m-%d %H:%M:%S")
        ] + sql_args
        cr.execute(sql, args)
        success += 1
    msg = _(
        u'成功提交%(success)d条记录, 其中有%(repeat)d条重复记录, %(fail)d条格式错误, %(valid)d条无效地址'
    ) % {
        'success': success,
        'repeat': repeat,
        'fail': fail,
        'valid': valid,
    }

    obj = MailList.objects.filter(id=list_id).first()
    if obj:
        obj.count_all = F('count_all') + success + fail + valid
        obj.count_err = F('count_err') + fail + valid
        obj.updated = time.strftime("%Y-%m-%d %H:%M:%S")
        obj.save()

    import_obj.count_all = success + fail + valid + repeat
    import_obj.count_err_1 = fail + valid
    import_obj.count_err_2 = repeat
    import_obj.time_finish = time.strftime("%Y-%m-%d %H:%M:%S")
    import_obj.save()
    if int(success) > 0:
        redis.rpush(EDM_WEB_USER_MAIL_IMPORT_COUNT_QUEUE,
                    '{}_{}'.format(customer_id, list_id))
        if request.user.service().is_auto_duplicate:
            redis.rpush(EDM_WEB_MAIL_DUPLICATE_QUEUE, int(customer_id))

    return HttpResponse(json.dumps({'msg': msg}),
                        content_type="application/json")
示例#7
0
def get_task_add_context(request):
    # 任务名称
    send_name = '{}-{}-{}'.format(time.strftime('%Y%m%d%H%M%S'), request.user.id, random.randint(10, 100))
    # 地址池
    maillist_objs = MailList.objects.filter(
        Q(customer=request.user) |  Q(sub_share_maillist__user=request.user)).filter(
        isvalid=True, is_smtp=False).order_by('-id')[:500]
    # maillist_objs = MailList.objects.filter(customer=request.user, isvalid=True, is_smtp=False).order_by('-id')[:300]
    # 获取域名
    domain_list = CustomerMailbox.objects.filter(
        customer=request.user, disabled='0').values_list('domain', flat=True).distinct()
    domain_objs = CustomerDomain.objects.filter(domain__in=list(domain_list), customer_id__in=[0, request.user.id])

    # 共享域名获取
    ctype = CustomerDomainMailboxRel.objects.get_content_type('domain')
    share_domain_ids = CustomerDomainMailboxRel.objects.filter(customer=request.user, content_type=ctype).values_list(
        'object_id', flat=True)
    share_domain_objs = CustomerDomain.objects.filter(customer=request.user.parent, id__in=share_domain_ids)

    # 获取跟踪域名
    track_domain_list = CustomerTrackDomain.objects.filter(customer=request.user).order_by('-id')
    track_domain = track_domain_list[0].domain if track_domain_list else None

    # 复制
    task_id = request.GET.get('task_id', '')
    task_obj = None
    if task_id:
        task_obj = SendTask.objects.filter(user=request.user, id=task_id).first()

    task_copy_template_ids = task_obj.get_copy_template_ids() if task_obj else []
    c_send_qty_type = 'all'
    c_send_qty = 0
    c_send_qty_start = 0
    c_send_domain = 'all'
    c_send_fullname = None
    c_send_replyto = None
    c_track_status = 0
    c_track_domain = None
    c_is_need_receipt = False
    # 发送速度
    c_hour_speed = 5000
    # AB 发送
    c_is_ab = False
    c_ab_appraise_qty = 5000
    c_ab_content_limit = 2
    c_send_maillist_ids = []
    if task_obj:
        if task_obj.send_maillist_id == 0:
            c_send_maillist_ids = TaskMailList.objects.filter(send=task_obj).values_list("maillist_id", flat=True)
        else:
            c_send_maillist_ids = [task_obj.send_maillist_id]
        c_send_qty = task_obj.send_qty
        c_send_qty_start = task_obj.send_qty_start
        if c_send_qty_start != 0:
            c_send_qty_type = 'limit'
            c_send_qty_start = c_send_qty_start if c_send_qty_start else 1
        if task_obj.send_acct_type == 'domain':
            c_send_domain = task_obj.send_acct_domain
        c_send_fullname = task_obj.send_fullname
        c_send_replyto = task_obj.send_replyto
        c_track_status = task_obj.track_status
        c_track_domain = task_obj.track_domain
        c_is_need_receipt = task_obj.is_need_receipt
        c_hour_speed = task_obj.hour_speed
        c_is_ab = task_obj.is_ab
        c_ab_appraise_qty = task_obj.ab_appraise_qty
        c_ab_content_limit = task_obj.ab_content_limit

    # 失败地址重发(拒绝投递重发)
    errtype = request.GET.get('errtype', '')
    status = request.GET.get('status', '')
    retry_flag = False
    if status == 'retry' and errtype == '5' and task_obj:
        if task_obj.send_maillist_id == 0:
            T_send_maillist_ids = list(TaskMailList.objects.filter(send=task_obj).values_list("maillist_id", flat=True))
        else:
            T_send_maillist_ids = [task_obj.send_maillist_id]
        if not T_send_maillist_ids:
            raise Http404

        retry_flag = True
        _mobj = MailList.objects.create(
            customer=request.user,
            subject=u'{}_失败重发'.format(task_obj.send_name)
        )
        c_send_maillist_id = _mobj.id
        stats = StatTask.objects.filter(
            customer=request.user, task_ident=task_obj.send_name).values_list(
            'id', flat=True)
        lists = StatError.objects.filter(
            customer=request.user, task_id__in=stats).filter(
            error_type='5').values_list(
            'recipient', flat=True).distinct()
        _mobj.count_real = len(lists)
        _mobj.save()
        created = time.strftime("%Y-%m-%d %H:%M:%S")
        res = [(c_send_maillist_id, r, created) for r in lists]
        sql = "INSERT INTO `mm-pool`.`ml_subscriber_{}` (list_id, address, created) VALUES (%s, %s, %s)".format(
            request.user.id)
        cr = connections['mm-pool'].cursor()
        cr.executemany(sql, res)

        var_lists = get_addr_var_fields(cr, request.user.id)
        select_var_str = ','.join(var_lists)
        update_var_str = ', '.join('t1.{0}=t2.{0}'.format(varT) for varT in var_lists)
        update_sql = """
        UPDATE ml_subscriber_{0} t1, (
          SELECT address, list_id, fullname, sex, birthday, phone, area, {3}
          FROM ml_subscriber_{0} WHERE list_id in ({1})
        ) t2
        SET t1.fullname=t2.fullname, t1.sex=t2.sex, t1.birthday=t2.birthday, t1.phone=t2.phone, t1.area=t2.area, {4}
        WHERE t1.address = t2.address AND t1.list_id={2};
        """.format(request.user.id, ",".join(map(str, T_send_maillist_ids)), c_send_maillist_id, select_var_str, update_var_str)
        cr.execute(update_sql)
        task_copy_template_ids = []
        c_send_maillist_ids = [c_send_maillist_id]

    # 指定地址
    replyto_obj, _c = SendTaskReplyto.objects.get_or_create(user=request.user)
    c_send_replyto = c_send_replyto if c_send_replyto else replyto_obj.send_replyto

    track_domain = c_track_domain if c_track_domain else track_domain
    template_ids = ','.join(map(str, task_copy_template_ids)) if task_copy_template_ids else request.GET.get(
        'template_ids', '')
    select_template_ids = []
    if template_ids:
        select_template_ids = map(int, template_ids.split(','))

    select_template_ids = task_copy_template_ids if task_copy_template_ids else select_template_ids

    # 加载模板
    template_existed_1, load_template_existed = False, True
    # lists = SendTemplate.objects.filter(user=request.user, isvalid=True, result__in=['green', 'yellow', 'red_pass'])
    lists = SendTemplate.objects.filter(
        Q(user=request.user) | Q(sub_share_template__user=request.user)).filter(
        isvalid=True, result__in=['green', 'yellow', 'red_pass'])
    template_lists = lists.filter(id__in=select_template_ids)
    if template_lists:
        template_existed_1 = True
    exclude_template_existed = lists.exclude(id__in=select_template_ids).exists()
    template_existed = True if ( template_existed_1 or exclude_template_existed ) else False

    # 获取测试通道数量
    redis = get_redis_connection()
    test_channal_qty = redis.hget('channel:cfg', 'qty') or 30
    context = {
        'send_name': send_name,
        'template_lists': template_lists,
        'maillist_objs': maillist_objs,

        'domain_objs': domain_objs,
        'share_domain_objs': share_domain_objs,

        'track_domain_list': track_domain_list,
        'track_domain': track_domain,
        # 'custQtyValid': custQtyValid,
        # 'is_service_disabled': is_service_disabled,

        'template_ids': template_ids,
        'template_existed': template_existed,
        'exclude_template_existed': exclude_template_existed,

        "c_send_maillist_ids": c_send_maillist_ids,
        'c_send_qty_type': c_send_qty_type,
        'c_send_qty': c_send_qty,
        'c_send_qty_start': c_send_qty_start,
        'c_send_domain': c_send_domain,
        'c_send_fullname': c_send_fullname,
        'c_send_replyto': c_send_replyto,
        'c_track_status': c_track_status,
        'c_is_need_receipt': c_is_need_receipt,

        'retry_flag': retry_flag,

        'test_channal_qty': test_channal_qty,
        # 发送速度
        "c_hour_speed": c_hour_speed,
        "hour_speeds":  HOUR_SPEED,
        # AB 发送
        "c_is_ab": c_is_ab,
        "c_ab_appraise_qty": c_ab_appraise_qty,
        "c_ab_content_limit": c_ab_content_limit,
    }
    return context