12

当使用 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);

(我已经使用了我的 mailgun 设置)

我收到没有附件的电子邮件。如果我使用 URL 路径,它会显示 URL 而不是附件。

4

9 回答 9

9

我意识到这是旧的,但我刚刚遇到了这个问题,这个页面几乎是我在网上可以找到的唯一信息。所以我希望这对其他人有帮助。在与 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);
于 2016-03-16T07:06:53.483 回答
7

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

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

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

于 2013-01-09T18:13:07.330 回答
4

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

调试正在发生的事情的最佳方法是使用 Fiddler 来观察请求。确保您接受 Fiddler 的根证书,否则由于 SSL 错误,请求不会发出。

您应该在 Fiddler 中看到的是 Headers:

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>

请注意,您发布字段“附件=@<文件名>”。对于表单数据,字段名称也是“附件”,然后是“文件名=<文件名>”(没有“@”),最后是文件内容。

我认为 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);
}
于 2013-03-21T04:57:19.680 回答
3

我在这个问题上停留了一段时间,这里的答案对我有所帮助,但是我遇到了一些尚未提及的事情。

我一直在发送带有空白/NULL 'cc' 值的 POST 参数,例如:$post_data['cc'] = NULL;. 这并没有阻止我发送文本电子邮件(无附件),但在发送带有附件的电子邮件时确实会导致问题。从我的阵列中删除空白cc解决了部分问题。

此外,在通过 PHP curl 发布我的数据之前,我一直在使用http_build_query它,这导致我的带有附件的电子邮件无法成功发送。

删除空的cchttp_build_query为我解决了这个问题。也许是一个不常见的情况,但张贴以防万一它对遇到同样问题的人有帮助。

于 2017-01-15T21:43:37.763 回答
0

添加附件文件:

"attachment[1]" = "@$_FILES['careerDocument']['tmp_name'];filename=test.jpg".
($contentType ? ';type=' . $contentType : '' ) ;
curl_setopt($ch, CURLOPT_POSTFIELDS, ($message));
于 2016-05-11T12:02:54.927 回答
0

这对我有用:

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



 ?>
于 2016-06-24T07:02:04.917 回答
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));
于 2018-03-30T15:42:38.567 回答
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']
  ]) );
于 2018-04-10T07:24:30.287 回答
0

这对我有用。我已经在附件数组中传递了附件文件 URL。现在我可以在电子邮件中发送多个附件。

$attachment = [ 0 => 'https://www.crm.truerater.com/public/assets/client_upload_images/1634327873.png', 1 => 'https://www.crm.truerater.com/public/assets/client_upload_images/1634327873.png' ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v3/truerater.com/messages');
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    $post = array(
        'from' =>  $mailfromname .'<'.$mailfrom.'>',
        'to' => $toname.'<'.$to.'>',
        'cc' => '',
        'bcc' => '',
        'subject' => $subject,
        'html'=>$html,
        'text'=>$text,
        'o:tracking'=>'yes',
        'o:tracking-clicks'=>'yes',
        'o:tracking-opens'=>'yes',
        'o:tag'=>$tag,
        'h:Reply-To'=>$replyto,
    );
    if(sizeOf($attachment) > 0){
        $i=0;
        foreach ($attachment as $attach){
            $attachPath = substr($attach, strrpos($attach, '/public/') + 1);
            $post['attachment['.$i.']'] = curl_file_create($attach, '', substr($attachPath, strrpos($attachPath, '/') + 1));
            $i=$i+1;
        }
    }
    $headers_arr = array("Content-Type:multipart/form-data");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    curl_setopt($ch, CURLOPT_USERPWD, 'api' . ':' . $key);
    curl_setopt($ch, CURLOPT_HEADER, $headers_arr);
    curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    $result = curl_exec($ch);
    
    
    if (curl_errno($ch)) {
        $result = curl_error($ch);
        \Log::info($result);
    }
    else{
        $result = json_decode($result,true);
    }
    curl_close($ch);
   
    \Log::info($result);
    return $result;
于 2021-12-29T21:30:55.313 回答