Парсер писем для Mail.ru by Fepsis

Discussion in 'PHP' started by Fepsis, 21 Jun 2010.

  1. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Парсер писем для Mail.ru by Fepsis

    Интро:

    Каждый из нас знает про замечательный почтовый сервис Mail.ru, многие держат там почтовый ящик, у кого-то на мейл.ру даже 2 ящика :) Но что делать, если количество ваших почтовых ящиков измеряется в сотнях, а то и в тысячах..?! Как найти нужное письмо..?! Как вспомнить, на какой из ящиков зарегистрирован аккаунт на любимом форуме..?! На помощь приходит Парсер писем для Mail.ru by Fepsis... :)

    Описание:

    - Скрипт написон на PERL-е, для его наботы нужен ActivePerl. Скачать можно тут: http://www.activestate.com/activeperl/downloads
    - Работа идёт по списку аккаунтов вида:
    - Поддерживаются домены @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" с аккаунтами вида:
    Перед началом работы, отредактируйте в скрипте это: Смотри пост #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 Fepsis, 21 Jun 2010
    Last edited: 11 Apr 2011
    7 people like this.
  2. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Примеры использования

    Пример #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'
     
  3. TikTik

    TikTik Member

    Joined:
    20 Feb 2009
    Messages:
    241
    Likes Received:
    12
    Reputations:
    2
    Всё норма чекать мыльники им очень хорошо и быстро а вот письма искать у меня что то не получается :((
    К примеру хочу найти в своих мыльниках все пароли от VK
    подскажите что я не правильно делаю вроже всё по инструкции
     
  4. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    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 появятся текстовые документы, в которых сохранятся письма.... Выложи сюда пример письма...
     
  5. TikTik

    TikTik Member

    Joined:
    20 Feb 2009
    Messages:
    241
    Likes Received:
    12
    Reputations:
    2

    ВКонтакте.ру <[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

    Если Вы не подавали заявки на регистрацию, проигнорируйте это письмо - возможно, кто-то совершил ошибку.


    С уважением,
    Администрация ВКонтакте.ру
     
  6. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    Fepsis, про pop3 слышал?
     
  7. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Слышал... Веб интерфейс испоьзую тут сознательно... Через поп3 писал нечто похожее на php около года назад, заметил следующее:
    1) При нескольких попытках авторизации с неверными данными по pop3 протоколу получаешь временный бан.. С веб интерфейсом такого не наблюдалось...
    2) Если писем на ящике очень много, имхо не целесообразным получать заголовки всех писем + сами письма, а потом парсить нужные, проще сделать лишний пост запрос (поиск в ящике по ключевой фразе) и слить уже только письма, удовлетворяющие запросу...
     
    1 person likes this.
  8. maxya

    maxya New Member

    Joined:
    15 Feb 2010
    Messages:
    55
    Likes Received:
    4
    Reputations:
    -1
    Полезный скрипт. Спасибо.

    Можно добавить в функцию записи лога блокировку файла. При многопоточности полезно ;)
    Code:
    logg
         {
    		my ($data, $file) = @_;
    		open(OUT, ">> ".$file);
                    while(!flock (OUT, 2)){ };    #lock
    		print OUT "$data\n";
     		flock (OUT, 8);   #unlock
    		close(OUT);
         }
    
     
    1 person likes this.
  9. to.Index

    to.Index Member

    Joined:
    3 Jul 2010
    Messages:
    42
    Likes Received:
    22
    Reputations:
    5
    автор, может поправишь скриптик? есть чем отблагодарить ( личку)
     
  10. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Было бы полезно добавить функцию - Слить все адреса отправителей с определенным доменом.

    Например @rambler.ru и он выкачивает все письма и вытаскивает мыла отправителей.. собираем спам базу)
     
  11. mazaxaka

    mazaxaka Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    чтото криво он сохроняет.

    запрос верен. в папке майлс. файл есть. но в файле следующие
     
  12. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Я не уверен, что скрипт ещё работает...

    Отпиши какой конфиг используешь и какие письма пытаешься получить..
     
  13. mazaxaka

    mazaxaka Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    вот конфиг

    запрос в браузере.
    на странице 12 найденых писем
    а в html ,12 строк
     
  14. Fepsis

    Fepsis Elder - Старейшина

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    На мейле кое-что поменялось...

    mazaxaka, первый пост обновил, возьми оттуда скрипт... отпиши о результатах..
     
    2 people like this.
  15. mazaxaka

    mazaxaka Elder - Старейшина

    Joined:
    15 Feb 2008
    Messages:
    268
    Likes Received:
    35
    Reputations:
    0
    работает. благодарю
     
  16. savage0100

    savage0100 Member

    Joined:
    17 Jun 2009
    Messages:
    0
    Likes Received:
    29
    Reputations:
    -1
    Есть ли аналоги для yandex?
     
  17. supman

    supman New Member

    Joined:
    13 Dec 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Большая просьба сделать настройку глубины проверки почтовых ящиков. Например "глубина"=30 - это значит нужно проверить 30 последних (самых свежих) писем. С этим параметром проверка будет проходить намного быстрее. Заранее благодарен
     
  18. fesssi

    fesssi New Member

    Joined:
    15 Jun 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    В глубине нет смысла проще парсить дату получения письма так прикольней)
     
  19. fesssi

    fesssi New Member

    Joined:
    15 Jun 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Аналог есть тут:

    http://forum.antichat.ru/thread272601.html

    + работает без бананов на яндексе.
    А так бесплатного не видел для яндекса там трабла валидность лучше проверять по ПОП3 протоколу а уже парсить ХТТП.
     
  20. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Вот сбор по критериям было бы не плохо сделать. (По дате, по названиям, по содержанию, по отправителю, по не прочитанным, по последним, по самым первым и так далее.)
     
Loading...
Similar Threads - Парсер писем Mail
  1. GAiN
    Replies:
    3
    Views:
    7,455