2013-01-09 10 views
10

Mam do czynienia z problemem, gdy poczta posiadająca załącznik wysłany za pomocą pistoletu pocztowego. Jeśli ktoś to zrobił, odpowiedz. To jest mój kod ...Mailgun Wysłane mail Z załącznikiem

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

(Użyłem moje ustawienia mailgun)

otrzymuję wiadomości e-mail bez przywiązania. Jeśli użyję ścieżki URL, wyświetli się adres URL zamiast załącznika.

Odpowiedz

5

Trzeba zmienić ostatni parametr w następujący sposób: attachment[1]' => '@aaa.rar

Mamy kilka próbek w naszej dokumentacji dla tego przypadku użycia. Po prostu kliknij PHP na górnym pasku, aby zmienić język. http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

Nie wahaj się wysłać do nas maila z pytaniami na adres [email protected] Zawsze chętnie służymy pomocą.

+0

prostu zapomniał @ ... thanx – TechCare99

+1

twoje przykłady wymagają kompozytora –

+2

@ user1964269 może mieć bezpośredni związek przywiązanie zamiast lokalnego pliku? na przykład jak 'attachment [1] '=>' @http: // example.com/direc/file/path/file.jpg'? –

4

Dokumentacja nie mówi tego wyraźnie, ale sam załącznik jest dołączany do żądania jako dane wieloczęściowe/formularze.

Najlepszym sposobem debugowania tego, co się dzieje, jest użycie Skrzypka do obejrzenia żądania. Upewnij się, że akceptujesz certyfikat główny Fiddlera, inaczej żądanie nie zostanie wydane z powodu błędu SSL.

Co warto zobaczyć w Skrzypek jest dla nagłówków:

Cookies/Zaloguj

Authorization: Basic <snip>== 

Podmiot

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

I TextView:

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

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

pamiętać, że POST the fie ld 'attachment = @ < nazwa pliku>'. W przypadku danych formularzy nazwa pola to także "załącznik", a następnie "filename = < nazwa pliku>" (bez "@") i na końcu zawartość pliku.

Myślę, że CURL ma to zrobić po prostu magicznie w oparciu o składnię '@' i określenie ścieżki do pliku na komputerze lokalnym. Ale nie znając magicznego zachowania, trudno jest pojąć, co się naprawdę dzieje.

Na przykład w C# wygląda następująco:

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

dziękuję za odpowiedź. :) – TechCare99

+0

hej, czy kiedykolwiek używałeś web api mailgun ... mam problem z wysłaniem załącznika za pomocą web api – therealprashant

7

Zdaję sobie sprawę, to jest stary, ale ja po prostu uruchomić do tego problemu i ta strona jest dość dużo tylko informacji można znaleźć w sieci . Mam więc nadzieję, że pomoże to komuś innemu. Po rozmowie z obsługą MailGun znalazłem następujące prace z bieżącym API.

Przechodzi tablicy od zera do n plików Załącznik:

$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

Aby wyjaśnić, ten przykład NIE używa kompozytu, jak jest to wymagane dla pakietu SDK MailGun, to uzyskuje dostęp do API MailGun przez PHP/cURL – nzmuzzer

+0

Wymaga to PHP w wersji 5.5 lub wyższej (stąd powód, dla którego nie został wcześniej opracowany jako rozwiązanie). – bart

+0

jedyne rozwiązanie, które działało dla mnie bez SDK – baku

0

Dodaj plik załącznik:

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

Thsi pracował dla mnie:

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

utknąłem na ten temat problem na chwilę i odpowiedzi tutaj pomogły mi, ale jest coś, co natknąłem się, co nie jest jeszcze wspomniane.

byłem wysyłanie moich parametrów POST z pustym/null „CC” wartości, takich jak: $post_data['cc'] = NULL;. Nie przeszkodziło mi to w wysyłaniu wiadomości tekstowych (bez załącznika), ale powodowało problemy podczas wysyłania wiadomości e-mail z załącznikiem. Usunięcie pustej tablicy cc z mojej tablicy rozwiązało część problemu.

Dodatkowo używałam http_build_query przed opublikowaniem moich danych przez curl PHP, co uniemożliwiło wysłanie wiadomości e-mail z załącznikami.

Usunięcie pustych cc i http_build_query rozwiązało to dla mnie. Może niezbyt często, ale publikuje na wypadek, gdyby był pomocny dla kogoś, kto ma ten sam problem.