2015-04-02 49 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對象,我通過這個對象約HttpClient的HTTP POST方法。比如:

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

我希望能有所幫助。