Как стать автором
Обновить

Делаем фильтр от спама для почты

Время на прочтение3 мин
Количество просмотров10K
image

Благодаря gmail.com я мог все свои ящики собрать в кучу. Но столкнулся с проблемой, когда все сообщения приходит на одну почту, то ты спам начинаешь уже и замечать. И лень лазить и удалять спам руками, а тот фильтр, которые уже встроенный в почтовый сервис не всегда радует.

Почему не сделать бота, который чистит почту, тем более спам четко виден по некоторым признакам?
Вот что я выделил, что в моих глазах спам:
— всё написано в верхнем регистре
— сообщения, где главная мысль: порнуха, знакомства, казино, деньги и т.д.
— если кто-то регулярно высылает почту и я её не прочитываю

В самом начале нужно настроить imap php для близкой работы с почтой. Потом написать некоторые алгоритмы, которые в этой статье будут не оптимальные, т.к. каждому нужен свой фильтр (например, некоторые ждут спама от порнографических сайтов).

Тут будут только идеи и информация для ума. И для тех кто хочет поставить свой фильтр, уже будет фундамент.

Начинаем...

Про то как настроить imap php есть куча статей, их можно поискать. У меня Ubuntu, я этот вопрос решил за пару минут и немного изменение в настройках.

Когда вы уже настроили imap можно его подключать.
<?php
//настройки для подключениея к почте
$imapaddress = "{imap.gmail.com:993/imap/ssl}";
$imapmainbox = "INBOX";
$maxmessagecount = 10;
$user="имя почты на gmail без @gmail.com";
$password="длинный и сложный пароль";

//наша функция, которая удаляет спам
spam_delete($imapaddress, $imapmainbox, $user, $password, $maxmessagecount);


Теперь заходим на почту забираем письма. Когда взяли письмо, весь текст делим на слова и подсчитываем кол-во. Потом в цикле берем по словам и проверяем на то, может ли это слово подтверждать, что это письмо спам. Некоторые пункты, что по моему является спамом описал выше. Потом находим вероятность того, что это письмо спам по такой формуле:

вероятность=количество слов всего в письме / слова, которые не прошли фильтр

Вот как это всё в коде:
function spam_delete($imapaddress, $imapmainbox, $imapuser, $imappassword, $maxmessagecount)
{
$imapaddressandbox = $imapaddress . $imapmainbox;

//открываем соединение с почтой
$connection = imap_open ($imapaddressandbox, $imapuser, $imappassword)
or die("Can't connect to '" . $imapaddress .
"' as user '" . $imapuser .
"' with password '" . $imappassword .
"': " . imap_last_error());

echo "Gmail information for " . $imapuser ."";

echo "Inbox headers\n";
$headers = imap_headers($connection)
or die("can't get headers: " . imap_last_error());

//считаем кол-во почты на сайте, максимум мы 10 можем вывести
$totalmessagecount = sizeof($headers);

echo $totalmessagecount . " messages";

if ($totalmessagecount<$maxmessagecount)
$displaycount = $totalmessagecount;
else
$displaycount = $maxmessagecount;

echo "Message bodies\n";
//заходим в письмо берем содержание и проверяем на спам
for ($count=1; $count<=$displaycount; $count+=1)
{
$body=imap_fetchbody($connection,$count,"2");
//разбиваем всё письмо на слова
$text=explode(" ",$body);
$spam=0;
//подсчитываем кол-во слов
$n=count($text);
for ($i=0;$i<$n;$i++) {
$spam+=test_spam($text[$i])==1:1?0;
}
//смотрим какая вероятность, что это спам
// мы кол-во слов делим, на возможные слова,
//которые подтверждают, что это спам
$result=$n/$spam;
//если 50% что это спам, то удаляем
if ($result>0.5) {
imap_delete($connection,$count);
imap_expunge($connection);
}
}
//закрываем imap
imap_close($connection);
}


Алгоритм проверки на спам очень простой, он написан для примера. Если вы хотите написать более сильный и умный алгоритм советую почитать некоторые главы про спам в книге «Программируем коллективный разум», на Хабре про неё тоже писали.

Алгоритм выполняет два действия:
1. Определяет слова, которые чаще всего встречаются в спаме
2. Проверяет на регистр, если всё в в верхнем, то это скорее всего спам.

Сам код:
//функция проверки на спам
function test_spam ($string) {
//этапы фильтра
//проверяем по ключевым словам
$array=array('порно' => 1, 'знакомства' => 1, 'казино' => 1, 'купить' => 1);
if ($array[$string]==1) {return 1;}
//не находится ли он в верхнем регистре
if (strtolower($string)!==$string) {
return 1;
}
return 0;
}
?>

Протестировал на двух примерах, то вроде работает...

P.S. Будет очень рад услышать как вы боритесь с мусором. Если вы найдете ошибке в коде сильно не ругайтесь это только пример и фундамент для разработки чего-то большего.
Теги:
Хабы:
+1
Комментарии13

Публикации

Изменить настройки темы

Истории

Работа

PHP программист
162 вакансии

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн