Доброго! Код: Код (PHP): $mbox = imap_open('{'.$server.':'.$port.$type.$ssl.'}', $login, $pass); $allMsg = imap_search($mbox, 'ALL', SE_UID); foreach ($allMsg as $v) { $msg = imap_header($mbox, $v, 255, 255); $elements = imap_mime_header_decode($msg->fetchsubject); $subj = ''; for ($p = 0; $p < count($elements); $p++) $subj .= encodingToUtf($elements[$p]->text, $elements[0]->charset); //encodingToUtf понятно - превращает строку из указанной кодировки в UTF-8 echo $subj.'<br>'; // здесь всё нормально echo imap_utf8($eml); // здесь всё плохо. Кодировки subject и body оказывается(!) бывает, что и разные } Проблема с кодировкой тела письма, как её правильно определить не пользуясь функциями определения кодировки текста? Во-первых бывает, что письмо начинается так: Код (Text): ------------f090737a5965a7ebdc993556d33b831b.1230218765 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Но бывает, что оно начинается сразу текстом. Значит, когда эти строки есть - их надо безболезненно вырезать, предварительно получив оттуда кодировку. Есть ли средства предназначенные специально для этого? Во-вторых: из imap_fetchstructure видно, что у письма 2 текста (если можно так выразиться), PLAIN и HTML - можно ли как-то получить отдельно первое и отдельно второе?
части письма как раз и бьются по такой вот штуке ------------f090737a5965a7ebdc993556d33b831b.1230218765 а больше я ничего не знаю =(
Вот эта штука Код (Text): ------------f090737a5965a7ebdc993556d33b831b.1230218765 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit появляется в теле письма - когда у него есть вложения. Если вложений нет - то этой штуки тоже нет, а Content-Type для текста письма - идёт в заголовке письма, а не в теле.
Всем неравнодушным спасибо. Самую достойную реализацию задачи нашёл вот здесь http://forum.dklab.ru/viewtopic.php?p=176877, только проблема с темой письма, решается впиливанием Код (PHP): $msg = imap_header($this->mbox, $i, 255, 255); $elements = imap_mime_header_decode($msg->fetchsubject); $subj = ''; for ($p = 0; $p < count($elements); $p++) $subj .= iconv($elements[0]->charset, 'UTF-8', $elements[$p]->text); ну и датой, если кому нужно.