【问题标题】:Your Campaign is not ready to send in mailchimp api v3 using C#您的广告系列尚未准备好使用 C# 在 mailchimp api v3 中发送
【发布时间】:2020-02-10 17:05:45
【问题描述】:

我通过使用 C# 控制台使用 mailchimp api v3.0 创建了立即发送活动的代码。当我尝试免费帐户时,一切顺利,但是当我升级我的高级帐户时,我遇到了这个问题(仅添加 2 个成员)。

我的场景:

  1. 创建受众 => 成功
  2. 将会员订阅者添加到我创建的受众群体中 => 成功
  3. 使用特定模板创建广告系列 => 成功
  4. 在已创建的活动中发送 cehcklist => return is_ready false
  5. 发送广告系列 => 返回您的广告系列尚未准备好发送

当我尝试使用控制台 c# 使用 mailchimp api 运行我的控制台程序时,我收到了这个错误:

输入:http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/
标题:错误请求
状态:400
详细信息:您的广告系列尚未准备好发送。
实例:214b85f4-a288-44e7-b890-35925d8601ac

当我在 mailchimp 网站门户中查看活动时,我看到了这样的消息:

要发送,您的列表中至少需要 1 个订阅者。

这意味着我的活动中没有收件人,这里是详细截图:

请问有人也遇到过这种情况吗?我非常感谢任何建议。

在发送活动之前有什么办法可以解决这个问题吗?因为当我检查 mailchimp 门户时(基于上面显示的屏幕截图),我回到活动列表然后打开我的活动上面的问题自动解决,这是我的困惑。

因为 mailchimp api v3.0 一次通话限制为 500 名会员订阅者,最后我创建了类来划分我的列表:

//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;
    }
}

这是我的主要代码使用几个场景来处理单个方法可以通过多种方式调用:

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++;   // increment
            }

            //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;
    }
}

【问题讨论】:

    标签: c# mailchimp-api-v3.0


    【解决方案1】:

    试试下面的代码

     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
    

    【讨论】:

    • 我只是根据上面的代码更改了我的代码,将我的条件 while (check &lt;= 10) 更改为 while (true) 它花了很长时间大约 5 分钟才能完成我的广告系列,但它起作用了。等待更长的时间System.Threading.Thread.Sleep(40000); 谢谢
    猜你喜欢
    • 2019-04-21
    • 2018-02-24
    • 2016-01-25
    • 2022-01-26
    • 2017-12-19
    • 2016-02-21
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多