Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding subscribers to a list in Mail Chimp 3.0 in ASP.NET

I am trying to implement Mail Chimp's new API with my ASP.NET C# website so when a user enters their email address into an input box it will be added to my mailchimp list automatically. I have tried various other methods however none of these have worked.

I have tried a Web Client which threw a 405 Cannot use that Method response and a HttpClient which threw an error on the starred GetStringAsync method call because its not a task.

My code so far is detailed below:

public bool BatchSubscribe(IEnumerable<MailChimpSubscriberModel> newSubscribers)
{   
    if (string.IsNullOrEmpty(_defaultListId)) throw new ArgumentNullException(Res.Resource.MailChimpIntegrationNoListId);

    if (string.IsNullOrEmpty(_apiKey)) throw new ArgumentNullException(Res.Resource.MailChimpIntegrationNoApiKey);

    foreach (MailChimpSubscriberModel subscriber in newSubscribers)
    {
        string url = "https://" + _dataPoint + ".api.mailchimp.com/3.0/lists/" + _defaultListId + "/";

        Subscriber member = new Subscriber();
        member.email = subscriber.Email;
        member.subscribed = "subscribed";

        string jsonString = new JavaScriptSerializer().Serialize(member);

        //using (WebClient client = new WebClient())
        //{
        //    client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        //    client.Headers[HttpRequestHeader.Authorization] = new AuthenticationHeaderValue("Basic", _apiKey).ToString();
        //    string HtmlResult = client.(url, jsonString);

        //    return true;
        //}

        using (var http = new HttpClient())
        {
            http.DefaultRequestHeaders.Authorization =
                 new AuthenticationHeaderValue("Basic", _apiKey);
            string content = await http.**GetStringAsync**(@"https://us11.api.mailchimp.com/3.0/lists");
            Console.WriteLine(content);
        }
    }
    return false;
}
like image 849
PYROv1 Avatar asked Aug 13 '15 14:08

PYROv1


1 Answers

I'm a bit late to this question, but as it took me half a day to figure it out, here there is my answer, so it can help others. I'm using MailChimp 3.0:

private void subscribeAddress() 
{
  string apiKey = "APIKEY-usX"; //your API KEY created by you.
  string dataCenter = "usX";
  string listID = "listID"; //The ListID of the list you want to use.

  SubscribeClassCreatedByMe subscribeRequest = new SubscribeClassCreatedByMe 
  {
      email_address = "[email protected]",
      status = "subscribed"
  };
  subscribeRequest.merge_fields = new MergeFieldClassCreatedByMe();
  subscribeRequest.merge_fields.FNAME = "YourName";
  subscribeRequest.merge_fields.LNAME = "YourSurname";

  using (HttpClient client = new HttpClient())
  {
      var uri = "https://" + dataCenter + ".api.mailchimp.com/";
      var endpoint = "3.0/lists/" + listID + "/members";

      client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", apiKey);
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
      client.BaseAddress = new Uri(uri);

      //NOTE: To avoid the method being 'async' we access to '.Result'
      HttpResponseMessage response = client.PostAsJsonAsync(endpoint, subscribeRequest).Result;//PostAsJsonAsync method serializes an object to 
                                                                                            //JSON and then sends the JSON payload in a POST request
    //StatusCode == 200
    // -> Status == "subscribed" -> Is on the list now
    // -> Status == "unsubscribed" -> this address used to be on the list, but is not anymore
    // -> Status == "pending" -> This address requested to be added with double-opt-in but hasn't confirmed yet
    // -> Status == "cleaned" -> This address bounced and has been removed from the list

    //StatusCode == 404
    if ((response.IsSuccessStatusCode))
    {
       //Your code here
    }
  }
}

Here there are the classes SubscribeClassCreatedByMe and MergeFieldClassCreatedByMe

namespace Subscriber
{
  public class SubscribeClassCreatedByMe 
  {
    public string email_address { get; set; }
    public string status { get; set; }
    public MergeFieldClassCreatedByMe merge_fields { get; set; }
  }
}
namespace Subscriber
{
  public class MergeFieldClassCreatedByMe
  {
    public string FNAME { get; set; }
    public string LNAME { get; set; }
  }
}

Well, I hope this help!!

like image 137
Aida Avatar answered Sep 21 '22 11:09

Aida