Получение Писем Pop3 / Imap С Сервера

Тема в разделе "PHP программирование", создана пользователем phpmasters, 2 май 2013.

  1. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Добрый день!

    Делаю получение писем pop3 с сервера, а именно нужно подключиться, узнать сколько писем, вытащить все что есть из первого письма, это переменная $answer, включая прикрепленные файлы и правильность перекодирования заголовков письма и самого cодержания (тела) письма.

    Задача полностью разобрать письмо и вывести эти части на экран в браузере.

    Нужно сделать помимо того, что есть еще:
    - Перекодировку Темы письма
    - Найти и перекодировать Содержание (Тело) письма
    - Найти и сохранить прикрепленные файлы письма
    - Подключение к Imap c SSL / TLS
    - Возможно, что-то еще вывести ...

    Вот код, с рабочим примером
    Код (Text):
    <?php
    // Включаем библиотеку mime parser
    require_once('receipt/rfc822_addresses.php');
    require_once('receipt/mime_parser.php');

    $mime = new mime_parser_class;

    error_reporting(E_ALL ^ E_WARNING);
    ob_implicit_flush();

    // Email хостинг провайдера получил здесь
    // http://api.hostinger.com.ua/redir/401579

    $address = "mx1.hostinger.com.ua"; // адрес pop3-сервера
    $port   = "110";         // порт (стандартный pop3 - 110)

    $login  = "admin@iaa.besaba.com";   // логин к ящику
    $pwd     = "admin1234567";  // пароль к ящику

    try {

    // Создаем и соединяем сокет к серверу
    echo '<p>Соединение с \''.$address.':'.$port.'\' ... ';
    $socket = fsockopen($address, $port, $errno, $errstr);
    if (!$socket) {
    throw new Exception('fsockopen() failed: '.$errstr."<br>");
    }
    echo "открыто! </p>";

    // Читаем +OK
    read_pop3_answer($socket);

    // Делаем авторизацию
    echo '<p>Авторизация ... ';

    write_pop3_response($socket, 'USER '.$login);
    read_pop3_answer($socket); // ответ сервера

    write_pop3_response($socket, 'PASS '.$pwd);
    read_pop3_answer($socket); // ответ сервера

    echo "прошла успешно! </p>";

    // Определяем кол-во сообщений в ящике и общий размер
    write_pop3_response($socket, 'STAT');
    $answer = read_pop3_answer($socket); // ответ сервера

    preg_match('!([0-9]+)[[:space:]]([0-9]+)!is', $answer, $matches);
    $total_count = $matches[1];

    echo "<p>".'Всего сообщений: <strong>'.$total_count."</strong></p>";

    if ($total_count > 0) {
    echo '<p>Общий размер: <strong>'.ceil($matches[2] / 1024)." Kb</strong></p>";
    }

    $iii = 0;

    // Просматриваем параметры каждого сообщения
    for ($i = 1; $i <= $total_count; $i++)
    {

    write_pop3_response($socket, 'TOP '.$i.' 0');
    $answer = read_pop3_answer($socket, true);

    write_pop3_response($socket, 'LIST '.$i);
    $answer2 = read_pop3_answer($socket);

    // Линия
    echo '<HR NOSHADE WIDTH="100%" COLOR="#023C47" SIZE="10">';

    // Все сообщение       
    echo "<p>СООБЩЕНИЯ $i НАЧАЛО answer</p>";

    echo "<pre style=' font-size:20px; font-family:Calibri; padding-left: 6px;'>answer: $answer</pre>";

    echo "<p>СООБЩЕНИЯ $i КОНЕЦ answer</p>";

    // Определяем тему сообщения    
    preg_match('!Subject:[[:space:]]+(.*?)\n+.*!is', $answer, $matches);

    $msg_subject = $matches[1];

    echo '<p>Сообщение '.$i.' - Тема: <strong>'.$msg_subject."</strong></p>";

    // Определяем содержание сообщения    
    if (preg_match("!Content preview!ism",$answer))
    {
    preg_match('!Content preview:[[:space:]]+(.*?)\[...\]!is', $answer, $matches);
    $msg_content_preview = $matches[1];
    }

    if(!isset($msg_content_preview))
    {
    $msg_content_preview = "-"; // [Name: Name]
    }

    echo '<p style="width:1000px;">Сообщение '.$i.' - Содержание: <strong>'.$msg_content_preview."</strong></p>";               


    // Определяем дату сообщения
    preg_match('!Date:[[:space:]]+(.*?)\n+.*!is', $answer, $matches);
    $msg_date_answer = date('d.m.Y H:i:s', strtotime($matches[1]));
    echo '<p>Сообщение '.$i.' - Дата: <strong>'.$msg_date_answer."</strong></p>";     

    // Определяем отправителя сообщения Return           
    preg_match('!Return-path:[[:space:]]+(.*?)\n+.*!is', $answer, $matches);
    preg_match('|<(.*?)>|is', $matches[1], $matches3);
    $return_path = $matches3[1];

    echo '<p>Сообщение '.$i.' - Отправитель (Return-path): <strong>'.$return_path."</strong> </p>";

    // Определяем отправителя сообщения From
    preg_match('!From:[[:space:]]+(.*?)\n+.*!is', $answer, $matches1);
    preg_match('|<(.*?)>|is', $matches1[1], $matches2);

    // Определяем тип сообщения      
    preg_match('!Content-Type:[[:space:]]+(.*?)\n+.*!is', $answer, $matches);
    $msg_type = $matches[1];

    echo '<p> Сообщение '.$i.' - Тип: <strong>'.$msg_type."</strong></p>";

    $ctype = split(";",$msg_type);
    $types = split("/",$ctype[0]);
    $maintype = trim(strtolower($types[0])); // text или multipart
    $subtype = trim(strtolower($types[1])); // а это подтип(plain, html, mixed)

    // Определяем получателя сообщения    
    preg_match('!To:[[:space:]]+(.*?)\n+.*!is', $answer, $matches);
    $msg_SetFrom_email = $matches[1];
    echo '<p> Сообщение '.$i.' - Получатель: <strong>'.$msg_SetFrom_email."</strong></p>";          

    // Определяем размер сообщения
    preg_match('!^\+[A-Za-z]+[[:space:]]+[0-9]+[[:space:]]+([0-9]+)!is', $answer2, $matches);
    $msg_size = ceil($matches[1] / 1024);
    echo '<p> Сообщение '.$i.' - Размер: <strong>'.$msg_size."</strong> Kb</p>";        

    }

    echo '<HR NOSHADE WIDTH="100%" COLOR="#023C47" SIZE="10">';

    // Отсоединяемся от сервера
    echo "<p>".'Соединение ... ';

    write_pop3_response($socket, 'QUIT');
    read_pop3_answer($socket); // ответ сервера

    echo "закрыто.</p>";

    } catch (Exception $e) {
    echo "\nError: ".$e->getMessage();
    }

    if (isset($socket)) {
    fclose($socket);
    }

    // Функция для чтения ответа сервера. Выбрасывает исключение в случае ошибки
    function read_pop3_answer($socket, $top = false) {
    $read = fgets($socket);

    if ($top) {

    // Если читаем заголовки
    $line = $read;

    while (!ereg("^\.\r\n", $line)) {

    $line = fgets($socket);
    $read .= $line;

    }

    }

    if ($read{0} != '+') {
    if (!empty($read)) {
    throw new Exception('<p>POP3 failed: '.$read."</p>");
    } else {
    throw new Exception('<p>Unknown error'."</p>");
    }
    }

    return $read;
    }

    // Функция для отправки запроса серверу
    function write_pop3_response($socket, $msg) {
    $msg = $msg."\r\n";
    fwrite($socket, $msg);
    }
    echo "</div>";

    ?>
    В БРАУЗЕРЕ ВЫГЛЯДИТ ТАК
    Архив рабочего кода Получение писем pop3 с сервера здесь http://iaa.besaba.com/pop3.rar

    Если у Вас есть лучшее или готовое решение данной задачи, то выкладывайте для общего обозрения, буду рад протестировать.
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Велосипеды изобретаете? :)
    Вот... тестируйте на здоровье... :)
    https://pear.php.net/manual/es/package.netw...-pop3.intro.php
    http://webi.ru/webi_articles/6_12_f.html
    Могу еще накидать... надо? :)
     
  3. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за комментарий! :)
    Это я уже перебрал, там обычно чего-то нахватает, а именно или просто подключение к ящику и получение количества писем, или нет Imap c SSL / TLS подключения, тема бывает в разной кодировке и содержание тоже, а про аттачи просто молчу, так что проверте, пожалуйста, с тем примером, который выше указал и в архив запаковал, он на данный момент лидер на рынке PHP скриптов такого типа.
     
  4. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
  5. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Если это личо мне вопрос, то ничего не скажу... это класика рекомендованная к использованию.
    Вы же, я так понял, "мотоцикл" новый изобретаете... :)
    Поэтому Вам скорее всего сюда надо:
    http://www.phpclasses.org/search.html
    Мне в свое время вот этот класс приглянулся
    Посмотреть вложение pop3class_2009_02_01.zip
    взято отсюда http://www.phpclasses.org/package/2-PHP-Ac...3-protocol.html
    Его обычно и использую. Но там еще мооого интересного... натестируетесь вдоволь... :)
     
  6. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Использовал файл test_pop3.php из архива pop3class_2009_02_01.zip,
    который скачал по этой ссылке

    ВЫВОД в браузере

    Как теперь зделать разбиение целого массива в переменные, такие как:

    // Определяем тему сообщения
    $msg_subject = ??????

    // Определяем содержание сообщения
    $msg_content_preview = ??????

    // Определяем тип сообщения
    $msg_type = ??????

    // Определяем аттачи сообщения
    $msg_content_preview = ??????



    // Определяем дату сообщения
    $msg_date_answer = ??????

    // Определяем отправителя сообщения Return
    $return_return = ??????

    // Определяем отправителя сообщения From
    $return_from = ??????



    // Определяем получателя сообщения
    $msg_SetFrom_email = ??????

    // Определяем размер сообщения
    $msg_size = ??????

    // Определяем приоритет сообщения
    $msg_priority = ??????
     
  7. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Код файла test_pop3.php

    Код (PHP):
    <?php
    /*
    * test_pop3.php
    *
    * @(#) $Header: /home/mlemos/cvsroot/pop3/test_pop3.php,v 1.7 2006/06/11 14:52:09 mlemos Exp $
    *
    */


    ?><HTML>
    <HEAD>
    <TITLE>Test for Manuel Lemos's PHP POP3 class</TITLE>
    </HEAD>
    <BODY>
    <?php

    require("pop3.php");

    /* Uncomment when using SASL authentication mechanisms */
    /*
    require("sasl.php");
    */


    $pop3=new pop3_class;
    $pop3->hostname="mx1.hostinger.com.ua";          /* POP 3 server host name                   */
    $pop3->port=110;                         /* POP 3 server host port,
    usually 110 but some servers use other ports
    Gmail uses 995                           */

    $pop3->tls=0;                           /* Establish secure connections using TLS    */
    $user="admin@iaa.besaba.com";                       /* Authentication user name                 */
    $password="admin1234567";                   /* Authentication password                   */
    $pop3->realm="";                         /* Authentication realm or domain           */
    $pop3->workstation="";                /* Workstation for NTLM authentication         */
    $apop=0;                                 /* Use APOP authentication                  */
    $pop3->authentication_mechanism="USER"; /* SASL authentication mechanism              */
    $pop3->debug=1;                      /* Output debug information                    */
    $pop3->html_debug=1;                     /* Debug information is in HTML                */
    $pop3->join_continuation_header_lines=1; /* Concatenate headers split in multiple lines */

    if(($error=$pop3->Open())=="")
    {
    echo "<PRE>Connected to the POP3 server &quot;".$pop3->hostname."&quot;.</PRE>\n";
    if(($error=$pop3->Login($user,$password,$apop))=="")
    {
    echo "<PRE>User &quot;$user&quot; logged in.</PRE>\n";
    if(($error=$pop3->Statistics($messages,$size))=="")
    {
    echo "<PRE>There are $messages messages in the mail box with a total of $size bytes.</PRE>\n";
    $result=$pop3->ListMessages("",0);
    if(GetType($result)=="array")
    {
    for(Reset($result),$message=0;$message<count($result);Next($result),$message++)
    echo "<PRE>Message ",Key($result)," - ",$result[Key($result)]," bytes.</PRE>\n";
    $result=$pop3->ListMessages("",1);
    if(GetType($result)=="array")
    {
    for(Reset($result),$message=0;$message<count($result);Next($result),$message++)
    echo "<PRE>Message ",Key($result),", Unique ID - \"",$result[Key($result)],"\"</PRE>\n";
    if($messages>0)
    {
    if(($error=$pop3->RetrieveMessage(1,$headers,$body,2))=="")
    {
    echo "<PRE>Message 1:\n---Message headers starts below---</PRE>\n";

    // ?
    // $headers = iconv ("utf-8", "CP1251", $headers);

    for($line=0;$line<count($headers);$line++)
    echo "<PRE>",HtmlSpecialChars($headers[$line]),"</PRE>\n";
    echo "<PRE>---Message headers ends above---\n---Message body starts below---</PRE>\n";
    // ?
    for($line=0;$line<count($body);$line++)
    echo "<PRE>",HtmlSpecialChars($body[$line]),"</PRE>\n";
    echo "<PRE>---Message body ends above---</PRE>\n";



    if(($error=$pop3->DeleteMessage(1))=="")
    {
    echo "<PRE>Marked message 1 for deletion.</PRE>\n";
    if(($error=$pop3->ResetDeletedMessages())=="")
    {
    echo "<PRE>Resetted the list of messages to be deleted.</PRE>\n";
    }
    }
    }
    }
    if($error==""
    && ($error=$pop3->Close())=="")
    echo "<PRE>Disconnected from the POP3 server &quot;".$pop3->hostname."&quot;.</PRE>\n";

    }
    else
    $error=$result;
    }
    else
    $error=$result;
    }
    }
    }
    if($error!="")
    echo "<H2>Error: ",HtmlSpecialChars($error),"</H2>";
    ?>

    </BODY>
    </HTML>
     
  8. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Это всё элементы массива $headers.
     
  9. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Спасибо за ответ! :huh:

    Наверное, да, там он как-то интересно выводится, HtmlSpecialChars($headers[$line]),
    как его загнать в переменную понятия не имею, и возможно нужно через регулярные выражения доставать из него нужные части письма.
     
  10. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Уфф... Ну я же ленивый как кот... ну почему я ведусь на это постоянно... :(
    Ну ладно... вот, поработал "лопатой" за Вас.
    Держите:
    Посмотреть вложение TestMail.rar
    "лидер на рынке PHP скриптов такого типа" наверное не получился... но всё таки... :)

    PS.
    Да. Чуть не забыл. Там код извлекающий из тела письма приаттаченные файлы я закоментил.
    В PHP 5.3 как-то по новому ресурс объявлять требует. Сами поглядите как подправитьв "новом стиле".
    А то мне лень в мануалы лезть... :)
     
  11. phpmasters

    phpmasters New Member

    Регистрация:
    2 май 2013
    Сообщения:
    4
    Симпатии:
    0
    Класно поработали, спасибо!

    Все поправки смотрите в прикрепленном файле TestMail_Prototype_01.zip,
    файл Default.html открывайте в браузере,
    так как я поработал карандашем и линейкой и нарисал для Вас расширенный путь.

    [​IMG]
     
Загрузка...

Поделиться этой страницей