#!/usr/bin/perl -w #checks for valid email address #usage validemail use warnings; use strict; use Email::Valid::Loose; use Net::DNS; use Parallel::ForkManager; my $pm=new Parallel::ForkManager(20); my $resolver=Net::DNS::Resolver->new(); my $addrfile = $ARGV[0]; my ($is_valid, $host, $ip, @goodaddr, @badaddr, $x, $record, @mx, $add, @adds); #custom words that make emails invalid to you my @custom = qw( postmaster webmaster ); open (EMAILS, "$addrfile"); while (){ $_ =~ s/\015//; chomp $_; push @adds, $_; } close (EMAILS); OUTER: foreach $add (@adds){ $pm->start and next; foreach $x (@custom){ if ($add =~ m/$x/){ push (@badaddr, $add); next OUTER; } } #if email is invalid move on if (!defined(Email::Valid::Loose->address($add))){ push (@badaddr, $add); next OUTER; } #if email is valid get hostname $is_valid = Email::Valid::Loose->address($add); if ($is_valid =~ m/\@(.*)$/) { $host = $1; } $is_valid=""; # perform dsn lookup to check domain @mx=mx($resolver, $host); if (@mx) { push (@goodaddr, $add); #address is good }else{ push (@badaddr, $add); #address is bad } $pm->finish; } #warning! I will delete existing files as I open them! open (BADADDR, ">badmails") || die; foreach $x (@badaddr){ print BADADDR "$x\n"; } close (BADADDR); open (GOODADDR, ">goodmails") || die; foreach $x (@goodaddr){ print GOODADDR "$x\n"; } close (GOODADDR);