Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I save email attachments to the server in PHP?

Tags:

php

email

mime

I've been battling PHP's email reading functions for the better part of two days. I'm writing a script to read emails from a mailbox and save any attachments onto the server. If you've ever done something similar, you might understand my pain: PHP doesn't play well with email!

I've connected to the POP3 server and I can iterate the files. Here's a rough outline of the code:

if (!$mbox = imap_open ("{myserver.com:110/pop3/notls}INBOX", "u", "p"))
    die ('Cannot connect/check mail! Exiting');

if ($hdr = imap_check($mbox)) 
    $msgCount = $hdr->Nmsgs;
else 
    die ("Failed to get mail");

foreach ($overview as $message) {
    $msgStruct = imap_fetchstructure($mbox, $message->msgno);

    // if it has parts, there are attachments that need reading
    if ($msgStruct->parts) {
        foreach ($msgStruct->parts as $key => $part) {
            switch (strtoupper($part->subtype)) {
                case 'GIF': case 'JPEG':case 'PNG':

                    //do something - but what?!

                    break;
            }
        }
    }
}

I've marked where I'm stuck. I can use imap_fetchbody($mbox, $message->msgno, $key+1) but that gets me a bunch of data like this:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8S
EhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEU
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAAR
CAHiAi0DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
...

I'm lead to believe that this is MIME data. I need it as an image! I've seen several classes bombing around the internet that claim to do the required wizardry. I can't get any of them to work. I don't understand why I'm finding this so hard!

In short, I'm looking for something that can turn a raw MIME string into real data.

like image 610
Oli Avatar asked Oct 02 '08 14:10

Oli


4 Answers

I found a quick guide how to treat emails with PHP: here.

At the bottom of that page there's a attachment-body echo:

if (substr($ContentType,0,4) == "text") {
echo imap_qprint($fileContent);
} else {
echo imap_base64($fileContent);
}

I guess this is what you might need...

(edit: in your case if it's image always you can skip the if part. And of course, save the file instead of echoing it:)

like image 159
kender Avatar answered Sep 28 '22 04:09

kender


MIME data is base-64 encoded, so I think you should be able to decode it using base64_decode

like image 20
Ben Avatar answered Sep 28 '22 03:09

Ben


you can use the imap_base64 function and just output that to a file, or use imap_savebody

like image 27
Cetra Avatar answered Sep 28 '22 03:09

Cetra


Zend framework contains Zend_Mail, which should make reading mail messages much easier, and Zend_Mime, which I believe can parse a multipart mime message into a sensible data structure.

http://framework.zend.com/manual/en/zend.mail.read.html

like image 44
Joeri Sebrechts Avatar answered Sep 28 '22 04:09

Joeri Sebrechts