Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Получение писем pop3 / imap с сервера


Автор: phpmasters 2.5.2013, 16:06
Добрый день, профессионалы!

Весь инет облазил!!!

Делаю получение писем 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

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

Автор: DropSQL 2.5.2013, 17:46
А в чем проблема? парсите протокол и всё будет ОК.
Если вам нужно работать с уже распарсиным текстом, то возмите готовую либу для работы с pop3 или imap...

Если у вас есть более конкретный вопрос на который хотите получить ответ, задайте.

Автор: phpmasters 2.5.2013, 18:35
1. Проблема в том, что не знаю какими операторами PHP сделать перекодировку Темы письма их по ходу будет много разных, (utf-8, и т.п.).

Нашол вод столько, перекодировщиков Темы письма

Код

echo "KOI8-R > CP1251: ".iconv ('KOI8-R', 'CP1251', $msg_subject);
        
$msg_subject = iconv("$msg_charset","CP1251",$msg_subject); 

$msg_subject = charset_x_win($msg_subject);
            
$msg_subject = iconv("$msg_charset","koi8-r",$msg_subject);
            
$msg_subject = convert_cyr_string($msg,w,k);
            
$msg_subject = base64_decode($msg_subject);    

$msg_subject = iconv ('utf-8', 'CP1251', $msg_subject);
            
$msg_subject = mb_convert_encoding($msg_subject,'UTF-8','CP1251');

$msg_subject = convert_cyr_string($msg_subject, 'b', 'k');

$msg_subject = base64_encode(convert_cyr_string($subject, "k","w"));

$msg_subject = decode_mime_string($msg_subject);

$msg_subject = iconv($msg_subject[0]->charset, "UTF-8", $from[0]->text);

$msg_subject = base64_encode($msg_subject);    


2. Не знаю, как найти и перекодировать Содержание (Тело) письма, бывает оно есть бывает его нет (Content preview:), в чем причина понятия не имею.

3. Про аттачи много читал, т.е. видел куски кода, но как их найти и сохранить в папку на сервер прикрепленные файлы не знаю.

4. По подключению к Imap c SSL / TLS кода рабочего не нашёл, поэтому использую pop3, но это урезает многих почтовых серверов, так как там еще есть SSL / TLS.

Автор: DropSQL 2.5.2013, 20:45
1)Перекодировать советую с помощью iconv (очень проверенный вариант), кодировку можете узнать в теле письма charset=KOI8-R.

2) Обычно по протоколу приходит 2 копии письма:
Код

Content-Type: text/plain; charset=KOI8-R
Content-Transfer-Encoding: base64

и
Код

Content-Type: text/html; charset=KOI8-R
Content-Transfer-Encoding: base64

собственно берете любое которые вам нужно, раскодируете (если требуется, иногда может приходить незакодированное) и выводите пользователю.

3)
Код

Content-Type: application/pdf; name=Hetzner.pdf
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Hetzner.pdf

таким образом находишь атач, разкодируешь и пишешь в файл.

4) ssl и tsl чаще всего это обычный https подобный (то есть встрено в php, детально как с этим работать можешь посмотреть в том же phpmailer или swiftmailer)

Автор: phpmasters 2.5.2013, 21:30
1. В том и дело, что у меня не все варианты кодировок есть, а той, что нужно нет.

Код

// Определяем кодировку сообщения

// Кодировка windows-1251
if (preg_match("!windows-1251!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>windows-1251</strong></p>";
    $msg_charset = "windows-1251";
}

// Кодировка utf-8
elseif (preg_match("!utf-8!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>utf-8</strong></p>";
    $msg_charset = "utf-8";
}

// Кодировка koi8-r
elseif (preg_match("!koi8-r!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>koi8-r</strong></p>";
    $msg_charset = "koi8-r";
}

// Кодировка iso8859-5
elseif (preg_match("!iso8859-5!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>iso8859-5</strong></p>";
    $msg_charset = "iso8859-5";
}

// Кодировка iso-8859-5
elseif (preg_match("!iso-8859-5!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>iso-8859-5</strong></p>";
    $msg_charset = "iso-8859-5";
}

// Кодировка x-cp866
elseif (preg_match("!x-cp866!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>x-cp866</strong></p>";
    $msg_charset = "x-cp866";
}

// Кодировка x-mac-cyrillic
elseif (preg_match("!x-mac-cyrillic!ism",$answer))
{
    echo "<p>Кодировка:: <strong>x-mac-cyrillic</strong></p>";
    $msg_charset = "x-mac-cyrillic";
}

// Кодировка koi8-u
elseif (preg_match("!koi8-u!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>koi8-u</strong></p>";
    $msg_charset = "koi8-u";
}

// Кодировка macintosh
elseif (preg_match("!macintosh!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>macintosh</strong></p>";
    $msg_charset = "macintosh";
}

// Кодировка Macintosh
elseif (preg_match("!Macintosh!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>Macintosh</strong></p>";
    $msg_charset = "Macintosh";
}

// Кодировка oem 855
elseif (preg_match("!oem 855!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>oem 855</strong></p>";
    $msg_charset = "oem 855";
}

// Кодировка oem 866
elseif (preg_match("!oem 866!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>oem 866</strong></p>";
    $msg_charset = "oem 866";
}

// Кодировка ansi
elseif (preg_match("!ansi!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>ansi</strong></p>";
    $msg_charset = "ansi";
}

// Кодировка WINDOWS-1251
elseif (preg_match("!WINDOWS-1251!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>WINDOWS-1251</strong></p>";
    $msg_charset = "WINDOWS-1251";
}

// Кодировка UTF-8
elseif (preg_match("!UTF-8!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>UTF-8</strong></p>";
    $msg_charset = "UTF-8";
}

// Кодировка KOI8-R
elseif (preg_match("!KOI8-R!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>KOI8-R</strong></p>";
    $msg_charset = "KOI8-R";
    
}

// Кодировка ISO8859-5
elseif (preg_match("!ISO8859-5!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>ISO8859-5</strong></p>";
    $msg_charset = "ISO8859-5";
}

// Кодировка ISO-8859-5
elseif (preg_match("!ISO-8859-5!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>ISO-8859-5</strong></p>";
    $msg_charset = "ISO-8859-5";
}

// Кодировка X-CP866
elseif (preg_match("!X-CP866!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>X-CP866</strong></p>";
    $msg_charset = "X-CP866";
}

// Кодировка X-MAC-CYRILLIC
elseif (preg_match("!X-MAC-CYRILLIC!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>X-MAC-CYRILLIC</strong></p>";
    $msg_charset = "X-MAC-CYRILLIC";
}

// Кодировка KOI8-U
elseif (preg_match("!KOI8-U!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>KOI8-U</strong></p>";
    $msg_charset = "KOI8-U";
}

// Кодировка MACINTOSH
elseif (preg_match("!MACINTOSH!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>MACINTOSH</strong></p>";
    $msg_charset = "MACINTOSH";
}

// Кодировка OEM 855
elseif (preg_match("!OEM 855!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>OEM 855</strong></p>";
    $msg_charset = "OEM 855";
}

// Кодировка OEM 866
elseif (preg_match("!OEM 866!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>OEM 866</strong></p>";
    $msg_charset = "OEM 866";
}

// Кодировка ANSI
elseif (preg_match("!ANSI!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>ANSI</strong></p>";
    $msg_charset = "ANSI";
}

// Кодировка windows-1251
elseif (preg_match("!windows-1251!ism",$answer))
{
    echo "<p>Сообщение ".$i." - Кодировка: <strong>windows-1251</strong></p>";
    $msg_charset = "windows-1251";
}


2. У меня другие значения:

Код

Для первого письма:

Content-Type: multipart/alternative;
    boundary="--ALT--ckEmDa3L1367481554"

Для второго письма:
Content-Type: multipart/mixed; boundary=047d7bd91760e6a94904dbb99b3e



3. У меня во втором письме есть attachment, но его не видно,

4.  phpmailer хорош для отправки писем, а чтобы их принимал, такого не видел.

Автор: DropSQL 2.5.2013, 22:22
1) кодировку очень не правильно определяете и соответственно вероятность угадать и перекодировать ниже чем кажется, тем более что могут проблемы увеличиться, в случае если 3-4 разных кодировки в тексте будет
2) это не пример и не решение, читайте в интернете и протоколе и о mime типах...
3) ну это вы сами решайте, я не знаю что у вас там не видно и почему
4) я сказал посмотреть пример работы с ssl/tsl, а не приемом/отправки писем.

http://php.net/manual/en/book.imap.php
http://goo.gl/SNthN
http://goo.gl/tRlYg

https://github.com/Synchro/PHPMailer - поддерживает как pop3 так и smtp
swiftmailer, думаю, тоже поддерживает, читай


P.S. мне кажется тему нужно перенести из "Для профи" в "Общие вопросы".

Автор: phpmasters 2.5.2013, 22:36
Все что мне нужно это несколько строк кода, только нужного,
а не отсылка в поисковые системы, если б там был этот код, то уже давно б все сделал и Вы об этом даже не узнали.

Так как вы пишете, то это явно не профи, а обычный пользователь, 
профи обычно дают несколько строк кода, и даже без комментариев.

Поэтому если, кто знает код или подобное решение, то пишите, так как тема, разровненная в интернете и большинство решений устарели, утратили свою актуальность, а пополнить мало, кто хочет, чтобы было отличное решение по чтению почты на PHP своими руками. smile 

Автор: phpmasters 3.5.2013, 09:02
Какой функцией найти кодировку письма если их будет больше одной ?

Автор: DropSQL 3.5.2013, 09:32
кодировка относится к текстовым участкам письма, например:
Код

Content-Type: text/plain; charset=KOI8-R


соответственно когда определяете нужную часть письма, там и парсите кодировку, например:
Код

charset=([a-zA-Z0-9\-]+)

Это пример, реально нужно смотреть по коду.
http://atmail.com/ - посомтрите этот код, думаю там есть всё что вам нужно и даже более того

P.S. если не помог, извините, мне больше не интересна ваша тема

Автор: phpmasters 3.5.2013, 10:06
А если тут нет charset вообще, то что делать ?

Цитата

СООБЩЕНИЯ 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

Автор: ksnk 3.5.2013, 10:50
Цитата(phpmasters @  3.5.2013,  10:06 Найти цитируемый пост)
А если тут нет charset вообще, то что делать ?

А сообщения-то тоже нет  smile 

А вообще,кодировку нужно брать из явно указанной кодировки текста (ее тут нет), кодировки заголовков (utf-8), кодировки "мейлера" по умолчанию. Для mail.ru обычной кодировкой является utf-8, да и для всех online-мэйлеров. 

Автор: phpmasters 3.5.2013, 12:03
ksnk
Если б была кодировка, сообщение и аттач, то тема бы не выкладывалась на форум.

Все что нужно это доработать скрипт и выложить с решением проблемы.
а такое общение приводит к тому, что мы уходим от решения и тратим уйму времени на это.

Если Вы действительно знаете, как решить задачу, то пишите по теме, как ее решить.

ВСЕ ИСХОДНИКИ И ВЫВОД КОДА В БРАУЗЕРЕ УКАЗАНО В ПЕРВОМ СООБЩЕНИИ ТЕМЫ, ТАМ ЕСТЬ АРХИВ, ЧТОБЫ БЫТЬ В КУРСЕ.

Автор: DropSQL 3.5.2013, 12:37
Цитата(phpmasters @ 3.5.2013,  10:06)
А если тут нет charset вообще, то что делать ?

Цитата

СООБЩЕНИЯ 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

Или вам пришло пустое письмо, или вы его не правильно получили с сервера (только заголовки, без текста и приложений).
Предоставте польное исходное сообщение, сможем подсказать по решению проблемы в ДАННОМ, исключительном, случае.

Автор: phpmasters 3.5.2013, 13:00
Дело в том, что на разных серверах по-разному работает этот код, 

бывали случаи, когда была только тема письма как в правильной кодировке так и не в правильной,
бывали только содержание как в правильной кодировке так и не в правильной

Поэтому целого подхода в том, что бы правильно письма отображались пока не нашёл,
так как почта может идти с разных ящиков к примеру с:

www.gmail.com
www.mail.ru
www.yandex.ru
www.rambler.ru

и другие

Автор: DropSQL 5.5.2013, 13:42
http://www.codenet.ru/webmast/pop3.php
LIST, RETR 
посмотрите на эти комманды и пересмотрите свой код.
Код не может работать на разных серверах по разному, раз он работает на разных серверах по разному, значит он не правильно работает вообще.
Мой совет всеже смотреть в сторону http://ua1.php.net/imap

Автор: phpmasters 5.5.2013, 18:52
Что скажете про 
https://pear.php.net/manual/es/package.networking.net-pop3.intro.php
http://webi.ru/webi_articles/6_12_f.html

Автор: phpmasters 6.5.2013, 11:01
Использовал файл test_pop3.php из архива pop3class_2009_02_01.zip, 
который скачал по этой http://www.phpclasses.org/browse/package/2/download/zip.html 

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

Цитата

Connecting to mx1.hostinger.com.ua ...
 S +OK Ready.
Connected to the POP3 server "mx1.hostinger.com.ua".
 C USER [email protected]
 S +OK
 C PASS admin1234567
 S +OK Logged in.
User "[email protected]" logged in.
 C STAT
 S +OK 2 4782
There are 2 messages in the mail box with a total of 4782 bytes.
 C LIST
 S +OK 2 messages:
 S 1 2074
 S 2 2708
 S .
Message 1 - 2074 bytes.
Message 2 - 2708 bytes.
 C UIDL
 S +OK
 S 1 1367481555.V805I1bc4926M919336.mx.main-hosting.eu
 S 2 1367490138.V805I1bc492dM265873.mx.main-hosting.eu
 S .
Message 1, Unique ID - "1367481555.V805I1bc4926M919336.mx.main-hosting.eu"
Message 2, Unique ID - "1367490138.V805I1bc492dM265873.mx.main-hosting.eu"
 C TOP 1 2
 S +OK
 S Return-Path: <[email protected]>
 S X-Original-To: [email protected]
 S Delivered-To: [email protected]
 S Received: from f140.mail.ru (f140.mail.ru [94.100.178.196])
 S by mx1.main-hosting.eu ([Main-Hosting.eu Mail System]) with ESMTP id CC70D4BC4134
 S for <[email protected]>; Thu, 2 May 2013 03:59:15 -0400 (EDT)
 S DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mail.ru; s=mail;
 S h=Content-Type:Message-ID:Reply-To:Date:Mime-Version:Subject:To:From; bh=G5kBvrn8IzQ/4mo6nuwdMwVRdRkiJw2yLrLESE313eQ=;
 S b=rAcU5I7WpRslMAYx4EtlTvr9jUc1QZzveJzPxn0CdA6fq6KMCJ/zKB3KKsuQFdBc633kluQlawSAiJDiuawPtTQ0iaagtEnrYGLClSsFW5FBQ7GotbIVbOFhMYXcgy9L;
 S Received: from mail by f140.mail.ru with local (envelope-from <[email protected]>)
 S id 1UXoQ6-0003NL-M7
 S for [email protected]; Thu, 02 May 2013 11:59:14 +0400
 S Received: from [94.179.221.66] by e.mail.ru with HTTP;
 S Thu, 02 May 2013 11:59:14 +0400
 S From: =?UTF-8?B?0JLQu9Cw0LTQuNC80LjRgCDQntCz0L3QtdCy0L7QuQ==?= <[email protected]>
 S To: [email protected]
 S Subject: =?UTF-8?B?0KLQtdC80LAg0L7RgiB2bGFkaW1pcl9vZ25ldm9pQG1haWwucnU=?=
 S Mime-Version: 1.0
 S X-Mailer: Mail.Ru Mailer 1.0
 S X-Originating-IP: [94.179.221.66]
 S Date: Thu, 02 May 2013 11:59:14 +0400
 S Reply-To: =?UTF-8?B?0JLQu9Cw0LTQuNC80LjRgCDQntCz0L3QtdCy0L7QuQ==?= <[email protected]>
 S X-Priority: 3 (Normal)
 S Message-ID: <[email protected]>
 S Content-Type: multipart/alternative;
 S boundary="--ALT--ckEmDa3L1367481554"
 S X-Spam: Not detected
 S X-Mras: Ok
 S 
 S 
 S ----ALT--ckEmDa3L1367481554
 S .
Message 1:
---Message headers starts below---
Return-Path: <[email protected]>
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 <[email protected]>; 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 <[email protected]>)    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==?= <[email protected]>
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==?= <[email protected]>
X-Priority: 3 (Normal)
Message-ID: <[email protected]>
Content-Type: multipart/alternative;    boundary="--ALT--ckEmDa3L1367481554"
X-Spam: Not detected
X-Mras: Ok
---Message headers ends above---
---Message body starts below---
----ALT--ckEmDa3L1367481554
---Message body ends above---
 C DELE 1
 S +OK Marked to be deleted.
Marked message 1 for deletion.
 C RSET
 S +OK
Resetted the list of messages to be deleted.
 C QUIT
 S +OK Logging out.
 Closing connection.
Disconnected from the POP3 server "mx1.hostinger.com.ua".


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

// Определяем тему сообщения
$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 = ??????

Автор: phpmasters 6.5.2013, 12:32
Код файла test_pop3.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="[email protected]";                        /* 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>


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)