За последние 24 часа нас посетили 17616 программистов и 1310 роботов. Сейчас ищут 795 программистов ...

Получение "чистого" тела письма (IMAP).

Тема в разделе "Работа с почтой", создана пользователем el2500, 19 окт 2012.

  1. el2500

    el2500 Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    2
    Симпатии:
    0
    Доброго!

    Код:
    Код (PHP):
    1. $mbox = imap_open('{'.$server.':'.$port.$type.$ssl.'}', $login, $pass);
    2. $allMsg = imap_search($mbox, 'ALL', SE_UID);
    3. foreach ($allMsg as $v)
    4. {
    5.     $msg = imap_header($mbox, $v, 255, 255);
    6.     $elements = imap_mime_header_decode($msg->fetchsubject);
    7.     $subj = '';
    8.     for ($p = 0; $p < count($elements); $p++) 
    9.         $subj .= encodingToUtf($elements[$p]->text, $elements[0]->charset); //encodingToUtf понятно - превращает строку из указанной кодировки в UTF-8
    10.     echo $subj.'<br>'; // здесь всё нормально
    11.     echo imap_utf8($eml); // здесь всё плохо. Кодировки subject и body оказывается(!) бывает, что и разные
    12. } 
    Проблема с кодировкой тела письма, как её правильно определить не пользуясь функциями определения кодировки текста?

    Во-первых бывает, что письмо начинается так:
    Код (Text):
    1. ------------f090737a5965a7ebdc993556d33b831b.1230218765
    2. Content-Type: text/plain; charset=utf-8
    3. Content-Transfer-Encoding: 8bit
    Но бывает, что оно начинается сразу текстом. Значит, когда эти строки есть - их надо безболезненно вырезать, предварительно получив оттуда кодировку. Есть ли средства предназначенные специально для этого?

    Во-вторых: из imap_fetchstructure видно, что у письма 2 текста (если можно так выразиться), PLAIN и HTML - можно ли как-то получить отдельно первое и отдельно второе?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    части письма как раз и бьются по такой вот штуке ------------f090737a5965a7ebdc993556d33b831b.1230218765

    а больше я ничего не знаю =(
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот эта штука
    Код (Text):
    1. ------------f090737a5965a7ebdc993556d33b831b.1230218765
    2. Content-Type: text/plain; charset=utf-8
    3. Content-Transfer-Encoding: 8bit
    появляется в теле письма - когда у него есть вложения. Если вложений нет - то этой штуки тоже нет, а Content-Type для текста письма - идёт в заголовке письма, а не в теле.
     
  4. el2500

    el2500 Активный пользователь

    С нами с:
    19 окт 2012
    Сообщения:
    2
    Симпатии:
    0
    Всем неравнодушным спасибо.
    Самую достойную реализацию задачи нашёл вот здесь http://forum.dklab.ru/viewtopic.php?p=176877, только проблема с темой письма, решается впиливанием
    Код (PHP):
    1. $msg = imap_header($this->mbox, $i, 255, 255);
    2. $elements = imap_mime_header_decode($msg->fetchsubject);
    3. $subj = '';
    4. for ($p = 0; $p < count($elements); $p++) 
    5.     $subj .= iconv($elements[0]->charset, 'UTF-8', $elements[$p]->text); 
    ну и датой, если кому нужно.