c# - 您的营销事件尚未准备好使用 C# 在 mailchimp api v3 中发送

标签 c# mailchimp-api-v3.0

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

我的场景:

  1. 创造受众 => 成功
  2. 将成员订阅者添加到我创建的受众中 => 成功
  3. 使用特定模板创建事件 => 成功
  4. 在已创建的事件中发送 cehcklist => 返回 is_ready false
  5. 发送事件 => 返回您的事件尚未准备好发送

当我尝试使用控制台 c# consume mailchimp api 运行我的控制台程序时,出现此错误:

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.

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

enter image description here

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

在发送事件之前有什么办法可以解决这个问题吗?因为当我检查 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;
    }
}

最佳答案

试试下面的代码

 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

关于c# - 您的营销事件尚未准备好使用 C# 在 mailchimp api v3 中发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58370576/

相关文章:

c# - 是否有用于 MS Excel 操作(读/写)的 Dot NET (C#) 库?

c# - WebSecurity.IsAuthenticated 如何检查您是否已登录?

c# - 从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?

php - Mailchimp API 3.0 错误 : "Schema describes object, array found instead" is the code or on mailchimp's end?

mailchimp - 如何通过 api 将 "Tags"添加到 mailchimp 订阅者

ruby-on-rails - Mailchimp double_optin => false 在 mailchimp-api-ruby 中不起作用

mailchimp - 如何获取 mailchimp API v3.0 上的所有列表?

c# - 如何在azure上上传图像列表并检索已上传图像的地址

c# - Web API 2 Owin 刷新 token 不起作用并在其到期时间之前返回 invalid_grant

ruby-on-rails - MailChimp API v3 - 通过电子邮件获取成员(member)