简体   繁体   English

Mailgun 发送带有附件的邮件

[英]Mailgun Sent mail With attachment

I am facing issue when mail having attachment sent using mailgun.我在使用 mailgun 发送带有附件的邮件时遇到问题。 If anyone has done this thing please reply.如果有人做过这件事,请回复。 This is my code...这是我的代码...

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

(I have used my mailgun settings) (我已经使用了我的 mailgun 设置)

I receive the email without the attachment.我收到没有附件的电子邮件。 If I use the URL path it displays the URL instead of the attachment.如果我使用 URL 路径,它会显示 URL 而不是附件。

I realise this is old but I've just run into this problem and this page is pretty much the only info I can find on the net. 我意识到这已经老了,但我刚遇到这个问题,这个页面几乎是我能在网上找到的唯一信息。 So I hope this will assist someone else. 所以我希望这会帮助别人。 After talking to MailGun support I've found the following works with the current API. 在与MailGun支持人员交谈之后,我发现以下适用于当前的API。

Cycles through an array of zero to n attachment files: 循环遍历零到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);

You need to change the last parameter in the following way: attachment[1]' => '@aaa.rar 您需要以下列方式更改最后一个参数: attachment[1]' => '@aaa.rar

We have some samples in our documentation for this use case. 我们在这个用例的文档中有一些示例。 Just click PHP in the top bar to switch the language. 只需单击顶部栏中的PHP即可切换语言。 http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http http://documentation.mailgun.net/user_manual.html#examples-sending-messages-via-http

Please don't hesitate to send us an email with any questions to support@mailgunhq.com. 如有任何问题,请随时向我们发送电子邮件至support@mailgunhq.com。 We are always happy to help. 我们总是很乐意提供帮助。

The documentation doesn't say it explicitly, but the attachment itself is bundled into the request as multipart/form-data. 文档没有明确说明,但附件本身作为multipart / form-data捆绑到请求中。

The best way to debug what's going on is use Fiddler to watch the request. 调试正在进行的操作的最佳方法是使用Fiddler来查看请求。 Make sure you accept Fiddler's root certificate, or the request won't issue due to the SSL error. 确保您接受Fiddler的根证书,否则由于SSL错误,请求将不会发出。

What you should see in Fiddler is for Headers: 你应该在Fiddler看到的是Headers:

Cookies / Login Cookies /登录

Authorization: Basic <snip>==

Entity 实体

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

And for TextView: 对于TextView:

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

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

Note that you POST the field 'attachment=@<filename>'. 请注意,您发布字段'attachment = @ <filename>'。 For form-data, the field name is also 'attachment', then has 'filename=<filename>' (without the '@') and finally the file contents. 对于表单数据,字段名称也是“附件”,然后是“filename = <filename>”(不带“@”),最后是文件内容。

I think CURL is supposed to just do this all for you magically based on using the '@' syntax and specifying a path to a file on your local machine. 我认为CURL应该基于使用'@'语法并指定本地机器上文件的路径来神奇地为你做这一切。 But without knowing the magic behavior it's hard to grok what's really happening. 但是,如果不了解魔法行为,就很难理解真正发生的事情。

For example, in C# it looks like this: 例如,在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);
}

I got stuck on this issue for a while and the answers here helped me, but there is something I came across which is not mentioned yet. 我在这个问题上停留了一段时间,这里的答案对我有帮助,但是我遇到的东西还没有提到。

I had been sending my POST parameters with a blank/NULL 'cc' value, such as: $post_data['cc'] = NULL; 我一直在发送带有空白/ NULL“cc”值的POST参数,例如: $post_data['cc'] = NULL; . This did not prevent me from sending text emails (no attachment), but it did cause problems when sending an email with an attachment. 这并不妨碍我发送文本电子邮件(没有附件),但在发送带附件的电子邮件时确实会出现问题。 Removing the blank cc from my array resolved part of the issue. 从我的阵列中删除空白cc解决了部分问题。

Additionally I had been using http_build_query before posting my data via PHP curl and that prevented my email with attachment from being sent successfully. 另外,我在使用PHP curl发布数据之前一直使用http_build_query ,这阻止了我的电子邮件附件被成功发送。

Removing the empty cc and http_build_query resolved this for me. 删除空cchttp_build_query为我解决了这个问题。 Maybe an uncommon case, but posting in case it is helpful for someone who has the same issue. 也许是一个不常见的案例,但如果对有相同问题的人有帮助,则张贴。

Add attachment file: 添加附件文件:

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

Thsi worked for me: 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);



 ?>

This worked for me... 这对我有用......

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

This is working fine for me. 这对我来说很好。

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']
  ]) );

This works for me.这对我有用。 I have passed the attachment file URL in the attachment array.我已经在附件数组中传递了附件文件 URL。 now I can send multiple attachments in email.现在我可以在电子邮件中发送多个附件。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM