Периодический опрос почтового ящика по протколу pop из cron.

Игорёк

Новичок
Периодический опрос почтового ящика по протколу pop из cron.

Никто не работал из скриптов с протоколом pop (чтение
входящей почты)? Я вот повесил php скрипт на cron.
Он нормально выполняется и раз в 4 минуты выкачивает
почту из ящика. Но проблема - если попытаться выполнить
параллельно какой-нибудь скрипт с вызовом функции mail()
с указанием адреса отправителя этого же ящика
(подозреваю, что это основная причина), то
протокол pop3 затыкается, т.е. он взвращает
сообщения что ящик пуст, но на самом деле
ящик просто перестает принимать входящие сообщения
на долгое время, даже если их присылают.
В каталоге почты появляется какой-то файл inbox.lock
и пока он не исчезнет, ящик почту не принимает.
Это какой-то глюк у sendmail'а или что?
 

tony2001

TeaM PHPClub
и как долго он становится недоступен?

>В каталоге почты появляется какой-то файл inbox.lock
логично предположить, что это ящик просто напросто лочится, чтобы его не очистили в процессе наполнения.
 

Игорёк

Новичок
> и как долго он становится недоступен?

Надолго, иногда на полчаса. Недоступен для входящих писем,
а по протоколу pop просто отвечает что ящик пуст и входящих
писем нет.

> > В каталоге почты появляется какой-то файл inbox.lock
> логично предположить, что это ящик просто напросто лочится, чтобы его > не очистили в процессе наполнения.

Там в этом файле inbox.lock какое-то число лежит, я не знаю,
что оно обозначает.
Но ведь после наполнения он должен нормально разлочиваться?
Сервер pop должен все это нормально разруливать!
Я использую класс mlemos-pop3 (он по-моему и на этом
сайте есть), делаю все четко -
коннектюсь, логинюсь, считываю письма и закрываю pop
срединение. Могу привести скрипт для примера.
И это нормально работает по cron'у!
Но как только пользователь вызывает из браузера
другие скрипты, то начинается вот такой геморрой.
А ведь в этих скриптах нету обращения по pop к этому
ящику, конфликтов быть не должно. Единственное, что
там есть, это вызов mail() с указанием в поле From:
этого ящика (и даже указание других ящиков в этом домене вызывает
сбои). Хотя я не уверен, в этом ли причина.
Как внутри устроена функция mail() ?

P.S. Еще у хостера cpanel настроена так, что
нельзя читать письма из ящика по протоколу pop
чаще одного подключения в три минуты.
Но я подключаюсь реже - один раз в четыре минуты.
И если бы причина была в этом, то pop сервер
бы отвечал: ваш лимит подключений исчерпан,
но он этого не делает.
 

Игорёк

Новичок
Сейчас написал тестовые скрипты и еще раз все проверил.
Оказывается почтовый ящик затыкается и самопроизвольно,
даже если пользователь не вызывает никаких скриптов
параллельно, а идет только периодический опрос этого
ящика по cron! Причем никакой информации о каких-либо
ошибках не выдается. Ящик просто надолго прекращает
прием почты.

Объясните, в чем тут дело. Я не линуксоид, и не понимаю
тонкостей работы всяких сендмайлов.

А вот скрипт который производит опрос ящика:

Код:
<?php

 // Только каждый четвертый вызов скрипт должен
 // срабатывать. Если скрипт вызывается из cron
 // раз в минуту, то ящик будет опрашиваться
 // раз в четыре минуты.
 //
 $minut = date('i');
 if (($minut % 4)!=0) {
    echo("<BR>\n");
    exit();
 }


 include "./pop3.php";

 $pop3_user="forum@mydomen";
 $pop3_password="mypassword";
 $pop3_host="mail.hosterdomen.ru";
 $apop=0;
 $pop3_connection=new pop3_class;
 $pop3_connection->hostname=$pop3_host;

 // Открываем соединение с pop-сервером
 if (($error=$pop3_connection->Open())=="")
 {
    echo "<PRE>Connected to the POP3 server &quot;$pop3_connection->hostname&quot;.</PRE>\n";

    // Входим как пользователь
    if (($error=$pop3_connection->Login($pop3_user,$pop3_password,$apop))=="")
    {
       echo "<PRE>User &quot;$pop3_user&quot; logged in.</PRE>\n";

       // Считываем все сообщения в массив $inpost[] и удаляем их
       for ($i=1;;$i++) {
          if (($error=$pop3_connection->RetrieveMessage($i,&$mheaders,&$mbody,-1))=="")
          {
             $totpost = implode($mheaders, "\n")."\n\n".implode($mbody, "\n");
             $inpost[] = $totpost;
             $pop3_connection->DeleteMessage($i);
          } else break;
       }
    } else echo("Login: $error<BR>\n");

    $pop3_connection->Close();

 } else echo("Connect: $error<BR>\n");

 // выводим считанные сообщения
 if (count($inpost)==0) {
   echo("NO MESSAGES<BR>\n");
 }
 else {
   echo("<PRE>\n");
   foreach($inpost as $value) {
      echo(htmlspecialchars($value)."\n========\n");
   }
   echo("\n</PRE>\n");
 }

?>

Скрипт повешен на cron - выполняется раз в минуту,
вывод перенаправлен в файл >> myoutput,
который я просматриваю
 

Игорёк

Новичок
Проблема решена.

Оказывается, если с помощью класса mlemos (я не пробовал другие,
возможно такой же эффект) периодически из cron'а считывать
ящик pop, и в течение нескольких итераций ящик был пуст, то
он "ломается", перестает работать на прием. И это надолго -
иногда на несколько часов.

Я повесил на cron другой скрипт, который подкидывает письма
в этот ящик, таким образом, на каждой итерации есть что считывать.
После этого все заработало нормально. Естественно, при считывании
я эти дополнительные письма игнорирую.

Вот такое шаманство.

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