Mailinglisten-Archive |
follgendes php3 script sollte eigentlcih der perfekte e-mail check sein,
aber irgendwie gibt er nicht aus, kann mal jemand schauen was fehlt? Mir
fehlt noch ein groseß Stueck Verstaendnis um das zu Kapieren...:
<?php
/*
Originally
By: Jon S. Stevens jon_(at)_clearink.com
Copyright 1998 Jon S. Stevens, Clear Ink
This code has all the normal disclaimers.
It is free for any use, just keep the credits intact.
Enhancements and modifications:
By: Shane Y. Gibson shane_(at)_tuna.org
Organization: The Unix Network Archives (http://www.tuna.org./)
Date: November 16th, 1998
Changes: Added **all** comments, as original code lacked them.
Added some return codes to include a bit more description
for useability.
By : berber
Organization : webdev.berber.co.il
Date : April 10th, 1999
Changes : The script now handls all kind of domains (not only
_(at)_xxx.yyy) as before.
Added a debuging mode which also works as a verbose mode.
By : Pascal Chambenoit
Organization : Techno-Prime, France
Date : June 16th, 1999
Changes : The script now execute a "negative" check of the email
address.
As backup servers allways respond by a 250.. user known,
if a MX tell us that a user is not known, perhaps can we
trust it.
Also added a \r to all fputs because some servers doesnt
understand \n.
However, there are a few servers correctly configured on
Earth... :-)
*/
/* This function takes in an email address (say 'shane_(at)_tuna.org')
* and tests to see if it's a valid email address.
*
* An array with the results is passed back to the caller.
*
* Possible result codes for the array items are:
*
* Item 0: [true|false] true for valid email address
* false for NON-valid email address
*
* Item 1: [SMTP Code] if a valid MX mail server found, then
* fill this array in with failed SMTP
* reply codes
*
* Item 2: [true|false] true for valid mail server found for
* host/domain
* false if no valid mail server found
*
* Item 3: [MX server] if a valid MX host was found and
* connected to then fill in this item
* with the MX server hostname
*
* EXAMPLE code for use is at the very end of this function.
*/
function validateEmail ($email)
$debug_=1;
// used for SMTP HELO argument
global $SERVER_NAME;
// initialize our return array, populating with default values
$return=array(false,"","","");
// assign our user part and domain parts respectively to seperate
// variables
list($user,$domain)=split("_(at)_",$email,2);
if($debug_==1)
echo"user: $user<BR>";
echo"domain: $domain<BR>";
}
// split up the domain name into sub-parts
$arr=explode(".",$domain);
// figure out how many parts to the host/domain name portion there are
$count=count($arr);
// get our Top-Level Domain portion (i.e. foobar.org)
$tld=$arr[$count-2].".".$arr[$count-1];
// check that an MX record exists for Top-Level Domain, and if so
// start our email address checking
if (checkdnsrr($domain,"MX"))
if($debug_==1)
echo"Check DNS RR OK<BR>";
}
// Okay...valid dns reverse record; test that MX record for
// host exists, and then fill the 'mxhosts' and 'weight'
// arrays with the correct information
//
if (getmxrr($domain,$mxhosts,$weight))
if($debug_==1)
echo "MX LOOKUP RESULTS :<BR>";
for ( $i = 0; $i < count($mxhosts); $i++ )
echo " o $weight[$i]
$mxhosts[$i]<BR>";
}
echo "<b>".count($mxhosts)." mail-servers found for this
domain</b><BR>";
}
// sift through the 'mxhosts' connecting to each host
for ( $i=0; $i < count($mxhosts); $i++)
// open socket on port 25 to mxhosts, setting
// returned file pointer to the variable 'fp'
$fp = fsockopen ($mxhosts[$i], 25 );
// if the 'fp' was set, then goto work
if ($fp)
if($debug_==1)
echo"<BR><BR><h2>$mxhosts[$i]</h2>";
echo"Socket Opened successfully...<BR>";
}
// work variables
$s = 0;
$c = 0;
$out = "";
// set our created socket for 'fp' to
// non-blocking mode
// so our fgets() calls will return
// right away
set_socket_blocking ( $fp, false );
// as long as our 'out' variable has a
// null value ("")
// keep looping (do) until we get
// something
//
do
// output of the stream assigned
// to 'out' variable
$out = fgets ( $fp, 2500 );
if($debug_==1)
if($out != "") echo"out: $out<BR>";
}
// if we get an "220" code (service ready code (i.e
greeting))
// increment our work (code (c)) variable, and null
// out our output variable for a later loop test
//
if ( ereg ( "^220", $out ) )
if($debug_==1)
echo"Service ready on recipient machine.<BR>";
}
$s = 0;
$out = "";
$c++;
$return[2] = true;
$return[3] = $mxhosts[$i];
}
// elseif c is greater than 0
// and 'out' is null (""),
// we got a code back from some
// server, and we've passed
// through this loop at least
// once
//
else if (($c > 0) && ($out == ""))
$return[2] = true;
break;
}
// else increment our 's'
// counter
else
{ $s++; }
// and if 's' is 9999, break, to
// keep from looping
// infinetly
if ( $s == 9999 )
if($debug_==1)
echo"Reached maximum 10000 loops,
breaking.<BR>";
}
break;
}
} while ( $out == "" );
// reset our file pointer to blocking
// mode, so we wait
// for communication to finish before
// moving on...
set_socket_blocking ( $fp, true );
// talk to the MX mail server,
// validating ourself (HELO)
fputs ( $fp, "HELO ".$SERVER_NAME."\r\n");
if($debug_==1)
echo"<BR>HELO $SERVER_NAME<BR>";
}
// get the mail servers reply, assign to
// 'output' (ignored)
$output = fgets ( $fp, 2000 );
if($debug_==1)
echo"output : $output<BR>";
}
// give a bogus "MAIL FROM:" header to
// the server
fputs ($fp,"MAIL FROM: <info_(at)_".$domain.">\r\n");
if($debug_==1)
echo"MAIL FROM: <info_(at)_".$domain."><BR>";
}
// get output again (ignored)
$output = fgets ( $fp, 2000 );
if($debug_==1)
echo"output : $output<BR>";
}
// give RCPT TO: header for the email
// address we are testing
fputs($fp,"RCPT TO: <".$email.">\r\n");
if($debug_==1)
echo"RCPT TO: <$email><BR>";
}
// get final output for validity testing
// (used)
$output = fgets ($fp, 2000);
if($debug_==1)
echo"output : $output<BR>";
}
// test the reply code from the mail
// server for the 550 (no recipient) code
if (ereg("^550",$output))
if($debug_==1)
echo"Recipient doesnt exist<BR>";
}
// set our true/false(ness)
// array item for testing
$return[0] = false;
$return[1] = $output;
}
else
// otherwise, the address is valid,
// fillin the 2nd array item
// with the mail servers reply
// code for user to test if they
// want
$return[0] = true;
$return[1] = $output;
if($debug==1)
echo"The recipient exists <BR>";
}
}
// tell the mail server we are done
// talking to it
fputs ( $fp, "QUIT\r\n");
if($debug==1)
echo"Quit";
}
// close the file pointer
fclose($fp);
// if we got a good value break,
// otherwise, we'll keep
// trying MX records until we get a good
// value, or we
// exhaust our possible MX servers
if ($return[0] == false)
if($debug_==1)
echo"Recipient doesnt exist... Breaking";
}
break;
}
}
}
}
} else
// No MX record appears for the specified Top-Level Domain; possibly
// an invalid host/domain name was specified.
$return[0] = false;
$return[1] = "Invalid email address (bad domain name)";
$return[2] = false;
} // end if checkdnsrr()
// return the array for the user to test against
return $return;
}
?>
danke fuer jede Hilfe!
php::bar PHP Wiki - Listenarchive