6

我正在尝试使用我的 ASP.NET C# 网站实现 Mail Chimp 的新 API,因此当用户在输入框中输入他们的电子邮件地址时,它将自动添加到我的 mailchimp 列表中。我尝试了各种其他方法,但是这些方法都没有奏效。

我尝试了一个 Web 客户端,它抛出了 405 Cannot use that Method 响应和一个 HttpClient,它在加星标的 GetStringAsync 方法调用上抛出了错误,因为它不是任务。

到目前为止,我的代码详细如下:

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

5 回答 5

9

我对这个问题有点晚了,但是由于我花了半天时间才弄清楚,这里有我的答案,所以它可以帮助其他人。我正在使用 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 = "somebodys@email.com",
      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
    }
  }
}

这里有 SubscribeClassCreatedByMe 和 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; }
  }
}

好吧,我希望这有帮助!

于 2016-03-10T17:17:29.960 回答
0

401 不是“无法使用该方法”,而是“未经授权”。您遇到了身份验证错误。从外观上看,您并没有以正确的方式进行基本身份验证。查看此示例以了解您缺少的详细信息。

PS:从 APIv3 返回的响应通常很有帮助,因此您应该始终确保查看整个响应,而不仅仅是状态码。

于 2015-08-13T15:18:54.040 回答
0

添加到引用MailChimp.Net.dll 中,您可以定义一个接口,例如

IMailChimpManager manager = new MailChimpManager(ConfigurationManager.AppSettings["MailChimpApiKey"].ToString());

比您可以在 MailChimp 列表中添加或更新您的客户端

                Member m = await manager.Members.AddOrUpdateAsync(ConfigurationManager.AppSettings["MailChimpListId"].ToString(), new Member { EmailAddress = _email, EmailType = "html", Status = Status.Pending});
            m = await manager.Members.AddOrUpdateAsync(ConfigurationManager.AppSettings["MailChimpListId"].ToString(), new Member { EmailAddress = _email, EmailType = "html", Status = Status.Subscribed });

这很简单..我想...

于 2019-08-29T08:04:25.943 回答
0

Below code snippet is should work on .NET Core 2.1 using Mailchimp API V3.0:

    string url = @"https://" + mailchimpInstance + ".api.mailchimp.com/3.0/lists/" + ListId + "/members";

     var info = new Info() { email_address = "example@gmail.com", status = "subscribed" };
        var infoJson = JsonConvert.SerializeObject(info);

     using (var client = new HttpClient())
        {

            var uri = "https://" + mailchimpInstance + ".api.mailchimp.com/";
            var endpoint = "3.0/lists/" + ListId + "/members";

            try
            {

                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);
                var content = new StringContent(infoJson.ToString(), Encoding.UTF8, "application/json");
                 HttpResponseMessage response = await client.PostAsync(endpoint, content);

                var responseString = await response.Content.ReadAsStringAsync();
                Console.WriteLine("Response from server -> " + responseString);

                return Ok();
于 2018-09-15T06:58:52.560 回答
0

如果您将 auth 更改为以下行,它将起作用:

String username = "abc"; //anything
String password = apiKey; //your apikey
String encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));

client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", encoded);
于 2018-06-18T22:51:34.503 回答