За последние 24 часа нас посетили 25213 программистов и 1613 роботов. Сейчас ищут 1239 программистов ...

Не могу побороть кодировку при получении тела письма imap php

Тема в разделе "Сделайте за меня", создана пользователем Pelsh, 12 окт 2024 в 00:18.

  1. Pelsh

    Pelsh Новичок

    С нами с:
    30 янв 2024
    Сообщения:
    2
    Симпатии:
    0
    Добрый день!
    Есть задача получить из почтового ящика на mail.ru письма в виде (заголовок - тело письма)
    С заголовком разобрался, а вот с телом письма никак... Какие-то письма приходят нормально, какие-то получаю кракозябрами...
    Помогите!

    Вот мой код:
    PHP:
    1. <?php
    2. header("Content-Type: text/html; charset=utf-8");
    3. function check_utf8($charset){
    4.   if(strtolower($charset) != "utf-8"){
    5.       return false;
    6.    }
    7.    return true;
    8. }
    9.  
    10. function convert_to_utf8($in_charset, $str){
    11.    return iconv(strtolower($in_charset), "utf-8", $str);
    12. }
    13.  
    14. function get_imap_title($str){
    15.   $mime = imap_mime_header_decode($str);
    16.   $title = "";
    17.   foreach($mime as $key => $m){
    18.         if(!check_utf8($m->charset)){
    19.             $title .= convert_to_utf8($m->charset, $m->text);
    20.      }else{
    21.           $title .= $m->text;
    22.       }
    23.    }
    24.    return $title;
    25. }
    26.  
    27. function recursive_search($structure){
    28.  
    29.    $encoding = "";
    30.  
    31.    if($structure->subtype == "HTML" ||
    32.        $structure->type == 0){
    33.  
    34.        if($structure->parameters[0]->attribute == "charset"){
    35.  
    36.           $charset = $structure->parameters[0]->value;
    37.       }
    38.  
    39.        return array(
    40.            "encoding" => $structure->encoding,
    41.          "charset"  => strtolower($charset),
    42.             "subtype"  => $structure->subtype
    43.        );
    44.   }else{
    45.  
    46.       if(isset($structure->parts[0])){
    47.  
    48.          return recursive_search($structure->parts[0]);
    49.        }else{
    50.  
    51.           if($structure->parameters[0]->attribute == "charset"){
    52.  
    53.               $charset = $structure->parameters[0]->value;
    54.           }
    55.  
    56.            return array(
    57.                "encoding" => $structure->encoding,
    58.              "charset"  => strtolower($charset),
    59.                 "subtype"  => $structure->subtype
    60.            );
    61.       }
    62.    }
    63. }
    64.  
    65. function structure_encoding($encoding, $msg_body){
    66.  
    67. switch((int) $encoding){
    68.  
    69.         case 4:
    70.          $body = imap_qprint($msg_body);
    71.          break;
    72.  
    73.       case 3:
    74.          $body = imap_base64($msg_body);
    75.          break;
    76.  
    77.       case 2:
    78.          $body = imap_binary($msg_body);
    79.          break;
    80.  
    81.       case 1:
    82.          $body = imap_8bit($msg_body);
    83.            break;
    84.  
    85.       case 0:
    86.          $body = $msg_body;
    87.           break;
    88.  
    89.         default:
    90.             $body = "";
    91.            break;
    92.   }
    93.  
    94.    return $body;
    95. }
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    367
    Симпатии:
    67
    Адрес:
    Бавария, Германия
    Добрый день!
    У Вас м.б.
    body остаётся в base64 см.
    https://github.com/dokuwiki/dokuwiki/issues/3768
    Удачи!
     
    #2 Vladimir Kheifets, 14 окт 2024 в 10:55
    Последнее редактирование: 14 окт 2024 в 11:01