0

Connect to my e-mail account to read the messages and download the attachments to the server by PHP code

I have used so far with the third code that appears here Indeed [from GuRu] Here is a copy of the code if it can make it easier for members.

    <?php

set_time_limit(3000); 

/* connect to gmail with your credentials */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'YOUR_USERNAME'; 
$password = 'YOUR_PASSWORD';

/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect 
to Gmail: ' . imap_last_error());

$emails = imap_search($inbox, 'FROM "abc@gmail.com"');

/* if any emails found, iterate through each email */
if($emails) {

    $count = 1;

    /* put the newest emails on top */
    rsort($emails);

    /* for every email... */
    foreach($emails as $email_number) 
    {

    /* get information specific to this email */
    $overview = imap_fetch_overview($inbox,$email_number,0);

    $message = imap_fetchbody($inbox,$email_number,2);

    /* get mail structure */
    $structure = imap_fetchstructure($inbox, $email_number);

    $attachments = array();

    /* if any attachments found... */
    if(isset($structure->parts) && count($structure->parts)) 
    {
        for($i = 0; $i < count($structure->parts); $i++) 
        {
            $attachments[$i] = array(
                'is_attachment' => false,
                'filename' => '',
                'name' => '',
                'attachment' => ''
            );

            if($structure->parts[$i]->ifdparameters) 
            {
                foreach($structure->parts[$i]->dparameters as $object) 
                {
                    if(strtolower($object->attribute) == 'filename') 
                    {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['filename'] = $object->value;
                    }
                }
            }

            if($structure->parts[$i]->ifparameters) 
            {
                foreach($structure->parts[$i]->parameters as $object) 
                {
                    if(strtolower($object->attribute) == 'name') 
                    {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['name'] = $object->value;
                    }
                }
            }

            if($attachments[$i]['is_attachment']) 
            {
                $attachments[$i]['attachment'] = imap_fetchbody($inbox, 
$email_number, $i+1);

                    /* 3 = BASE64 encoding */
                    if($structure->parts[$i]->encoding == 3) 
                    { 
                        $attachments[$i]['attachment'] = 
base64_decode($attachments[$i]['attachment']);
                    }
                    /* 4 = QUOTED-PRINTABLE encoding */
                    elseif($structure->parts[$i]->encoding == 4) 
                    { 
                        $attachments[$i]['attachment'] = 
quoted_printable_decode($attachments[$i]['attachment']);
                    }
                }
            }
        }

    /* iterate through each attachment and save it */
    foreach($attachments as $attachment)
    {
        if($attachment['is_attachment'] == 1)
        {
            $filename = $attachment['name'];
            if(empty($filename)) $filename = $attachment['filename'];

            if(empty($filename)) $filename = time() . ".dat";
            $folder = "attachment";
            if(!is_dir($folder))
            {
                 mkdir($folder);
            }
            $fp = fopen("./". $folder ."/". $email_number . "-" . 
$filename, "w+");
                fwrite($fp, $attachment['attachment']);
                fclose($fp);
            }
        }
    }
} 

/* close the connection */
imap_close($inbox);

echo "all attachment Downloaded";

?>

Attachment whose name in English or in numbers comes in wonderful! But if the name is in Hebrew, the file name comes encoded like this: 1424 - =? UTF-8? B? 15TXntec16bXlCDXoteR15XXqCDXkNek15zXkdeQ15XXnSDXkg ==? = =? UTF-8? B? 150g16jXkSDXkteV15DXnNee158yICgxKS5qcGc =? =

I've been searching for a few days at any time of the day, I've tried lots of codes. In the meantime, I don't know what to do!

(Maybe I'm just not putting the fixes in the right place? Anyway at the moment I'm really desperate and would be very happy for any practical solution if someone could help please.)

Here are some attempts:

Sending an email with attachment displays in encoded format PHP I think this is exactly the title of my problem. But I couldn't figure out the answers in a way that I could incorporate in my code or the code offered here

setting encoding for attachment in phpmailer While it's not exactly related, it might help. Anyway, I couldn't make it

Reload this Page PHP: Send email with attachment and UTF8 in filenames

Base 64 Attachment in PHP Mail() not working While it does offer a code, it is a code for sending and receiving emails. How can this help me?

Sending MIME-encoded email attachments with utf-8 filenames

Same question

PHP - Convert string to unicode I couldn't integrate that into the code

How to read the Content Type header and convert into utf-8 while Gmail IMAP has utf8 and Outlook has ISO-8859-7? Didn't help me

And that's just part ... I would be very grateful for any idea Thank you!!

chaim
  • 9
  • 3

1 Answers1

0

After a lot of searches and attempts, this line saved the situation: It is brought by Mister jlh on this page:

iconv_mime_decode($str, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8')

I put it here:

                $filename = $attachment['name'];
                    $filename = iconv_mime_decode($filename, ICONV_MIME_DECODE_CONTINUE_ON_ERROR, 'UTF-8');

            if(empty($filename)) $filename = $attachment['filename'];

I hope it helps to do more good things

chaim
  • 9
  • 3