2013-03-21 11 views
11

Mam wiadomości e-mail wysyłane za pośrednictwem kodowania base64 i kodowania 8-bitowego. Zastanawiam się, w jaki sposób mogę sprawdzić kodowanie wiadomości przy użyciu imap_fetchstructure (robiłem to przez około dwie godziny, tak bardzo zagubiłem), a następnie dekodować poprawnie.Wiadomości dekodujące IMAP PHP

Gmail i skrzynka pocztowa (aplikacja na iOS) wysyłają ją w wersji 8-bitowej, a aplikacja Poczta systemu Windows 8 wysyła je jako base64. Tak czy inaczej, potrzebuję rozszyfrować, czy to 8-bitowy, czy też bazowy 64, wykrywając, jakiego rodzaju kodowania użył.

Używanie PHP 5.1.6 (tak, powinienem zaktualizować, był zajęty).

Naprawdę nie mam kodu do pokazania. To wszystko, co mam:

<?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); 
?> 
+0

są postacie nie przychodzi właściwie dla ciebie wiadomości e-mail? –

+0

@DeadMan E-maile z Poczty systemu Windows (aplikacja Metro w Win8) to base64, natomiast te pochodzące z innych aplikacji mają 8bit. – alexpja

+0

Wynik ['imap_fetchstructure()'] (http://php.net/manual/en/function.imap-fetchstructure.php) powinien mieć właściwość 'encoding'. To nie działa dla ciebie? – Phil

Odpowiedz

33

imap_bodystruct() lub imap_fetchstructure() powinna zwrócić te informacje do Ciebie. Poniższy kod należy zrobić dokładnie to, czego szukasz:

<?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); 
?> 
+0

Odszyfrował większość wiadomości, z wyjątkiem tych z Windows Mail w Windows 8. Mam nadzieję, że nikt tego nie używa. Dziękuję Ci! – alexpja

+0

Czy możesz to sprawdzić? (Http://stackoverflow.com/questions/39745784/how-to-fetch-to-and-cc-email-using-imap-php) Potrzebuję pomocy –

+0

Po co blokować 4 możliwych 6 kodowania do innego bloku obsługi quoted_printables? http://php.net/manual/en/function.imap-fetchstructure.php – Andrew

1

zwracanych przedmiotów do imap_fetchstructure()

  1. kodowania (kodowanie przeniesienie ciała)

kodowania transferowe (może się różnić w zależności używana biblioteka)

0 7BIT 1 8BIT 2 BINARNY 3 BASE64 4 quoted-printable 5 INNE

$s = imap_fetchstructure($mbox,$mid); 
if ($s->encoding==3) 
    $data = base64_decode($data); 
5

Można spojrzeć na ten przykład.

Imap/Imap

Oto fragment kodu

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; 
} 
+0

Musiałem użyć 'imap_qprint' na komunikatach ENC7BIT, aby wyświetlały się poprawnie. Możesz użyć [stałych PHP] (http://php.net/manual/en/function.imap-fetchstructure.php#refsect1-function.imap-fetchstructure-returnvalues) zamiast liczb: 'case ENC7BIT:' – Genjo

Powiązane problemy