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);
(Я использовал настройки электронной почты)
Я получаю электронное письмо без вложения. Если я использую URL-путь, он отображает URL-адрес вместо вложения.
Ответы
Ответ 1
Вам нужно изменить последний параметр следующим образом:
attachment[1]' => '@aaa.rar
У нас есть несколько примеров в нашей документации для этого варианта использования. Просто нажмите PHP в верхней строке, чтобы переключить язык.
http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http
Пожалуйста, не стесняйтесь присылать нам электронное письмо с любыми вопросами на [email protected] Мы всегда рады помочь.
Ответ 2
Я понимаю, что это старо, но я просто столкнулся с этой проблемой, и эта страница - это почти единственная информация, которую я могу найти в сети. Поэтому я надеюсь, что это поможет кому-то другому. После разговора с поддержкой 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);
Ответ 3
Документация не говорит об этом явно, но сама вставка вставляется в запрос как multipart/form-data.
Лучший способ отладить то, что происходит, - это использовать Fiddler для просмотра запроса. Убедитесь, что вы принимаете корневой сертификат Fiddler, или запрос не будет выдаваться из-за ошибки SSL.
Что вы должны увидеть в Fiddler для заголовков:
Файлы cookie/Логин
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>
Обратите внимание, что вы отправляете поле "attachment = @<filename> ". Для данных формы имя поля также является "вложением", затем имеет "filename = <filename> " (без "@" ) и, наконец, содержимое файла.
Я думаю, что CURL должен просто сделать это для вас магически, основываясь на использовании синтаксиса "@" и указав путь к файлу на вашей локальной машине. Но, не зная магического поведения, трудно понять, что на самом деле происходит.
Например, в С# он выглядит следующим образом:
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);
}
Ответ 4
Я застрял в этом вопросе некоторое время, и ответы здесь помогли мне, но есть кое-что, с чем я столкнулся, о котором еще не упоминалось.
Я отправлял свои параметры POST с пустым /NULL значением "cc", например: $post_data['cc'] = NULL;
. Это не помешало мне отправлять текстовые сообщения (без вложений), но это вызывало проблемы при отправке электронной почты с приложением. Удаление пустой cc
из моего массива разрешило часть проблемы.
Кроме того, я использовал http_build_query
, прежде чем отправлять свои данные через PHP curl, и это предотвратило успешное отправку моего письма с приложением.
Удаление пустых cc
и http_build_query
разрешило это для меня. Возможно, это необычный случай, но публикация в случае, если это полезно для тех, у кого есть такая же проблема.
Ответ 5
Добавить файл вложения:
"attachment[1]" = "@$_FILES['careerDocument']['tmp_name'];filename=test.jpg".
($contentType ? ';type=' . $contentType : '' ) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, ($message));
Ответ 6
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);
?>