Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение писем pop3 / imap с сервера, Разобрать письмо и вывести эти части на  
:(
    Опции темы
phpmasters
Дата 2.5.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 2.5.2013

Репутация: нет
Всего: нет



Добрый день!

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

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

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

Вот код, с рабочим примером
Код

<?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   = "[email protected]";    // логин к ящику
$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>";
    
?>

В БРАУЗЕРЕ ВЫГЛЯДИТ ТАК
Цитата

Соединение с 'mx1.hostinger.com.ua:110' ... открыто! 

Авторизация ... прошла успешно! 

Всего сообщений: 2

Общий размер: 5 Kb

СООБЩЕНИЯ 1 НАЧАЛО answer
answer: +OK
Return-Path: 
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: from f140.mail.ru (f140.mail.ru [94.100.178.196])
    by mx1.main-hosting.eu ([Main-Hosting.eu Mail System]) with ESMTP id CC70D4BC4134
    for ; Thu,  2 May 2013 03:59:15 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail;
    h=Content-Type:Message-ID:Reply-To:Date:Mime-Version:Subject:To:From; bh=G5kBvrn8IzQ/4mo6nuwdMwVRdRkiJw2yLrLESE313eQ=;
    b=rAcU5I7WpRslMAYx4EtlTvr9jUc1QZzveJzPxn0CdA6fq6KMCJ/zKB3KKsuQFdBc633kluQlawSAiJDiuawPtTQ0iaagtEnrYGLClSsFW5FBQ7GotbIVbOFhMYXcgy9L;
Received: from mail by f140.mail.ru with local (envelope-from )
    id 1UXoQ6-0003NL-M7
    for [email protected]; Thu, 02 May 2013 11:59:14 +0400
Received: from [94.179.221.66] by e.mail.ru with HTTP;
    Thu, 02 May 2013 11:59:14 +0400
From: =?UTF-8?B?0JLQu9Cw0LTQuNC80LjRgCDQntCz0L3QtdCy0L7QuQ==?= 
To: [email protected]
Subject: =?UTF-8?B?0KLQtdC80LAg0L7RgiB2bGFkaW1pcl9vZ25ldm9pQG1haWwucnU=?=
Mime-Version: 1.0
X-Mailer: Mail.Ru Mailer 1.0
X-Originating-IP: [94.179.221.66]
Date: Thu, 02 May 2013 11:59:14 +0400
Reply-To: =?UTF-8?B?0JLQu9Cw0LTQuNC80LjRgCDQntCz0L3QtdCy0L7QuQ==?= 
X-Priority: 3 (Normal)
Message-ID: <[email protected]>
Content-Type: multipart/alternative;
    boundary="--ALT--ckEmDa3L1367481554"
X-Spam: Not detected
X-Mras: Ok

.

СООБЩЕНИЯ 1 КОНЕЦ answer

Сообщение 1 - Тема: =?UTF-8?B?0KLQtdC80LAg0L7RgiB2bGFkaW1pcl9vZ25ldm9pQG1haWwucnU=?= 

Сообщение 1 - Содержание: -

Сообщение 1 - Дата: 02.05.2013 10:59:14

Сообщение 1 - Отправитель (Return-path): [email protected] 

 Сообщение 1 - Тип: multipart/alternative; 

 Сообщение 1 - Получатель: [email protected] 

 Сообщение 1 - Размер: 3 Kb

СООБЩЕНИЯ 2 НАЧАЛО answer
answer: +OK
Return-Path: 
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: from mail-wg0-f48.google.com (mail-wg0-f48.google.com [74.125.82.48])
    by mx1.main-hosting.eu ([Main-Hosting.eu Mail System]) with ESMTP id 39FE04BC4149
    for ; Thu,  2 May 2013 06:22:18 -0400 (EDT)
Received: by mail-wg0-f48.google.com with SMTP id f11so389824wgh.15
        for ; Thu, 02 May 2013 03:22:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=mime-version:x-received:date:message-id:subject:from:to
         :content-type;
        bh=S+i/3McUv1MIdeEnpC59k5yBeCMBOoqJkfaETp/zT+A=;
        b=h4S+RVQGV7C/VV/moVe2EEMHUSwHm7coWWZ+gCs9teM+qZFM/XW6XaY/tJIKlYLdAv
         wr/DPjN87k4w5ie0w2dlLnA5FYeoav35gc961jZA6i+clrxUPoGnWepn9QCobJWr8dnz
         3V31bwdXrAv4c5Y8N+Q24WqUqhKomkA4nZPxgt6mPpil5JWj+l1azu7EQtelToIdMeY3
         NDtVIZjr1I4xuUzhdP4OU734vMFPizVt1ItE9y3rfwg1eNFOqSWAEwD1qD2mVEJy8H4M
         ihVZLV+mpZGHSKBYPw/rLqDp2SgDRBfp73AdhdK5E3x2VXE+u+v3umK65G6glOoklElC
         knyQ==
MIME-Version: 1.0
X-Received: by 10.194.71.103 with SMTP id t7mr6963200wju.38.1367490137858;
 Thu, 02 May 2013 03:22:17 -0700 (PDT)
Received: by 10.194.110.229 with HTTP; Thu, 2 May 2013 03:22:17 -0700 (PDT)
Date: Thu, 2 May 2013 13:22:17 +0300
Message-ID: 
Subject: =?KOI8-R?B?8NLP18XSy8EgUEhQINPL0snQ1ME=?=
From: =?KOI8-R?B?98zBxMnNydIg78fOxdfPyg==?= 
To: [email protected]
Content-Type: multipart/mixed; boundary=047d7bd91760e6a94904dbb99b3e

.

СООБЩЕНИЯ 2 КОНЕЦ answer

Сообщение 2 - Тема: =?KOI8-R?B?8NLP18XSy8EgUEhQINPL0snQ1ME=?= 

Сообщение 2 - Содержание: -

Сообщение 2 - Дата: 02.05.2013 13:22:17

Сообщение 2 - Отправитель (Return-path): [email protected] 

 Сообщение 2 - Тип: multipart/mixed; boundary=047d7bd91760e6a94904dbb99b3e 

 Сообщение 2 - Получатель: [email protected] 

 Сообщение 2 - Размер: 3 Kb

Соединение ... закрыто.


Архив рабочего кода Получение писем pop3 с сервера здесь http://iaa.besaba.com/pop3.rar

Если у Вас есть лучшее или готовое решение данной задачи, то выкладывайте для общего обозрения, буду рад протестировать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.