2013-01-09 21 views
10

Ich habe Probleme, wenn Mail Anhang mit Mailgun gesendet. Wenn jemand dieses Ding getan hat, antworten Sie bitte. Dies ist mein Code ...Mailgun Gesendete Mail Mit Anhang

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

(Ich habe meine mailgun Einstellungen verwendet)

ich die E-Mail ohne Anhang. Wenn ich den URL-Pfad verwende, wird die URL anstelle des Anhangs angezeigt.

Antwort

5

Sie müssen die letzten Parameter in der folgenden Art und Weise ändern: attachment[1]' => '@aaa.rar

Wir haben einige Beispiele in unserer Dokumentation für diesen Anwendungsfall. Klicken Sie einfach in der oberen Leiste auf PHP, um die Sprache zu wechseln. http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

Bitte zögern Sie nicht, uns eine E-Mail mit Fragen an [email protected] zu senden. Wir sind immer glücklich zu helfen.

+0

nur vergessen @ ... danke – TechCare99

+1

Ihre Beispiele erfordern Composer –

+2

@ user1964269 kann Anhang direkte Verbindung statt lokale Datei sein? zum Beispiel wie 'Anhang [1] '=>' @http: // Beispiel.com/direc/Datei/Pfad/Datei.jpg'? –

4

Die Dokumentation sagt es nicht explizit, aber der Anhang selbst ist in der Anfrage als multipart/form-Daten gebündelt.

Der beste Weg, um zu debuggen, was passiert, ist Fiddler, um die Anfrage zu sehen. Stellen Sie sicher, dass Sie das Stammzertifikat von Fiddler akzeptieren, da die Anforderung aufgrund des SSL-Fehlers nicht ausgegeben wird.

Was sollten Sie in Fiddler sehen, ist für Sockel:

Plätzchen/Login

Authorization: Basic <snip>== 

Entity

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

Und für Textview:

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

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

Beachten Sie, dass Sie POST das Fleisch ld 'attachment = @ < Dateiname>'. Für Formulardaten ist der Feldname auch 'Anhang', dann 'Dateiname = < Dateiname>' (ohne '@') und schließlich der Dateiinhalt.

Ich denke, CURL soll das alles nur für Sie tun, magisch basierend auf der Verwendung der '@' - Syntax und Angabe eines Pfades zu einer Datei auf Ihrem lokalen Rechner. Aber ohne das magische Verhalten zu kennen, ist es schwer zu verstehen, was wirklich passiert.

Zum Beispiel in C# sieht es wie folgt aus:

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

danke für die Antwort. :) – TechCare99

+0

hey hast du jemals mailgun web api verwendet .. ich bin ein bisschen problem beim senden von anhang mit web api – therealprashant

7

Ich weiß, das ist alt, aber ich habe gerade in dieses Problem und diese Seite ist so ziemlich das einzige Info, die ich im Internet finden . Ich hoffe also, dass dies jemand anderem hilft. Nachdem ich mit dem MailGun-Support gesprochen habe, habe ich Folgendes mit der aktuellen API gefunden.

Zyklen durch eine Reihe von Null bis n-Attachment-Dateien:

$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

um zu verdeutlichen, dieses beispiel ist nicht verwenden composer wie für die MailGun SDK erforderlich ist, dies ist der Zugriff auf die MailGun API über PHP/cURL – nzmuzzer

+0

Dies erfordert PHP 5.5 oder höher (daher der Grund, warum es bisher nicht als Lösung aufgefasst wurde). – bart

+0

einzige Lösung, die für mich ohne SDK funktioniert – baku

0

Anhangdatei hinzufügen:

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

Thsi für mich gearbeitet:

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

ich auf diese stecken geblieben Problem für eine Weile und die Antworten hier haben mir geholfen, aber es gibt etwas, auf das ich stieß, das noch nicht erwähnt wird.

Ich hatte meine POST-Parameter mit einem leeren/NULL 'cc' Wert gesendet, wie zum Beispiel: $post_data['cc'] = NULL;. Dies hinderte mich nicht daran, Text-E-Mails (keine Anhänge) zu senden, aber es verursachte Probleme beim Senden einer E-Mail mit einem Anhang. Das Entfernen des leeren cc von meinem Array löste einen Teil des Problems.

Zusätzlich habe ich http_build_query verwendet, bevor ich meine Daten per PHP curl gepostet habe, und das hat verhindert, dass meine E-Mail mit Anhang erfolgreich versendet wurde.

Das Entfernen der leeren cc und http_build_query löste dies für mich. Vielleicht ein ungewöhnlicher Fall, aber für den Fall, dass es hilfreich für jemanden ist, der das gleiche Problem hat.