Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP IMAP decoding messages

Tags:

php

imap

I have emails sent via base64 encoding and 8bit encoding. I was wondering how I could check the encoding of the message using imap_fetchstructure (been doing this for about two hours, so lost) and then decode it properly.

Gmail and Mailbox (app on iOS) are sending it as 8bit while Windows 8's Mail app is sending it as base64. Either way, I need to decode whether its 8bit or base64 by detecting what type of encoding it has used.

Using PHP 5.1.6 (yes, I should update, been busy).

I really have no code to show. This is all I have:

<?php
$hostname = '{********:993/imap/ssl}INBOX';
$username = '*********';
$password = '******';

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

$emails = imap_search($inbox,'ALL');

if($emails) {

    $output = '';

    rsort($emails);

    foreach($emails as $email_number) {

        $overview = imap_fetch_overview($inbox,$email_number,0);
        $message = imap_fetchbody($inbox,$email_number,2);
        $struct = imap_fetchstructure($inbox, $email_number);

        $output.= '<div class="toggle'.($overview[0]->seen ? 'read' : 'unread').'">';
        $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
        $output.= '<span class="from">'.$overview[0]->from.'</span>';
        $output.= '<span class="date">on '.$overview[0]->date.'</span>';
        $output.= '</div>';

        /* output the email body */
        $output.= '<div class="body">'.$message.'</div>';
    }

    echo $output;
} 

imap_close($inbox);
?>
like image 835
alexpja Avatar asked Mar 21 '13 05:03

alexpja


3 Answers

imap_bodystruct() or imap_fetchstructure() should return this info to you. The following code should do exactly what you're looking for:

<?php
$hostname = '{********:993/imap/ssl}INBOX';
$username = '*********';
$password = '******';

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

$emails = imap_search($inbox,'ALL');

if($emails) {
    $output = '';
    rsort($emails);

    foreach($emails as $email_number) {
        $overview = imap_fetch_overview($inbox,$email_number,0);
        $structure = imap_fetchstructure($inbox, $email_number);

        if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) {
            $part = $structure->parts[1];
            $message = imap_fetchbody($inbox,$email_number,2);

            if($part->encoding == 3) {
                $message = imap_base64($message);
            } else if($part->encoding == 1) {
                $message = imap_8bit($message);
            } else {
                $message = imap_qprint($message);
            }
        }

        $output.= '<div class="toggle'.($overview[0]->seen ? 'read' : 'unread').'">';
        $output.= '<span class="from">From: '.utf8_decode(imap_utf8($overview[0]->from)).'</span>';
        $output.= '<span class="date">on '.utf8_decode(imap_utf8($overview[0]->date)).'</span>';
        $output.= '<br /><span class="subject">Subject('.$part->encoding.'): '.utf8_decode(imap_utf8($overview[0]->subject)).'</span> ';
        $output.= '</div>';

        $output.= '<div class="body">'.$message.'</div><hr />';
    }

    echo $output;
}

imap_close($inbox);
?>
like image 100
Garry Welding Avatar answered Oct 30 '22 04:10

Garry Welding


You can look at this example.

Imap/Imap

Here's code snippet

switch ($encoding) {
    # 7BIT
    case 0:
        return $text;
    # 8BIT
    case 1:
        return quoted_printable_decode(imap_8bit($text));
    # BINARY
    case 2:
        return imap_binary($text);
    # BASE64
    case 3:
        return imap_base64($text);
    # QUOTED-PRINTABLE
    case 4:
        return quoted_printable_decode($text);
    # OTHER
    case 5:
        return $text;
    # UNKNOWN
    default:
        return $text;
}
like image 34
Felix Avatar answered Oct 30 '22 02:10

Felix


Returned Objects for imap_fetchstructure()

  1. encoding (Body transfer encoding)

Transfer encodings (may vary with used library)

0 7BIT 1 8BIT 2 BINARY 3 BASE64 4 QUOTED-PRINTABLE 5 OTHER

$s = imap_fetchstructure($mbox,$mid);
if ($s->encoding==3)
    $data = base64_decode($data);
like image 2
Ujwal Abhishek Avatar answered Oct 30 '22 04:10

Ujwal Abhishek