Что делать с кодировкой тела сообщения imap_body?

Здравствуйте!

Требуется получить письма с Яндекс Почты и внести их в базу данных на своем сайте. Проблемы в том, что полученные письма закодированы и раскодировать и не получается.

Есть код:

//Открываю поток IMAP к почтовому ящику
$imap = imap_open("{imap.yandex.ru:993/imap/ssl}", "login", "password");
//Получаю сообщения, удовлетворяющие заданным критериям
$mails_id = imap_search($imap, 'ON "12-Dec-2020"', OP_READONLY);
//Получаю и вывожу тело выбранных сообщений
foreach ($mails_id as $num) {
  $body = imap_body($imap, $num);
  echo '<pre>';
  print_r($body);
  echo '</pre>';
}


В итоге получаю что-то типа:
--000000000000bc6bc505b640126c
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64
0JAg0YHRgtC+0LjRgiDQu9C4INC80L3QtSDQt9Cw0L ... //ЗАКОДИРОВАННЫЙ ТЕКСТ СООБЩЕНИЯ

--000000000000bc6bc505b640126c
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64
PGRpdiBkaXI9ImF1dG8iPtCQINGB0YLQvtC40YIg0LvQuCDQvNC90LUg0LfQsNC/ ... //ЗАКОДИРОВАННЫЙ ТЕКСТ СООБЩЕНИЯ


Пробовал декодировать с помощью imap_base64 - возвращает пустоту. С помощью base64_decode - возвращает кракозябры "�M4�M4�M4mΛs�9o�4�n� ��z{Sʗ�{�V���Z�ǭQ1|". Пробовал их декодировать - ничего не вышло. Пробовал самые разные варианты с iconv - ничего не вышло.

Единственное, до чего пока что дошел: если декодировать ТОЛЬКО код выше с комментарием //ЗАКОДИРОВАННЫЙ ТЕКСТ СООБЩЕНИЯ с помощью imap_base64 или base64_decode, то все ОК.

Если же этот текст вместе с остальным ответом (типа --000000000000bc6bc505b640126c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 0JAg0YHRgtC+0LjRgiDQu9C4INC80...), то пустота, либо кракозябры.

То есть в теории я могу почистить весь ответ от ненужного и декодировать только тело сообщения, но может есть какой-то более универсальный вариант? Спасибо.
  • Вопрос задан
  • 2021 просмотр
Решения вопроса 1
@iAlexCross Автор вопроса
Получилось решить через imap. Не знаю, подойдет ли это для каждого, но для моей задачи ОК.

$imap = imap_open("{imap.yandex.ru:993/imap/ssl}", "login", "password");

    $mails = imap_search($imap, 'ON "12-Dec-2020"', OP_READONLY); // ON "12-Dec-2020 - условие

    foreach($mails as $mail) {
        $structure = imap_fetchstructure($imap, $mail);
        if (isset($structure->parts[1])) {
            $part = $structure->parts[1];
            $message = imap_fetchbody($imap,$mail,1);
            if(strpos($message,"<html") !== false) {
                $message = trim(utf8_encode(quoted_printable_decode($message)));
            }
            else if ($part->encoding == 3) {
                $message = imap_base64($message);
            }
            else if($part->encoding == 2) {
                $message = imap_binary($message);
            }
            else if($part->encoding == 1) {
                $message = imap_8bit($message);
            }
            else {
                $message = trim(utf8_encode(quoted_printable_decode(imap_qprint($message))));
            }
        }
        echo '<pre>';
        print_r($message);
        echo '</pre>';
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Курить multipart/form-data
Ну и сразу накуривается https://github.com/php-mime-mail-parser/php-mime-m...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы