2013-01-09 3 views
10

Sono di fronte a un problema quando la posta elettronica con allegato inviato viene inviata tramite mailgun. Se qualcuno ha fatto questa cosa per favore rispondi. Questo è il mio codice ...Mailgun Posta inviata Con allegato

$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); 

(ho usato le mie impostazioni mailgun)

ricevo l'e-mail senza l'allegato. Se utilizzo il percorso URL, visualizza l'URL anziché l'allegato.

risposta

5

È necessario modificare l'ultimo parametro nel seguente modo: attachment[1]' => '@aaa.rar

Abbiamo alcuni campioni nella nostra documentazione per questo caso d'uso. Basta fare clic su PHP nella barra in alto per cambiare lingua. http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

Non esitate a inviarci un'e-mail con qualsiasi domanda a [email protected] Siamo sempre felici di aiutare.

+0

just forgot @ ... thanx – TechCare99

+1

i tuoi esempi richiedono al compositore –

+2

@ user1964269 l'allegato può essere un collegamento diretto anziché un file locale? per esempio come 'attachment [1] '=>' @http: // example.com/direc/file/path/file.jpg'? –

4

La documentazione non lo dice esplicitamente, ma l'allegato stesso è raggruppato nella richiesta come multipart/form-data.

Il modo migliore per eseguire il debug di ciò che sta accadendo è usare Fiddler per guardare la richiesta. Accertati di accettare il certificato di root di Fiddler, altrimenti la richiesta non verrà emessa a causa dell'errore SSL.

Cosa si dovrebbe vedere in Fiddler è per le intestazioni:

Cookies/Login

Authorization: Basic <snip>== 

Entity

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

E per TextView:

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

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

Si noti che è POST il fie ld 'attachment = @ < nomefile>'. Per i dati del modulo, il nome del campo è anche "allegato", quindi "nome file = < nomefile>" (senza "@") e infine il contenuto del file.

Penso che CURL dovrebbe fare tutto questo per te magicamente basandosi sull'uso della sintassi '@' e specificando un percorso per un file sul tuo computer locale. Ma senza conoscere il comportamento magico è difficile ingannare ciò che sta realmente accadendo.

Ad esempio, in C# che assomiglia a questo:

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

grazie per la risposta. :) – TechCare99

+0

hey hai mai usato mailgun web api .. sto affrontando un problema nell'invio di allegati usando web api – therealprashant

7

Mi rendo conto che è vecchio, ma ho appena eseguito in questo problema e questa pagina è praticamente l'unico informazioni che posso trovare in rete . Quindi spero che questo aiuterà qualcun altro. Dopo aver parlato con il supporto MailGun ho trovato i seguenti lavori con l'API corrente.

Cicli attraverso una serie di zero a file allegati 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

Per chiarire, questo esempio NON sta usando il compositore come richiesto per l'SDK di MailGun, questo è l'accesso all'API di MailGun via PHP/cURL – nzmuzzer

+0

Richiede PHP 5.5 o versioni successive (da qui il motivo per cui non è mai stato presentato come soluzione prima). – bart

+0

unica soluzione che ha funzionato per me senza SDK – baku

0

Aggiungi file allegato:

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

Thsi ha funzionato per me:

<?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

mi sono bloccato su questo problema per un po 'e le risposte qui mi hanno aiutato, ma c'è qualcosa che ho trovato che non è stato ancora menzionato.

Ho inviato i miei parametri POST con un valore 'cc' vuoto/Null, ad esempio: $post_data['cc'] = NULL;. Ciò non mi ha impedito di inviare e-mail di testo (nessun allegato), ma ha causato problemi durante l'invio di una e-mail con un allegato. La rimozione del vuoto cc dalla parte risolta dell'array del problema.

Inoltre, stavo usando http_build_query prima di pubblicare i miei dati tramite PHP curl e questo ha impedito che la mia email con allegato venisse inviata con successo.

Rimozione del vuoto cc e http_build_query risolto per me. Forse un caso raro, ma la pubblicazione nel caso in cui sia utile per qualcuno che ha lo stesso problema.