Rick,
Thank's for the script! I appreciate your help.
Marc
On Jun 27, 2011, at 5:24 PM, Rick Sanders wrote:
> Hi,
>
> I posted a reply to your question but it hasn't shown up yet so maybe there's
> a problem with my News server. Anyway, here is a script that should let you
> do verify e-mail addresses.
>
> If my reply doesn't make it to the the newsgroup you can post this if you
> like.
>
> -Rick
>
> -------- Original Message --------
>
> Keep in mind all of the warnings mentioned in this thread. This is a
> simple script that tries to validate a mail address.
>
> It queries DNS for the MX record for the user's domain followed by an
> SMTP connection to one of the domain's MX servers. After sending "HELO"
> and "MAIL FROM" commands it issues a "RCPT TO" command, and then sends
> "QUIT" (eg, it doesn't actually send a message).
>
> Typical responses:
>
> 250 2.1.5 OK z9si15926030ibd.51
> 250 <[email protected]>... Recipient Ok
> 550 [email protected] unknown
> 550-5.1.1 The email account that you tried to reach does not exist
>
> Warning: This is just a demo script. It has no error checking, retry
> capability, or the ability to try multiple MX servers. It doesn't even
> try to check whether the address is constructed correctly.
>
> -Rick
>
> #!/usr/bin/perl
>
> use strict;
> use Net::DNS;
> use Socket;
> my @mx_hosts;
> my $recipient;
>
> # Determine if an e-mail address is valid.
> # Look up in DNS the MX server that handles mail for the
> # recipient's domain and ask it if the address is valid.
>
> if ( @ARGV[0] ) {
> $recipient = $ARGV[0];
> } else {
> print "Usage: ./verify_mail_address.pl <mail address>\n\n";
> exit;
> }
>
> my ($userid,$domain) = split( /\@/, $recipient );
>
> print "\nChecking $recipient\n\n";
>
> my $res = Net::DNS::Resolver->new;
> my @mx = mx( $res, $domain );
> foreach my $rr ( @mx ) {
> my $pref = $rr->preference;
> my $mx_host = $rr->exchange;
> push( @mx_hosts, $mx_host );
> }
>
> # If any of the mx hosts don't answer you can try another one.
> # You may want to sort by the rr->preference value but for this
> # example we'll just grab the first one from the list
>
> my $mx_host = pop( @mx_hosts );
>
> my $status = check_recipient( $recipient, $mx_host );
>
> print "$status\n";
> exit;
>
>
>
> sub check_recipient {
>
> my $recipient = shift;
> my $smtp_server = shift;
> my $my_domain = 'mydomain.com';
> my $my_address = '[email protected]';
> my $recip_status;
>
> # Open a connection to an MX host on the SMTP port and
> # ask if a recipient is a valid user in its domain.
>
> my $proto = getprotobyname('tcp');
> socket(SERVER, AF_INET, SOCK_STREAM, $proto);
> my $iaddr = gethostbyname($smtp_server);
> my $port = getservbyname('smtp', 'tcp');
>
> my $sin = sockaddr_in($port, $iaddr);
>
> my $sreply;
>
> connect(SERVER, $sin);
> recv SERVER, $sreply, 512, 0;
>
> send SERVER, "HELO $my_domain\r\n", 0;
> recv SERVER, $sreply, 512, 0;
>
> send SERVER, "MAIL From:<$my_address>\r\n", 0;
> recv SERVER, $sreply, 512, 0;
>
> send SERVER, "RCPT To:<$recipient>\r\n", 0;
> recv SERVER, $recip_status, 512, 0;
>
> send SERVER, "QUIT\r\n", 0;
> recv SERVER, $sreply, 512, 0;
>
> close SERVER;
>
> return $recip_status;
>
> }
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/