Вложения электронной почты в HttpClient

В настоящее время я использую Mailgun для отправки электронной почты в приложении через их службы API REST. В их примерах используется RestSharp, у которого уже есть клиент для отдыха MS Web API в моем проекте, и я не хочу устанавливать другой для этой функции. Стандартные электронные письма работают нормально, используя 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 <postmaster@mailgundomain.mailgun.org>");
request.AddParameter("to", "My Email <myemail@testdomain.co.uk>");
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 <postmaster@mailgundomain.mailgun.org>"),
   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 <myemail@testdomain.co.uk>"),
};

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;

Есть идеи?

1 ответ

Я создал 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);

Где content - это мой объект MultipartFormDataContent, я передаю этот объект в метод HTTP Post о HttpClient. Например:

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

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

Другие вопросы по тегам