2015-04-02 10 views
1

В настоящее время я использую Mailgun для выполнения отправки электронной почты в своем приложении через их службы REST API. В их примерах используется RestSharp, у которого в моем проекте уже есть клиент MS Web API для отдыха, я не хочу устанавливать другой для этой функции. Стандартные электронные письма отлично работают с использованием HttpClient, но когда дело доходит до добавления вложения, я немного не понимаю.Вложения электронной почты в HttpClient

Там код выглядит следующим образом для отправки электронной почты с вложением ...

RestClient client = new RestClient(); 

client.BaseUrl = new Uri("https://api.mailgun.net/v3"); 
client.Authenticator = new HttpBasicAuthenticator("api", "MailgunKeyGoesHere"); 
RestRequest request = new RestRequest(); 
request.AddParameter("domain", 
       "mailgundomain.mailgun.org", ParameterType.UrlSegment); 
request.Resource = "{domain}/messages"; 
request.AddParameter("from", "Mailgun Sandbox <[email protected]>"); 
request.AddParameter("to", "My Email <[email protected]>"); 
request.AddParameter("subject", "Hello"); 
request.AddParameter("text", "This is the test content"); 

request.AddFile("attachment", Path.Combine("C:\\temp", "test.jpg")); 

request.Method = Method.POST; 
client.Execute(request); 

Это прекрасно работает, я проверил это работает в LINQPad. Мой код, однако, не я, похоже, не вижу, что делать.

var client = new HttpClient(); 

client.BaseAddress = new Uri(string.Format("{0}/{1}/messages", @"https://api.mailgun.net/v3", "mailgundomain.mailgun.org")); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "MailgunKeyGoesHere"); 

var kvpContent = new List<KeyValuePair<string, string>> 
{ 
    new KeyValuePair<string, string>("Content-Disposition: form-data; name=\"from\"", "Mailgun Sandbox <[email protected]>"), 
    new KeyValuePair<string, string>("Content-Disposition: form-data; name=\"subject\"", "Test Email"), 
    new KeyValuePair<string, string>("Content-Disposition: form-data; name=\"text\"", "It Worked!!"), 
    new KeyValuePair<string, string>("Content-Disposition: form-data; name=\"to\"", "My Email <[email protected]>"), 
}; 

var fileData = File.ReadAllBytes(@"C:\Temp\test.jpg"); 

//This is where it goes wrong. I know at the moment fileData.ToString() is wrong but this is the last thing I tried 
kvpContent.Add(new KeyValuePair<string, string>("Content-Disposition: form-data; name=\"attachment\"; filename=\"test.jpg\" Content-Type: application/octet-stream", 
        fileData.ToString())); 


var formContent = new FormUrlEncodedContent(kvpContent); 

var response = client.PostAsync(client.BaseAddress, formContent).Result; 

Любые идеи?

ответ

2

Я создал MultipartFormDataContent вместо FormUrlEncodedContent и добавил содержимое объекта MultipartFormDataContent.

Вы можете добавить вложение, создавая объект ByteArrayContent следующим образом:

ByteArrayContent fileContent = new ByteArrayContent(File.ReadAllBytes(filePath)); 

fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
       { 
         Name = "attachment", 
         FileName = "MyAttachment.pdf" 
       }; 

content.Add(fileContent); 

Где содержание моего объекта MultipartFormDataContent, я прохожу этот объект в HTTP Post метода о HttpClient. Например:

HttpResponseMessage response = client.PostAsync(url, content).Result; 

Я надеюсь помочь.

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