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

excitingwonderlakeInternet και Εφαρμογές Web

13 Δεκ 2013 (πριν από 3 χρόνια και 6 μήνες)

84 εμφανίσεις

GEOCHET
10.3k
9
32
54
Oli
26.6k
9
60
111
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 pla\ 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
)
 
{
            
sZitch
 
(
strtoupper
(
$part
­>
subtype
))
 
{
                
case
 
'GIF'
:
 
case
 
'JPEG'
:
case
 
'PNG'
:
                    
//do something ­ but Zhat?!
                    
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
EhEPERETFhZXE[QaFRERGCEYGh0dH[8fE[ciJCIeJBZeH[7
/
2wBDAQUFBQcGBw4ICA4eFBEU
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7
/
wAAR
CAHiAi0DASIAAhEBA[EB
/
8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL
/
8QAtRAA
AgEDAZIEAZUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhB\J[FDKBkaEII0K[ZRVS0fAkM2J\ggkK
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.
php
 
email
 
mime
edited 
Oct 2 '08 at 14:29
asked 
Oct 2 '08 at 14:26
75% accept rate
have you checked what's the attachment encoding?
 – 
kender
 
Oct 2 '08 at 14:28
How can I save email attachments to the server in PHP?
6 Answers
kender
4,732
1
20
51
Ben
4,048
4
24
61
Ïlafur Waage
27.3k
3
36
96
Cetra
1,544
5
13
hey can you post a more complete snippet? i can't seem to get it to work bc im not sure where $overview is
coming from
 – 
st4ck0v3rfl0w
 
Feb 19 '10 at 2:58
feedback
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:)
answered 
Oct 2 '08 at 14:32
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
 
Oct 2 '08 at 14:42
feedback
MIME data is base­64 encoded, so I think you should be able to decode it using base64_decode
answered 
Oct 2 '08 at 14:28
feedback
Hi Dr Nick (i just had to)
But yes, MIME data is base 64 encoded. So ben is correct.
answered 
Oct 2 '08 at 14:29
feedback
you can use the 
imap_base64
 
function 
and just output that to a file, or use 
imap_savebody
answered 
Oct 2 '08 at 14:35
imap_savebody (from my recent experience) saves the encoded data (just as if you ran fetchbody)
 – 
Oli
 
Oct 2
'08 at 14:38
feedback
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
5,207
8
23
Hassan
6
1
http://framework.zend.com/manual/en/zend.mail.read.html
answered 
Oct 2 '08 at 14:35
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
 
Oct 2 '08 at 14:39
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
 
Oct 2 '08 at 16:04
feedback
I have the same problem as yours. I found some good article, and I think it might help you
http://www.linuxscope.net/articles/mailAttachmentsPHP.html
 enjoy it :)
answered 
Sep 15 at 12:43
feedback
Not the answer \ou're looking for?
Browse other questions tagged
php

email

mime
or
ask \our own question
.
question feed