свернуть

Простой клиент IMAP

Иногда почтовые сервисы не предоставляют гибкие настройки фильтрации сообщений, например timeweb.ru, но можно организовать свою собственную проверку, настроив фильтры с какой угодно логикой.

Практически 90% СПАМА можно отфильтровать просто проверив наличие своего адреса в поле КОМУ и/или КОПИЯ. СПАМ рассыльщики пользуются дырками в серверах и вписывают адреса для рассылки в служебные заголовки писем, которые большинство почтовых серверов не проверяет, и не даёт пользователю сделать фильтр на эти поля. Такое халатное отношение к явной недоработке даёт нам основание думать, что большинство владельцев почтовых серверов либо в сговоре с рассыльщиками, либо каким-то образом заинтересованы, хотя делают вид, что всячески ведут борьбу с этим "недугом". Например предлагают вам пользоваться неким фильтром спама, разработанным какой-то знаменитой группой очкариков, но при этом не дают гарантии, что нужные вам письма не будут помечены как спам. Таким образом работа этого модуля безсмысленна, т.к. вам всё равно придётся лазить в папку со спамом и просматривать письма на предмет "а не попало ли в фильтр какое-то нужное сообщение?". Т.е. что отработал этот фильтр, что нет - всё равно вам приходится просматривать весь перечень писем. А если нет разницы - зачем использовать прокладку от лузеров? Мало того, некие мифические спам-листы, используемые для фильтраций, не понятно кем и когда проверяются, и насколько их представление о спаме совпадает с вашим. Таким образом, есть повод немного напрячься самим и сделать свой скрипт-проверяльщик.

Пример чтения писем внутри папок почтового ящика

<?php
/********* константы ***********/
define('PAGE_CHARSET','UTF-8');
define('MAIL_SERVER','{imap.timeweb.ru:993/ssl}');
define('MAIL_BOX','ваш@почтовый.ящик');
define('MAIL_BOX_PASS','пароль');
define('MAIL_HOST','почтовый.ящик');
//********
header('Charset: '.PAGE_CHARSET);
header('Content-type: text/html; charset='.PAGE_CHARSET);
$serverTrash = 'INBOX.Trash';
$content = '<h1>Почтовый клиент</h1>';
// подключаемся к серверу
if($mbox = imap_open(MAIL_SERVER,MAIL_BOX,MAIL_BOX_PASS)){
  $content .= '<p>есть соединение'.date('d-m-Y H:i:s').'</p>';
  // пытаемся прочитать все папки внутри почтового ящика
  $list = imap_getsubscribed($mbox,MAIL_SERVER, "*");
  if(is_array($list)){
    reset($list);
    foreach ($list as $key => $val){
      $content .= "<h2>Обработка папки ".$val->name."</h2>";
      $folder = imap_reopen($mbox,$val->name);
      if ($folder === true) {
        $content .= '<p>-- open folder '.$val->name.': OK</p>';
        $IM = imap_check($mbox);
        if($result = imap_search($mbox, 'ALL')){
          $arrTrash = array();
          $content .= '<table border="1"><tr><th>#</th><th>Кому</th><th>От кого</th><th>Тема</th><th>Статус</th></tr>';
          foreach ($result as $i=>$id){
            $status = 'спам'; // начальный статус - считаем всё спамом
            $overview = imap_headerinfo($mbox, $id);
            $content .= '<tr><td>'.$id.'</td><td>';
            foreach($overview->to as $to){
              // проверяем все адреса в поле КОМУ
              // если находим свой - очищаем статус
              $content .= $to->mailbox.'@'.$to->host.'<br />';
              if(strtolower($to->mailbox.'@'.$to->host)==MAIL_BOX)$status = '';
            }
            $content.='</td><td>';
            foreach($overview->from as $from){
              // тут можно проверять поле ОТ КОГО
              if(empty($from->personal)) {
                $name = '';
              }else{
                $name = imap_mime_header_decode($from->personal);
                $name = iconv_mime_decode($name[0]->text,0,PAGE_CHARSET).' ';
              }
              $content .= $name.$from->mailbox.'@'.$from->host.'<br />';
              // например, если это адрес не вашего автоответчика, а других почт на вашем домене нет - значит это спам
              if(strtolower($from->host)==MAIL_HOST&&strtolower($from->mailbox)!='no-reply')$status = 'спам';
            }
            // проверка темы
            $subject = '';
            // если содержится неизвестная кодировка (x-unknown), то скорее всего это спам
            if(strpos($overview->subject,'=?x-unknown')==false){
              if (strlen($overview->subject) > 0 ) {
                foreach (imap_mime_header_decode(iconv_mime_decode($overview->subject,2,PAGE_CHARSET)) as $obj) {
                  $subject .= $obj->text;
                }
              }
              // далее можно установить каскад проверок по ключевым словам
              // ..........более тонкая проверка по словам в поле ТЕМА.....
              //.......например использовать preg_match по ключевым словам....
            }else{
              $status = 'спам';
            }
            $content.='</td><td>'.$subject.'</td><td>'.$status.'</td></tr>';
            // добавляем номер сообщения в массив, если это спам
            if($status == 'спам')$arrTrash[] = $id;
          }
          $content .= '</table>';
          if(strpos($val->name,$serverTrash)===false){
            // прочие папки, кроме корзины
            if(count($arrTrash)>0){
              // помечаем на удаление спам-письма
              if(imap_delete($mbox,implode(',',$arrTrash))){
                if(imap_expunge($mbox)){
                  $content .= '<p>-- '.implode(',',$arrTrash).': письма удалены</p>';
                }else{
                  $content .= '<p>-- '.implode(',',$arrTrash).': не удалось удалить</p>';
                }
              }else{
                $content .= '<p>-- не удалось пометить письма на удаление</p>';
              }
            }
          }else{
            // зачистка папки КОРЗИНА
            if(imap_delete($mbox,'1:*')){
              if(imap_expunge($mbox)){
                $content .= '<p>-- корзина зачищена</p>';
              }else{
                $content .= '<p>-- не удалось зачистить корзину</p>';
              }
            }else{
              $content .= '<p>-- не удалось пометить письма на удаление в корзине</p>';
            }
          }
        }else{
          $content .= '<p>-- NO letters</p>';
        }
      }
      $content .= '<br /><hr />';
    }
  }else{
    $content .= "imap_getsubscribed failed: " . imap_last_error() . "<br />";
  }
  imap_close($mbox);
}else{
  $content .= 'cant connect: ' . imap_last_error();
}
// тут можно отправить отчёт на контрольный адрес с телом $content
// ..........
// показываем результат
echo $content;
?>

Скачать IMAP-клиент

Пример настроек в файле imap_settings.php:

<?php
$MAIL_SERVER = 'no-reply@site.su'; // адрес для заполнения поля ОТ в письмо контролёру
$MAIL_ADMIN = 'admin@mail.ru'; // адрес контролёра, куда будет отправлен отчёт
//массив с настройками подключения
$MAIL_EXCLUDE= array('abc@google.ru'); // адреса дружественных ящиков, с которых идёт сбор почты
//массив с настройками подключения
$MAIL_BOXES = array(array('imap'=>'{imap.timeweb.ru:993/ssl}','mail'=>'info@site.su','pass'=>'111111','self'=>true),array('imap'=>'{imap.mail.ru:993/ssl}','mail'=>'info@mail.ru','pass'=>'2222','self'=>false));
?>