Иногда почтовые сервисы не предоставляют гибкие настройки фильтрации сообщений, например 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));
?>