C# 您的活动尚未准备好使用C发送mailchimp api v3#
我通过使用C#控制台使用mailchimp api v3.0创建了立即发送活动的代码。当我尝试在免费帐户一切顺利,但当我升级我的帐户在溢价我得到了这个问题(只添加2名成员) 我的设想:C# 您的活动尚未准备好使用C发送mailchimp api v3#,c#,mailchimp-api-v3.0,C#,Mailchimp Api V3.0,我通过使用C#控制台使用mailchimp api v3.0创建了立即发送活动的代码。当我尝试在免费帐户一切顺利,但当我升级我的帐户在溢价我得到了这个问题(只添加2名成员) 我的设想: 创建受众=>成功 将成员订阅者添加到我创建的受众=>success 使用spesific模板创建活动=>success 在已创建的活动中发送cehcklist=>返回已准备就绪错误 发送活动=>返回您的活动尚未准备好发送 当我尝试使用console c#consume mailchimp api运行控制台程序时,
====Error========
Type: http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/
Title: Bad Request
Status: 400
Detail: Your Campaign is not ready to send.
instance: 214b85f4-a288-44e7-b890-35925d8601ac
当我在mailchimp网站门户中查看活动时,我看到这样的信息:
To send, you need at least 1 subscriber in your list.
这意味着我的活动中没有最新版本,以下是详细图像:
请任何一个像我这样的人,每一个暗示我真的很欣赏它
在发送campaing之前有没有办法解决这个问题?因为当我检查mailchimp门户(基于上面所附的图片)时,我回到了活动列表中,然后在上面打开活动自动解决问题,这是我的困惑。
因为mailchimp api v3.0在一次调用中仅限制500个成员的subcriber,最后我创建了一个类来划分我的列表:
//partition list of members more than 500
public static class Extensions
{
public static List<List<T>> SplitPartition<T>(this IEnumerable<T> collection, int size)
{
var chunks = new List<List<T>>();
var count = 0;
var temp = new List<T>();
foreach (var element in collection)
{
if (count++ == size)
{
chunks.Add(temp);
temp = new List<T>();
count = 1;
}
temp.Add(element);
}
chunks.Add(temp);
return chunks;
}
}
//超过500个成员的分区列表
公共静态类扩展
{
公共静态列表拆分分区(此IEnumerable集合,int size)
{
var chunks=新列表();
var计数=0;
var temp=新列表();
foreach(集合中的var元素)
{
如果(计数+==大小)
{
块。添加(临时);
temp=新列表();
计数=1;
}
温度添加(元素);
}
块。添加(临时);
返回块;
}
}
这是我的主要代码,使用多个场景处理单个方法可以通过多种方式调用:
public class MailChimpProcessor
{
static MailChimpProcessor()
{
//initialize
ApiHelper.InitializeClient(baseUrl, apiKey);
}
public class MailChimpResponse
{
public string result { get; set; }
public GlobalErrorResponseModel error { get; set; }
}
public static MailChimpResponse MailChimpSendCampaign(SendEmailCampaignModel model)
{
MailChimpResponse mailchimpResult = new MailChimpResponse();
#region PROPERTY OBJECT AUDIENCE
Contact contact = new Contact()
{
company = model.audience_company,
address1 = model.audience_address1,
address2 = model.address2Config,
city = model.audience_city,
state = model.audience_state,
zip = model.audience_zip,
country = model.audience_country,
phone = model.phoneConfig
};
CampaignDefaults campaign = new CampaignDefaults()
{
from_name = model.campaign_from_name,
from_email = model.campaign_reply_to,
subject = model.campaign_subject,
language = "en"
};
AudienceRequestModel audienceModel = new AudienceRequestModel();
audienceModel.name = model.audience_name;
audienceModel.contact = contact;
audienceModel.permission_reminder = permissionReminderConfig;
audienceModel.use_archive_bar = true;
audienceModel.campaign_defaults = campaign;
audienceModel.notify_on_subscribe = "";
audienceModel.notify_on_unsubscribe = "";
audienceModel.email_type_option = true;
#endregion
#region PROPERTY OBJECT MEMBER
List<Member> members = new List<Member>();
//prevent duplicate email_address
var queryMemberList = model.members.GroupBy(x => x.email_address).Select(x => x.First());
foreach (var item in queryMemberList)
{
members.Add(new Member
{
email_address = item.email_address.ToLower(),
status = "subscribed",
status_if_new = "subscribed",
merge_fields = new MergeFields()
{
FNAME = item.merge_fields.FNAME,
LNAME = item.merge_fields.LNAME
}
});
}
bool isUploadContact = false;
int offset = 0;
const int numberPerBatch = 500; // maximum member per execution.
double LoopMax = Math.Ceiling(members.Count / (double)numberPerBatch);
//partition array
var PartitionMembers = members.SplitPartition(numberPerBatch);
#endregion
//create audience using post method
var audienceResult = AudienceProcessor.PostAudienceAsync(audienceModel).Result;
#region PROPERTY OBJECT CAMPAIGN
Recipients recipient = new Recipients()
{
list_id = audienceResult.ResponseModel != null ? audienceResult.ResponseModel.id : "0"
};
Settings setting = new Settings()
{
subject_line = model.campaign_subject,
title = model.campaign_title,
reply_to = model.campaign_reply_to,
from_name = model.campaign_from_name,
template_id = model.campaign_template_id
};
CampaignRequestModel campaignModel = new CampaignRequestModel();
campaignModel.recipients = recipient;
campaignModel.type = "regular";
campaignModel.settings = setting;
#endregion
if (audienceResult.ResponseModel != null)
{
MemberProcessor.MemberResponse memberResult = new MemberProcessor.MemberResponse();
while (offset < LoopMax)
{
MemberRequestModel memberModel = new MemberRequestModel();
memberModel.members = PartitionMembers[offset];//list based on index of array
memberModel.update_existing = true;
//post contact member
memberResult = MemberProcessor.PostContatcAsync(memberModel, audienceResult.ResponseModel.id).Result;
if (memberResult.ResponseModel != null)
{
isUploadContact = true;
}
else
{
isUploadContact = false;
}
offset++;//increament
}
//create campaign
if (isUploadContact)//belum tereksekusi
{
//sleep thread 20 seconds after upload subcriber members
System.Threading.Thread.Sleep(20000);
//create campaign using post method
var campaignResult = CampaignProcessor.PostCampaignAsync(campaignModel).Result;
if (campaignResult.ResponseModel.id != null)
{
#region USING ITERATION TO CHECK CAMPAIGN
CampaignProcessor.CampaignResponseCheckList campaignChecklist = new CampaignProcessor.CampaignResponseCheckList();
bool isReadySend = false;
int check = 0;
while (check <= 10) //maksimum 10 iteration
{
//check campaign using get method
campaignChecklist = CampaignProcessor.GetCheckListCampaign(campaignResult.ResponseModel.id).Result;
if (campaignChecklist.ResponseModel.is_ready == true) //when error model is not null
{
isReadySend = true;
break;
}
else
{
isReadySend = false;
}
System.Threading.Thread.Sleep(1000); // will puase every 1 second
check++;
}
if (isReadySend)
{
//sleep action before send campaign
System.Threading.Thread.Sleep(2000);
//send campaign
var sendCampaignResult = CampaignProcessor.SendCampaignAsync(campaignResult.ResponseModel.id).Result;
if (sendCampaignResult.ErrorModel == null)
mailchimpResult.result = sendCampaignResult.ResponseModel;
else
mailchimpResult.error = sendCampaignResult.ErrorModel; //i got this return indicate that my campaign is not ready
}
else
{
mailchimpResult.error = campaignChecklist.ErrorModel;
mailchimpResult.result = $"failed Check List Campaign / Your Campaign is not ready to send.";
}
#endregion
}
else
{
mailchimpResult.error = campaignResult.ErrorModel;
mailchimpResult.result = "failed create Campaign";
}
}
else
{
mailchimpResult.result = $"failed create contact: {offset}";
mailchimpResult.error = memberResult.ErrorModel;
}
}
else
{
mailchimpResult.error = audienceResult.ErrorModel;
mailchimpResult.result = "failed create Audience";
}
return mailchimpResult;
}
}
公共类邮件处理器
{
静态处理器()
{
//初始化
InitializeClient(baseUrl,apiKey);
}
公共类邮件响应
{
公共字符串结果{get;set;}
公共全局错误响应模型错误{get;set;}
}
公共静态MailChimpResponse MailChimpSendCampaign(SendEmailCampaignModel模型)
{
MailChimpResponse mailchimpResult=新的MailChimpResponse();
#区域属性对象访问群体
联系人=新联系人()
{
company=model.viewers\u company,
address1=model.audience\u address1,
address2=model.address2Config,
城市=模型。观众\城市,
state=model.viewers\u state,
zip=model.viewers\u-zip,
国家/地区=车型。观众\国家/地区,
phone=model.phoneConfig
};
活动默认值活动=新的活动默认值()
{
from_name=model.campaign_from_name,
从电子邮件=model.campaign\u回复至,
主题=model.campaign\u主题,
language=“en”
};
AudienceRequestModel audienceModel=新建AudienceRequestModel();
audienceModel.name=model.audience\u name;
audienceModel.contact=联系人;
audienceModel.permission\u提醒=权限提醒配置;
audenceModel.use\u archive\u bar=true;
audienceModel.campaign\u默认值=活动;
audienceModel.notify on_subscribe=“”;
audienceModel.notify on_unsubscribe=“”;
audenceModel.email\u type\u option=true;
#端区
#区域属性对象成员
列表成员=新列表();
//防止重复的电子邮件地址
var queryMemberList=model.members.GroupBy(x=>x.email_地址)。选择(x=>x.First());
foreach(queryMemberList中的变量项)
{
成员。添加(新成员)
{
email\u address=item.email\u address.ToLower(),
status=“已订阅”,
状态\u如果\u new=“subscribed”,
合并\字段=新合并字段()
{
FNAME=item.merge\u fields.FNAME,
LNAME=item.merge\u fields.LNAME
}
});
}
bool isUploadContact=false;
整数偏移=0;
const int numberpatch=500;//每次执行的最大成员数。
double LoopMax=数学上限(members.Count/(double)numberPatch);
//分区阵列
var PartitionMembers=members.SplitPartition(numberPerBatch);
#端区
//使用post方法创建受众
var audenceresult=audenceprocessor.PostAudienceAsync(audencemodel.Result);
#区域属性对象活动
收件人收件人=新收件人()
{
list_id=audenceresult.ResponseModel!=null?audenceresult.ResponseModel.id:“0”
};
设置设置=新设置()
{
主题行=model.campaign主题,
title=model.campaign\u title,
reply_to=model.campaign_reply_to,
from_name=model.campaign_from_name,
template\u id=model.campaign\u template\u id
};
活动请求模型活动模型=新的活动请求模型();
activitymodel.recipients=收件人;
活动模型.type=“常规”;
活动模型设置=设置;
#端区
if(audenceResult.ResponseModel!=null)
{
MemberProcessor.MemberResponse memberResult=新的MemberProcessor.MemberResponse();
while(偏移量 System.Threading.Thread.Sleep(40000); //try change this one
//create campaign using post method
var campaignResult = CampaignProcessor.PostCampaignAsync(campaignModel).Result;
if (campaignResult.ResponseModel.id != null)
{
#region USING ITERATION TO CHECK CAMPAIGN
CampaignProcessor.CampaignResponseCheckList campaignChecklist = new CampaignProcessor.CampaignResponseCheckList();
bool isReadySend = false;
int check = 0;
while (true) //just change this condition
{
//check campaign using get method
campaignChecklist = CampaignProcessor.GetCheckListCampaign(campaignResult.ResponseModel.id).Result;
if (campaignChecklist.ResponseModel.is_ready == true) //when error model is not null
{
isReadySend = true;
break;
}
else
{
isReadySend = false;
}
check++;
}
if (isReadySend)
{
//send campaign
var sendCampaignResult = CampaignProcessor.SendCampaignAsync(campaignResult.ResponseModel.id).Result;
if (sendCampaignResult.ErrorModel == null)
mailchimpResult.result = sendCampaignResult.ResponseModel;
else
mailchimpResult.error = sendCampaignResult.ErrorModel; //i got this return indicate that my campaign is not ready
}
else
{
mailchimpResult.error = campaignChecklist.ErrorModel;
mailchimpResult.result = $"failed Check List Campaign / Your Campaign is not ready to send.";
}
#endregion