Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Приём почты

Сообщения:  [1-10]    [11-20]  [21-29] 

 
 автор: ZuArt   (09.02.2007 в 11:24)   письмо автору
 
   для: lilu   (09.02.2007 в 11:22)
 

Нзчт ;) обращайтесь, если что пишите... для индивидуальных вопросов все контакты в профиле есть =)))

   
 
 автор: lilu   (09.02.2007 в 11:22)   письмо автору
 
   для: ZuArt   (09.02.2007 в 10:54)
 

Всё работает - ура - ну надо же, я бы так не написала ......, спасибочки вам ZuArt и Вам, Trianon..:))).

   
 
 автор: ZuArt   (09.02.2007 в 10:54)   письмо автору
 
   для: lilu   (09.02.2007 в 10:31)
 

вот в этой строчке

  if($pop3->GetMail($key, &$head, &$text, false))


поменяйте последний параметр на true =) - будут удаляться... Это флаг удаления писем после считывания =)))


  if($pop3->GetMail($key, &$head, &$text, true))


ЗЫ. Кстать, протокол РОР3 не удаляет письма сразу, а помечает на удаление... само удаление производится при ПРАВИЛЬНОМ отключении от сервера (командой "QUIT"). Это к тому, что метод класса Close() нужно ОБЯЗАТЕЛЬНО вызывать для корректного завершения работы и удаления обработанных писем =)

   
 
 автор: Trianon   (09.02.2007 в 10:52)   письмо автору
 
   для: lilu   (09.02.2007 в 10:50)
 

>Там там же целая функция закрывающая ящик

А Вы её вызываете?
Ну, собственно, автор точнее подскажет.

   
 
 автор: 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 спасибочки вам за пояснения - я теперь хоть примерно понимаю что к чему.. Хотя ещё разбираться и разбираться...:)

   
 
 автор: ZuArt   (09.02.2007 в 10:49)   письмо автору
 
   для: Trianon   (09.02.2007 в 10:45)
 

Абсолютно верно =))) забыл, что у меня в коде, када писал параметр оставлял false, чтобы не писать постоянно себе самому =)))
параметр в GetMail действительно должен быть true - он служит флагом удаления писем после их считывания =)))

   
 
 автор: Trianon   (09.02.2007 в 10:45)   письмо автору
 
   для: lilu   (09.02.2007 в 10:31)
 

Вероятно, одно из двух:
Либо при вызове GetMail четвертый параметр не указан как true - признак удаления писем.
Либо не выполнен вызов Сlose() , который дает команду QUIT, завершающую POP3-транзакцию.

   
 
 автор: lilu   (09.02.2007 в 10:31)   письмо автору
 
   для: ZuArt   (06.02.2007 в 18:07)
 

ZuArt спасибо вам огромное - это просто супер, только вот письма с сервера не удаляются....или я что-то упустила. Ошибок не выдаёт.
Я создала кнопку "Загрузить почту" и при повторном нажатии выполняется дублирование содержимого писем в таблицу..

   
 
 автор: ZuArt   (06.02.2007 в 18:07)   письмо автору
 
   для: 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, &$textfalse))
   
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 в 15:04)   письмо автору
 
   для: Trianon   (06.02.2007 в 14:52)
 

Конструкция

if(1 != intval(($s = send_rcv($fs,$c="USER $login")))) die("Status $c: $s"); 

представляет собой вызов send_rcv() с целью отправки однострочного запроса, и проверку на успех выполнения.
По шагам:
а) переменной $c присваивается строка, отправляемая клиентом:

$c="USER $login" 

б) результат, который вернул сервер, присваивается переменной $s :

$s = send_rcv($fs,$c...))

в) если результат начинается не с единицы

if(1 != intval($s ...)) 

г) ... то мы аварийно завершаем скрипт, печатая, что послал клиент, и что ответил сервер.

die("Status $c: $s"); 

   

Сообщения:  [1-10]    [11-20]  [21-29] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования