EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

php чтение почты

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB
php чтение почты
Автор Сообщение
interes
Интернет на завтрак
Интернет на завтрак


Зарегистрирован: 24.04.2007
Сообщения: 29

2856 Монеты

СообщениеДобавлено: Пт, 19 Окт, 2007 06:24    Заголовок сообщения: php чтение почты Ответить с цитатой

алло, может кто ответит?
итак любезные господа, задача у меня стояла примерно следующая: на почтовый ящик сыпятся письма написанные в каком-то стиле (стандарте) требуется их обработать.
к примеру, анкетные данные.
но прежде обработки возник вопрос чтения сообщений с почтового сервера. вот что я нашёл:
изначально код писали судя по всему французы:
Auteur : Bouchon pour Max-Gamers.net
MGVersion : $webmail-0.1-fr-php@dev.max-htters.net#06/2002#$
License : GPL/GNU [http://www.gnu.org]
Courriel : bouchon@max-gamers.net
(это так, чтоб соблюсти какие-нибудь права)
вообще, это почтовый клиент наподобии outlook express на php
если вам нужно, могу скинуть http://interes.uzelok.net/sendler.php
но сразу предупреждаю - ошибок, видимо-невидимо. наверно где-то работал хорошо, но не у меня.
я вырезал почти всё и переработал в один сплошной файл, он лазит в нужный почтовый ящик типа mylog@mailbox.ru и сохраняет письма в файл:

Код:

<?
// установка параметров подключения
$serv = 'pop3.mail.ru'; $port = 110;
$user = 'mylog'; $pass = 'mypass';
// назначение фильтра
$target = array('anybody@mailbox.ru', 'everybody@mailbox.ru');
// подключение базы данных
mysql_connect('localhost','login','password');   
mysql_select_db('database');       

// класс pop3
class POP3 {
   var $totaille = 0 ;   var $banner   = '';   var $dial = Array();   
   function pop_connect($str_Host = 'localhost', $int_Port = 110) {
      $soket = fsockopen ($str_Host, $int_Port, $int_Err, $str_Err);
      if(!$soket) { global $str_Err,$int_Err; return FALSE; }
      $this->banner = ($this->dial[] = fgets($soket,100));
      return $soket; }
   function pop_login($soket, $str_User, $str_Pass) {
      if(!$soket) { return -1; }
      $qu = "USER $str_User\r\n"; fputs($soket, $qu); $this -> dial[] = '-> '.$qu;
      if(eregi('-ERR', ($this -> dial[] = '<- '.fgets($soket,100)))) return -2;
      $qu = "PASS $str_Pass\r\n"; fputs($soket, $qu); $this -> dial[] = '-> '.str_replace($str_Pass,"[Pass]",$qu);
      if(eregi('-ERR', ($this -> dial[] = '<- '.fgets($soket,100)))) return -3;
      $qu = "STAT\r\n"; fputs($soket, $qu); $this -> dial[] = '-> '.$qu;
      $r = split(" ", ($this -> dial[] = '<- '.fgets($soket,100)));
      if($r[1] == '-ERR') return -4;
      $this -> totaille = $r[3];
      return $r[2]; }
   function pop_list($soket,$count) {
      if(!$soket) { return -1; }
      $qu = "LIST\r\n"; fputs($soket, $qu); $this->dial[] = '-> '.$qu;
      if(substr(($this->dial[] = '<- '.fgets($soket, 200)), 3, 7) == '-ERR') return -2;
      $rep[0] = $count;
      for($j = 1; $j <= $count; $j++) {
         if($j > $count) { break; }
         $line = fgets($soket, 500); $line = split(' ',$line);
         if($line[0] != $j) { $rep[$j] = 'deleted'; } else { $rep[$j] = $line[1]; }
         unset($line); }
      return $rep; }
   function pop_top($soket, $int_Id) {
      if(!$soket) { global $PHP_SELF; return -1; }
      $rep = ''; $all = '' ; $qu = "TOP $int_Id 0\r\n";
      fputs($soket, $qu); $this->dial[] = '-> '.$qu;
      if(eregi('-ERR', ($this->dial[] = '<- '.fgets($soket, 200)))) return -2;
      $line = fgets($soket,200);
      while(!ereg("^\.\r\n", $line)) {
         $tmp = explode(':',$line,2);
         if(!empty($tmp[1])) { $ar_Headers[trim(strtolower($tmp[0]))] = trim($tmp[1]); }
         $rep .= $line; $all .= $line; $line = fgets($soket,200);
         if(empty($line)) { break; }
         $rep = ''; $tmp = array(); }
      $ar_Headers['all'] = $all;
      return $ar_Headers; }
   function pop_get($soket, $int_Id) {
      if(!$soket) { return -1; }
      $qu = "RETR $int_Id\r\n"; fputs($soket, $qu); $this->dial[] = '-> '.$qu;
      if(eregi('-ERR', ($this->dial[] = '<- '.fgets($soket, 200)))) return -2;
      $line = fgets($soket, 2000); $ft_a = '';
      for($h=0; !ereg("^\.\r\n", $line); $h++) {
         $ar_Rep[$h] = $line; $line = fgets($soket, 2000);
         // <!-- остановка на text/html
         if(!empty($ft_a)) { $h--; }
         else { $ft_a = strstr($line, 'text/html'); }
         // -->
         if(empty($line)) { break; }}
      return $ar_Rep; }
   function pop_quit($soket) {
      if(!$soket) return -1;
      $qu = "QUIT\r\n"; fputs($soket, $qu);
      $this->dial[] = '-> '.$qu; $this->dial[] = '<- '.fgets($soket,200);
      fclose($soket);
      return TRUE; }}
// функция выборки из базы данных
function select_from_db($q) {
   $r = mysql_query($q);
   $n = mysql_num_rows($r);
   for($i = 0; $i < $n; $i++) {
      $s[$i] = mysql_fetch_array($r); }
   if(!empty($s)) return $s;
   else return ''; }     
set_magic_quotes_runtime(0);
set_time_limit(120);

// подключение
$POP3 = new POP3();
$soket = $POP3->pop_connect($serv, $port);       
$count = $POP3->pop_login($soket, $user, $pass);   
// чтение заголовков
$liste = $POP3->pop_list($soket,$count); $ft = 0;
for($i = $count; $i > 1; $i--) {     
   $message = $POP3->pop_top($soket, $i); $k6 = 0;                     
   // реализация фильтра
   if(!strstr($message['from'], $target[0]) and !strstr($message['from'], $target[1])) continue;
   if(!empty($message['date'])) {
      $get_dat = urlencode($message['date']); $datarr[$i] = $get_dat;
      for($j = 0; $j < $i; $j++) {
         if($get_dat == $datarr[$j]) $k6 = 1; }
      if($k6 == 1) continue;
      $sql = "select date from table where date='$get_dat'";
      $res = select_from_db($sql);
      if(!empty($res)) continue;
   // чтение письма
   $msgNum = $i;
   $to = $message['to'];
   $bound = substr($message['all'], strpos($message['all'], 'boundary="') + 10, 90);
   $bound = trim(str_replace(")", '\)', str_replace("(", '\(', substr($bound, 0, strpos($bound,'"')))));
   $sujet = $message['subject'];
   if(!$sujet) { $sujet = ''; }
   $to = str_replace('<','',str_replace('>','',$to));
   $ar_Msg = $POP3->pop_get($soket, $msgNum); $ok = false; $body = '';
   for($i1 = 0; @$ar_Msg[$i1]; $i1++) {
      $k = $ar_Msg[$i1];
      $a = strpos($k, 'text/html');
      if($a > 0) break;
      if($ok === false) {
         if($k == "\r\n") { $ok = true; }}
      else { $body .= $k; }}
   // конвертация письма
   if($bound) {
      if(@eregi($bound, $body)) {
         $bd = spliti("(-)*".$bound, $body);
         for($i2 = 1, $body = '', $pj = Array(); isset($bd[$i2]); $i2++) {
            if(!eregi("Content-Type",$bd[$i2])) continue;
            if(!eregi("Content-Disposition:.?attachment", $bd[$i2])) {
               if(eregi("Encoding:.?base64",$bd[$i2])) $b64 = 1; else $b64 = 0;
               $t = trim(str_replace('=20', '', $bd[$i2]));
               $t = trim(substr($t, strpos($t, "\r\n\r\n"), strlen($t)));
               if($b64) $t = base64_decode($t);
               $body .= eregi_replace("=0A", chr(hexdec("0A")),$t);
               $body .= "<!-- NextPart @ Mime (quelle daube) -->\r\n\r\n"; }
            }}}   
   if(!strstr($body, 'TA TURNE-TRANS')) continue;
   $body = convert_cyr_string($body, 'koi8-r', 'windows-1251');
   // сохранение письма
   $mft[$ft] = $get_dat;
   $fp = fopen('data/'.$mft[$ft].'.dat', 'w');
   $res = fwrite($fp, $body);
   fclose($fp); $ft++;       
}
$POP3->pop_quit($soket);
// начало обработки
include('search.php');
?>


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

у меня же есть следующий вопрос:

Код:
 
   function pop_get($soket, $int_Id) {
      if(!$soket) { return -1; }
      $qu = "RETR $int_Id\r\n"; fputs($soket, $qu); $this->dial[] = '-> '.$qu;
      if(eregi('-ERR', ($this->dial[] = '<- '.fgets($soket, 200)))) return -2;
      $line = fgets($soket, 2000); $ft_a = '';
      for($h=0; !ereg("^\.\r\n", $line); $h++) {
         $ar_Rep[$h] = $line; $line = fgets($soket, 2000);
         // <!-- остановка на text/html
         if(!empty($ft_a)) { $h--; }
         else { $ft_a = strstr($line, 'text/html'); }
         // -->
         if(empty($line)) { break; }}
      return $ar_Rep; }


в этом куске я делаю остановку на text/html.
при чтении сообщений мне нужна только текстовая состовляющая письма, а html-ная (дублирующая) совершенно не нужна. мало того, основной вес письма, а следовательно и торможение всей программы приходится именно на этот кусок и я был бы очень рад выбраться из потока простой командой break; но в результате не читаются следующие сообщения. функция fseek() с потоком работать отказывается.

может кто посоветует, как можно выбраться из потока?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB Часовой пояс: GMT
Страница 1 из 1

 


EOMY TOP 100 Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group


Рейтинг SIMPLETOP.NET