【问题标题】:Mandrill API response with HTTP Status 500带有 HTTP 状态 500 的 Mandrill API 响应
【发布时间】:2014-01-20 19:12:52
【问题描述】:

我一直试图让我的 MVC Web 应用程序使用 Mandrill API 订阅来发送电子邮件,但无济于事。这个 Mandrill API 通过将 JSON 对象发布到特定端点来工作。它看起来非常简单直接,这就是为什么每次我尝试发送电子邮件时都会收到来自 Mandrill 的回复,其中只有“500 内部服务器错误”,没有额外的信息或其他任何内容,这很令人沮丧。

有趣的是,Mandrill API 有一个public test tool,您可以使用它来测试他们的 API。因此,我进入并传递了与我的应用程序在收到烦人的 Http 错误时发送的完全相同的 JSON 对象,并且发送的电子邮件消息没有任何问题。所以基本上我通过他们的Test Tool 发送相同的电子邮件没有问题,但是当我的应用程序尝试发送它时它失败了。

请在下面找到受托人发送电子邮件。它还没有重构...对不起...

public bool Send(string to, string toDisplayName, string subject, string body)
{
        var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://mandrillapp.com/api/1.0/messages/send.json");
        httpWebRequest.ContentType = "text/json";
        httpWebRequest.Method = "POST";

        try
        {
            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                string json = string.Format(@"{{""key"": ""{0}"",""message"": {{""html"": ""{1}"",""subject"": ""{2}"",""from_email"": ""{3}"",""from_name"": ""AppCompear"",""to"": [{{""email"": ""{4}"",""name"": ""{5}"",""type"": ""to""}}],""important"": false}},""async"": false,""ip_pool"": ""Main Pool""}}"
                    , _setting.Password, body.Replace(@"""", @"\"""), subject, _setting.UserName, to, toDisplayName);

                LogManager.Current.LogError(to, "", "", "", null, json);
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();

                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                }
            }
        }
        catch (WebException wex)
        {
            LogManager.Current.LogError(to, "", "", "", wex, wex.Message);
        }
        catch (Exception ex)
        {
            LogManager.Current.LogError(to, "", "", "", ex, ex.Message);
        }

        return true;
  }

当然,在尝试获取响应时它会失败

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

任何帮助将不胜感激

【问题讨论】:

    标签: c# asp.net-mvc mandrill


    【解决方案1】:

    好的,在搜索 Mandrill API 文档以寻找有关进行 API 调用需要考虑什么的线索之后(看起来并不那么简单),我决定安装一个 NuGet 包实际上是一个围绕 Mandrill API 的 .NET 包装器。

    进行一些调整后,代码看起来类似于以下...

    Mandrill.EmailMessage message = new Mandrill.EmailMessage();
    message.from_email = _setting.UserName;
    message.from_name = "Whatever";
    message.html = body;
    message.subject = subject;
    message.to = new List<Mandrill.EmailAddress>()
    {
        new Mandrill.EmailAddress(to, toDisplayName)
    };
    
    Mandrill.MandrillApi mandrillApi = new Mandrill.MandrillApi(_setting.Password, false);
    var results = mandrillApi.SendMessage(message);
    
    foreach (var result in results)
    {
          if (result.Status != Mandrill.EmailResultStatus.Sent)
               LogManager.Current.LogError(result.Email, "", "", "", null, string.Format("Email failed to send: {0}", result.RejectReason));
    }
    

    【讨论】:

    • 我从 nuget 添加了 Mandrill.API,但找不到 Mandrill.EmailMessage.. 请告知?
    • @user384080 您是否添加了对Mandrill 命名空间的引用? using Madrill;
    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2011-04-25
    • 2011-12-21
    • 2018-04-21
    相关资源
    最近更新 更多