Retrieve Attachment from Mailgun Form Post PHP

2019-06-18 05:22发布

问题:

How do i retrieve and save the attachment sent to me via a form post with Mailgun's POST

The following the some of the parameters

attachment-1    
{:filename=>"crabby.gif", :type=>"image/gif", :name=>"attachment-1", :tempfile=>#<Tempfile:/tmp/RackMultipart20140707-2-slsrkh>, :head=>"Content-Disposition: form-data; name=\"attachment-1\"; filename=\"crabby.gif\"\r\nContent-Type: image/gif\r\nContent-Length: 2785\r\n"}

attachment-2    
{:filename=>"attached_файл.txt", :type=>"text/plain", :name=>"attachment-2", :tempfile=>#<Tempfile:/tmp/RackMultipart20140707-2-sudxuf>, :head=>"Content-Disposition: form-data; name=\"attachment-2\"; filename=\"attached_файл.txt\"\r\nContent-Type: text/plain\r\nContent-Length: 32\r\n"}

Content-Type    
multipart/mixed; boundary="------------020601070403020003080006"

回答1:

So I know this is a year late, but I had the same problem and figured out how to download the attachments. The files in the post are in stored in the environmental variable $_FILES. The information for each file will look something like:

Array
(
    [attachment-1] => Array
        (
            [name] => ATextFile.txt
            [type] => text/plain
            [tmp_name] => /tmp/php8zhmlU
            [error] => 0
            [size] => 70144
        )
)

The path to the file is stored in tmp_name, so in this case, /tmp/php8zhmlU is the full path to the file. move_uploaded_file will overwrite any existing files! To download all the attachments from the POST I wrote a function:

function download_attachments($pathToDownloadDirectory)
{
    foreach($_FILES as $file)
    {
        if($file['error'] == "0")
        {
            if(!(move_uploaded_file($file['tmp_name'], $pathToDownloadDirectory . $file['name'])))
            {
                return 0;
            }
        }
        else
        {
            return 0;
        }    
    }
    return 1;
}

download_attachments("/Full/Path/To/Some/Dir/");

Documentation for this top can be found here.



回答2:

  1. use store action from route session in order to obtain information about your email. (retrieving stored message
  2. json_decode "attachments" property in order to obtain information about your attachments
  3. get api key and use php library in order to use get api.

if you json decoded list of attachments is $files, you can do

$mgClient = new Mailgun('yourApiKey');

foreach ($files as $file){
    file_put_contents($file->name,$mgClient->get($file->url)->http_response_body);    
}

to download every attachment