|
|
|
|
|
для: lilu
(09.02.2007 в 11:22)
| | Нзчт ;) обращайтесь, если что пишите... для индивидуальных вопросов все контакты в профиле есть =))) | |
|
|
|
|
|
|
|
для: ZuArt
(09.02.2007 в 10:54)
| | Всё работает - ура - ну надо же, я бы так не написала ......, спасибочки вам ZuArt и Вам, Trianon..:))). | |
|
|
|
|
|
|
|
для: lilu
(09.02.2007 в 10:31)
| | вот в этой строчке
if($pop3->GetMail($key, &$head, &$text, false))
|
поменяйте последний параметр на true =) - будут удаляться... Это флаг удаления писем после считывания =)))
if($pop3->GetMail($key, &$head, &$text, true))
|
ЗЫ. Кстать, протокол РОР3 не удаляет письма сразу, а помечает на удаление... само удаление производится при ПРАВИЛЬНОМ отключении от сервера (командой "QUIT"). Это к тому, что метод класса Close() нужно ОБЯЗАТЕЛЬНО вызывать для корректного завершения работы и удаления обработанных писем =) | |
|
|
|
|
|
|
|
для: lilu
(09.02.2007 в 10:50)
| | >Там там же целая функция закрывающая ящик
А Вы её вызываете?
Ну, собственно, автор точнее подскажет. | |
|
|
|
|
|
|
|
для: Trianon
(09.02.2007 в 10:45)
| | Там там же целая функция закрывающая ящик ....
<?
function Close()
{
$buff = null;
$this->Write("QUIT", &$buff);
if($this->fs)
fclose($this->fs);
$this->fs = false;
}
?>
|
P.S. Trianon спасибочки вам за пояснения - я теперь хоть примерно понимаю что к чему.. Хотя ещё разбираться и разбираться...:) | |
|
|
|
|
|
|
|
для: Trianon
(09.02.2007 в 10:45)
| | Абсолютно верно =))) забыл, что у меня в коде, када писал параметр оставлял false, чтобы не писать постоянно себе самому =)))
параметр в GetMail действительно должен быть true - он служит флагом удаления писем после их считывания =))) | |
|
|
|
|
|
|
|
для: lilu
(09.02.2007 в 10:31)
| | Вероятно, одно из двух:
Либо при вызове GetMail четвертый параметр не указан как true - признак удаления писем.
Либо не выполнен вызов Сlose() , который дает команду QUIT, завершающую POP3-транзакцию. | |
|
|
|
|
|
|
|
для: ZuArt
(06.02.2007 в 18:07)
| | ZuArt спасибо вам огромное - это просто супер, только вот письма с сервера не удаляются....или я что-то упустила. Ошибок не выдаёт.
Я создала кнопку "Загрузить почту" и при повторном нажатии выполняется дублирование содержимого писем в таблицу.. | |
|
|
|
|
|
|
|
для: lilu
(06.02.2007 в 14:07)
| | Не претендую на супер-код - написано практически "набело" на скорую руку - тестил не сильно...
<?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('сервер', 'юзер', 'пасс'); // !!! ПОСТАВИТЬ нужные данные
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);
};
echo '<b>'.$from.'</b> Внесено в БД<div style="border:1px solid #FF0000">'.nl2br(htmlspecialchars(implode("\r\n", $text)))."</div>";
};
?>
|
В класс даже не влезай пока - смысла нету... Посмотри концовку, в принципе все что тебе надо, так это массивы $head и $text - в цикле вызова GetMail($key, &$head, &$text, false)...
$key - это идентификатор письма, который получен предварительным $pop3->Lst(&$mls), $head - это заголовочная информация письма, $text - собственно сам текст письма - делай с ним что хочешь, и последний параметр false - это флаг удаления письма после считывания с сервака...
В случае возврата какой-то функцией значения false - смотри свойство Error объекта класса - там описание ошибки... | |
|
|
|
|
|
|
|
для: Trianon
(06.02.2007 в 14:52)
| | Конструкция
if(1 != intval(($s = send_rcv($fs,$c="USER $login")))) die("Status $c: $s");
|
представляет собой вызов send_rcv() с целью отправки однострочного запроса, и проверку на успех выполнения.
По шагам:
а) переменной $c присваивается строка, отправляемая клиентом:
б) результат, который вернул сервер, присваивается переменной $s :
$s = send_rcv($fs,$c...))
|
в) если результат начинается не с единицы
г) ... то мы аварийно завершаем скрипт, печатая, что послал клиент, и что ответил сервер. | |
|
|
|
|