2013-01-09 246 views
10

當使用mailgun發送附件的郵件時,我正面臨問題。 如果有人做過這件事,請回復。 這是我的代碼...Mailgun發送郵件附附件

$mg_api = 'key-3ax6xnjp29jd6fds4gc373sgvjxteol0'; 
$mg_version = 'api.mailgun.net/v2/'; 
$mg_domain = "samples.mailgun.org"; 
$mg_from_email = "[email protected]"; 
$mg_reply_to_email = "[email protected]"; 

$mg_message_url = "https://".$mg_version.$mg_domain."/messages"; 


$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 

curl_setopt ($ch, CURLOPT_MAXREDIRS, 3); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_VERBOSE, 0); 
curl_setopt ($ch, CURLOPT_HEADER, 1); 
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); 

curl_setopt($ch, CURLOPT_USERPWD, 'api:' . $mg_api); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_POST, true); 
//curl_setopt($curl, CURLOPT_POSTFIELDS, $params); 
curl_setopt($ch, CURLOPT_HEADER, false); 

//curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($ch, CURLOPT_URL, $mg_message_url); 
curl_setopt($ch, CURLOPT_POSTFIELDS,     
     array( 'from'  => 'aaaa <' . '[email protected]' . '>', 
       'to'  => '[email protected]', 
       'h:Reply-To'=> ' <' . $mg_reply_to_email . '>', 
       'subject' => 'aaaaa'.time(), 
       'html'  => 'aaaaaa', 
       'attachment'[1] => 'aaa.rar' 
      )); 
$result = curl_exec($ch); 
curl_close($ch); 
$res = json_decode($result,TRUE); 
print_r($res); 

(我用我的mailgun設置)

我收到的電子郵件沒有附件。如果我使用URL路徑,它會顯示URL而不是附件。

回答

5

您需要更改的最後一個參數以下列方式: attachment[1]' => '@aaa.rar

我們有一些樣品我們對這個用例文檔。只需點擊頂欄中的PHP即可切換語言。 http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

請不要猶豫,給我們發郵件[email protected]任何問題。我們總是樂於提供幫助。

+0

只是忘了@ ... thanx – TechCare99

+1

你的例子需要作曲家 –

+2

@ user1964269可以附件是直接鏈接而不是本地文件嗎?例如像'attachment [1]'=>'@http:// example.com/direc/file/path/file.jpg'? –

4

文檔沒有明確說明,但附件本身作爲multipart/form-data捆綁到請求中。

調試正在進行的最佳方式是使用Fiddler觀看請求。確保您接受Fiddler的根證書,否則請求將不會由於SSL錯誤而發出。

你應該在小提琴手看到是頭:

餅乾/登錄

Authorization: Basic <snip>== 

實體

Content-Type: multipart/form-data; boundary=<num> 

而對於TextView的:

Content-Disposition: form-data; name="attachment" 
@Test.pdf 

Content-Disposition: form-data; name="attachment"; filename="Test.pdf" 
Content-Type: application/pdf 
<data> 

請注意,您張貼fie 'ld'attachment = @ < filename>'。對於表單數據,字段名稱也是'attachment',然後'filename = < filename>'(不帶'@'),最後是文件內容。

我覺得CURL應該只是爲了你神奇地基於使用'@'語法並指定本地計算機上文件的路徑。但是如果不知道魔法行爲,就很難發現真正發生的事情。

例如,在C#中,它看起來是這樣的:

public static void SendMail(MailMessage message) { 
    RestClient client = new RestClient(); 
    client.BaseUrl = apiUrl; 
    client.Authenticator = new HttpBasicAuthenticator("api", apiKey); 

    RestRequest request = new RestRequest(); 
    request.AddParameter("domain", domain, ParameterType.UrlSegment); 
    request.Resource = "{domain}/messages"; 
    request.AddParameter("from", message.From.ToString()); 
    request.AddParameter("to", message.To[0].Address); 
    request.AddParameter("subject", message.Subject); 
    request.AddParameter("html", message.Body); 

    foreach (Attachment attach in message.Attachments) 
    { 
     request.AddParameter("attachment", "@" + attach.Name); 
     request.AddFile("attachment", 
      attach.ContentStream.WriteTo, 
      attach.Name, 
      attach.ContentType.MediaType); 
    } 

    ... 
    request.Method = Method.POST; 
    IRestResponse response = client.Execute(request); 
} 
+0

謝謝你的回答。 :) – TechCare99

+0

嘿你有沒有使用過mailgun web api ..我在使用web api發送附件時遇到了一些問題 – therealprashant

7

我意識到這是舊的,但我剛剛遇到這個問題,而這個頁面幾乎是唯一的信息,我可以在網絡上找到。所以我希望這會幫助別人。在與MailGun支持交談後,我發現以下工作與當前的API。

循環通過零的陣列到N附件文件:

$attachmentsArray = array('file1.txt', 'file2.txt'); 
    $x = 1; 
    foreach($attachmentsArray as $att) 
    { 
     $msgArray["attachment[$x]"] = curl_file_create($att); 
     $x ++; 
    } 

    // relevant cURL parameter, $msgArray also contains to, from, subject parameters etc. 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$msgArray); 
+0

爲了說明一下,這個示例沒有使用作爲MailGun SDK所需的作曲者,而是通過通過MailGun API訪問MailGun API PHP/cURL – nzmuzzer

+0

這需要PHP 5.5或更高版本(因此它之前沒有作爲解決方案提出的原因)。 – bart

+0

只有在沒有SDK的情況下爲我工作的解決方案 – baku

0

添加附件文件:

"attachment[1]" = "@$_FILES['careerDocument']['tmp_name'];filename=test.jpg". 
($contentType ? ';type=' . $contentType : '') ; 
curl_setopt($ch, CURLOPT_POSTFIELDS, ($message)); 
0

Thsi工作對我來說:

<?php 

$filePath='@Wealth_AC_AMF.pdf'; 

$curl_post_data=array(
    'from' => 'Excited User <[email protected]>', 
    'to'  => '[email protected]', 
    'subject' => 'Hello', 
    'text' => 'test', 
'attachment[1]' => $filePath 
); 

$service_url = 'https://api.mailgun.net/v3/test.com/messages'; 
$curl = curl_init($service_url); 
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($curl, CURLOPT_USERPWD, "api:key-test"); 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_POST, true); 

curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 


$curl_response = curl_exec($curl); 
$response = json_decode($curl_response); 
curl_close($curl); 

var_dump($response); 



?> 
1

我就死在這問題一段時間,這裏的答案幫助了我,但是我遇到了一些尚未提及的東西。

我一直在發送帶有空白/空'cc'值的POST參數,如:$post_data['cc'] = NULL;。這並不妨礙我發送文本電子郵件(無附件),但它在發送帶有附件的電子郵件時確實會造成問題。從我的陣列中刪除空白cc解決了問題的一部分。

此外,我一直在使用http_build_query在通過PHP curl發佈我的數據之前,並阻止我的電子郵件附件發送成功。

刪除空cchttp_build_query爲我解決了這個問題。也許是一個罕見的案例,但發佈的情況下,有助於有同樣問題的人。