Mailgun已发送邮件附件

时间:2013-01-09 06:42:12

标签: php email email-attachments mailgun

当使用mailgun发送附件的邮件时,我面临问题。 如果有人做过这件事,请回复。 这是我的代码......

$mg_api = 'key-3ax6xnjp29jd6fds4gc373sgvjxteol0';
$mg_version = 'api.mailgun.net/v2/';
$mg_domain = "samples.mailgun.org";
$mg_from_email = "info@samples.com";
$mg_reply_to_email = "info@samples.org";

$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 <' . 'aaa@aaa.com' . '>',
                'to'        => 'test.client91@gmail.com',
                '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而不是附件。

8 个答案:

答案 0 :(得分: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);

答案 1 :(得分:5)

您需要按以下方式更改最后一个参数: attachment[1]' => '@aaa.rar

我们在这个用例的文档中有一些示例。只需单击顶部栏中的PHP即可切换语言。 http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

如有任何问题,请随时向我们发送电子邮件至support@mailgunhq.com。我们很乐意提供帮助。

答案 2 :(得分:3)

文档没有明确说明,但附件本身作为multipart / form-data捆绑到请求中。

调试正在进行的操作的最佳方法是使用Fiddler来查看请求。确保您接受Fiddler的根证书,否则由于SSL错误,请求将不会发出。

你应该在Fiddler中看到的是标题:

Cookies /登录

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 = @&lt; filename&gt;'。对于表单数据,字段名称也是“附件”,然后是'filename =&lt; filename&gt;' (没有'@'),最后是文件内容。

我认为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);
}

答案 3 :(得分:1)

我在这个问题上停留了一段时间,这里的答案对我有帮助,但是我遇到的东西还没有提到。

我一直在发送我的POST参数,空白/空白&#39; cc&#39;值,例如:echo "8" | sed -nf <(sed 's#\(.*\)=\(.*\)#/\2/ s/.*/Found at \1/p#' file) 。这并不妨碍我发送文本电子邮件(没有附件),但在发送带附件的电子邮件时确实会出现问题。从我的阵列中删除空白$post_data['cc'] = NULL;解决了部分问题。

此外,在通过PHP curl发布我的数据之前,我一直在使用cc,这阻止了我的电子邮件附件被成功发送。

删除空http_build_querycc已解决此问题。也许是一个不常见的案例,但如果对有相同问题的人有帮助,则张贴。

答案 4 :(得分:0)

添加附件:

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

答案 5 :(得分:0)

Thsi为我工作:

<?php

$filePath='@Wealth_AC_AMF.pdf';

$curl_post_data=array(
    'from'    => 'Excited User <noreply@test.com>',
    'to'      => 'test@gmail.com',
    '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);



 ?>

答案 6 :(得分:0)

这对我有用......

class Email {

    function send($array, $file_array) {
        $mgClient = new Mailgun('YOUR_MAILGUN_API_KEY');
        $domain = "mg.YOUR_DOMAIN.com";
        $result = $mgClient->sendMessage($domain, $array, array('attachment' => $file_array));
        return $result;
    }   
}

$array = array(
    'from'    => 'From <from@from.com>',
    'to'      => 'To <to@to.com>',
    'subject' => 'Your Subject',
    'html'    => '<h1>Hooray!</h1>',
);

$file_array = array('/var/www/scripts/test.csv');
echo json_encode($Email::send($array, $file_array));

答案 7 :(得分:0)

这对我来说很好。

require '../../vendor/autoload.php';
use Mailgun\Mailgun;

# Instantiate the client.
$mgClient = new Mailgun('key-b0e955');
$domain = "domain.com";

# Make the call to the client.
$result = $mgClient->sendMessage("$domain",
  array('from'    => '<postmaster@domain.com>',
        'to'      => '<test@gmail.com>',
        'subject' => 'csv file',
        'text' => 'csv test file'
       ),array('attachment' => [
    ['remoteName'=>'student.csv', 'filePath'=>'/form/stu.csv']
  ]) );