2014-01-03 4 views
0

Я пытаюсь заставить мое веб-приложение MVC отправлять электронную почту, используя подписку с API Mandrill, безрезультатно. Этот API Mandrill работает путем POSTing объекта JSON для конкретной конечной точки. Это выглядит довольно просто и прямолинейно, и поэтому это так расстраивает, что каждый раз, когда я пытался отправить сообщение электронной почты, я получаю ответ от Mandrill с не более чем «внутренней внутренней ошибкой сервера» без дополнительной информации или чего-либо еще.Ответ API-сервера Mandrill с HTTP-статусом 500

Интересно, что API Mandrill имеет public test tool, который вы можете использовать для тестирования своего API. Итак, я вошел и передал точно тот же объект JSON, которое мое приложение отправляет при получении этой досадной ошибки Http, и сообщение электронной почты отправляется без каких-либо проблем. Таким образом, в основном у меня нет проблем с отправкой одного и того же письма через их 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(); 

Любая помощь будет принята с благодарностью

ответ

1

Ok , после копания в документах API Mandrill в поисках подсказок о том, что необходимо принять во внимание, чтобы сделать вызов API (казалось, это не так прямолинейно). Я решил установить пакет NuGet, который на самом деле является. NET обертки вокруг API Mandrill.

После внесения некоторых корректировок код выглядел примерно следующим образом ...

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)); 
} 
+0

я добавил Mandrill.API из NuGet, но не может найти Mandrill.EmailMessage .. пожалуйста, сообщите? – user384080

+0

@ user384080 Вы добавили ссылку на пространство имен Mandrill? 'using Madrill;' – Leo

+0

Возможно ли создать шаблон с мандриллами по электронной почте. –

Смежные вопросы