C# 您的活动尚未准备好使用C发送mailchimp api v3#

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运行控制台程序时,

我通过使用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