tags:

views:

3433

answers:

5

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.

+1  A: 

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

Ben
+1  A: 

Hi Dr Nick (i just had to)

But yes, MIME data is base 64 encoded. So ben is correct.

Ólafur Waage
+2  A: 

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

kender
Worked like a charm. Yeah I'm already doing the content-type-detection (with my switch-statement) so I only needed the imap_base64.
Oli
+1  A: 

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

Cetra
imap_savebody (from my recent experience) saves the encoded data (just as if you ran fetchbody)
Oli
+1  A: 

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

Joeri Sebrechts
I'd love to be able to deploy on the Zend Framework but hosting limitations restrict it. It's a real pity because the mail-reading functionality in plain PHP is twisted beyond all logical comprehension.
Oli
Is it the size of the framework that's holding you back? Our web apps bundle zend framework for when it's not available on the customer's web server.
Joeri Sebrechts