<?php
class wspPop3
{
var $fs;
var $twt;
var $Error;
function wspPop3()
{
$this->twt = 5;
$this->fs = false;
$this->Error = '';
}
// читать из потока
function Read(&$buff, $lst=false, $lim=4096)
{
$this->Error = 'Не открыт ящик';
if (!$this->fs)
return false;
$this->Error = 'Нет данных в потоке';
if(feof($this->fs))
return false;
while(!preg_match("/\r\n/", $str))
$str = fread($this->fs, $lim);
if($str[0] !== '+')
{
$this->Error = 'Ошибка: '.$str;
return false;
};
if (!$lst)
{
$buff = $str;
return true;
};
while(!preg_match("/.*(\r\n\.\r\n).*/", $str))
$str = $str.fread($this->fs, $lim);
$buff = explode("\r\n", $str);
while((count($buff) > 1)and($buff[count($buff)-1] != '.'))
unset($buff[count($buff)-1]);
if ($buff[count($buff)-1] == '.')
unset($buff[count($buff)-1]);
return true;
}
// запсись в поток и возврат вывода
function Write($snd, &$buff)
{
$this->Error = 'Не открыт ящик';
if (!$this->fs)
return false;
$cmd = explode(' ', $snd);
foreach($cmd as $key => $val)
$cmd[$key] = strtoupper(trim($val));
$buff = '';
$snd = trim($snd)."\r\n";
if(!fwrite($this->fs, $snd))
{
$this->Error = 'Ошибка отсылки команды серверу';
return false;
};
$lst = ((($cmd[0] == "RETR")and(intval($cmd[1]) > 0))or
(($cmd[0] == "LIST")and(!isset($cmd[1])))or
(($cmd[0] == "TOP")and(intval($cmd[1]) > 0)and(intval($cmd[2]) > 0)));
return $this->Read(&$buff, $lst);
}
// открыть ящик
function Open($srv, $usr, $pwd, $auto=true, $port=110, $tm=30)
{
if($this->fs)
{
if(!$auto)
{
$this->Error = 'Подключение уже выполнено';
return false;
};
$this->Close();
};
$this->fs = fsockopen($srv, $port, $errno, $errstr, $tm);
if(!$this->fs)
{
$this->Error = 'Ошибка подключения к почтовому серверу '.$errstr.' ('.$errno.')';
return false;
};
$inf = null;
if (!$this->Read(&$inf))
{
$this->Close();
$this->Error = 'Ошибка получения информации от сервера';
return false;
};
$buff = null;
$snd = "USER ".$usr;
if(!$this->Write($snd, &$buff))
return false;
$snd = "PASS ".$pwd;
if(!$this->Write($snd, &$buff))
return false;
$this->Error = "";
return true;
}
// закрыть работу с ящиком
function Close()
{
$buff = null;
$this->Write("QUIT", &$buff);
if($this->fs)
fclose($this->fs);
$this->fs = false;
}
// список писем
function Lst(&$lst)
{
$this->Error = 'Не открыт ящик';
if (!$this->fs)
return false;
$buff = null;
if(!$this->Write("LIST", &$buff))
return false;
for($i=1; $i<count($buff); $i++)
$lst[$i] = explode(' ', $buff[$i], 2);
return true;
}
// чтение письма
function GetMail($id, &$head, &$text, $del=false)
{
$this->Error = 'Не открыт ящик';
if (!$this->fs)
return false;
$buff = null;
if(!$this->Write("RETR ".$id, &$buff))
return false;
$i = 1;
while(strlen($buff[$i]) > 0)
$head[] = $buff[$i++];
$i++;
while($i < count($buff))
$text[] = $buff[$i++];
if($del)
$this->Write("DELE ".$id, &$buff);
return true;
}
};
$pop3 = new wspPop3();
$opn = $pop3->Open('pop.mail.ru', 'test_lo@mail.ru', 'test123'); // !!! ПОСТАВИТЬ нужные данные
if ($opn)
{
$head = null;
$text = null;
$mls = array();
$pop3->Lst(&$mls);
foreach($mls as $key => $val)
{
$head = null; $text = null;
if($pop3->GetMail($key, &$head, &$text, false))
ToBase($head, $text);
echo '<hr>';
};
};
$pop3->Close();
unset($pop3);
// функция обработки письма - в частности - занесение в БД
function ToBase($head, $text)
{
// сам процесс занесения информации в БД
$from = null;
foreach($head as $key => $val)
{
if (preg_match("/From/i", $val))
$from = htmlspecialchars($val);
};
//$from = iconv("KOIR-8", "UTF-8", $from);
//$text = iconv("KOIR-8", "UTF-8", $text);
echo '<b>'.$from.'</b> Внесено в БД<div style="border:1px solid #FF0000">'.nl2br(htmlspecialchars(implode("\r\n", $text)))."</div>";
};
?>
//логин и пароль от почты я оставил в коде свой
Данный скрипт цепляет темы и тела ВСЕХ писем.
При выполнении скрипта имеем: