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')
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, })
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
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, })
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")
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")
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