PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!
I'm on a mission to find/write/derive the best e-mail address verification possible.
Here's what I have so far; keep in mind that I want to avoid the MX check if the email address isn't in the correct form in the first place (that's why I have a nested "if" instead of one).
# email class to check for valid email address strings
class email {
# get email patern
var $emailpattern = "^[a-z0-9]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*.[a-z]{2,3}$";
# check for valid email function
function checkemail ($emailaddr) {
# test if email is valid, and return results
if( eregi($this->emailpattern, $emailaddr)) {
# email verified, setup to check dns
$emailarray = explode("@", $emailaddr);
# verify email dns exists
if (checkdnsrr($emailarray[1])) {
return TRUE;
}
} else {
return FALSE;
} # end if eregi
} # end check email function
} # end email class
/*
SAMLPE USAGE OF CHECK EMAIL CLASS
$email = new email;
$check = $email->checkemail($email);
if (!$check) {
print ("That email address is invalid.\n");
exit;
}
*/
CyberSpatium wrote:Here is your code formated into a class.
...
Cyber
There is a problem with this. Let's say the email passed the syntax check but not the MX record lookup. You wouldn't be returning FALSE... it would just not return anything. That's why I put the return FALSE outside of any "if" or "else". In the case that the email fals the syntax check or the MX lookup, it will simply return false, and since the return TRUE terminates the execution of the rest of the function, it is not necessary to "skip over" the return FALSE with an else.
By the way, I have a much better regular expression now:
The idea behind mine is that after the syntax is checked, the server does an actual check to see if the domain exists and is capable of recieving email. That's what the checkdnsrr() function is for.
Does anyone have any ideas on how to improve this snippet of code even more? Aside from the coding style, that is. Any new things to add to further verify?
slimsam1 wrote:Does anyone have any ideas on how to improve this snippet of code even more? Aside from the coding style, that is. Any new things to add to further verify?
/* =======================================================================
ifsnow's email valid check function SnowCheckMail Ver 0.1
funtion SnowCheckMail ($Email,$Debug=false)
$Email : E-Mail address to check.
$Debug : Variable for debugging.
* Can use everybody if use without changing the name of function.
Reference : O'REILLY - Internet Email Programming
HOMEPAGE : http://www.hellophp.com
ifsnow is korean phper. Is sorry to be unskillful to English. *^^*;;
========================================================================= */
function SnowCheckMail($Email,$Debug=false)
{
global $HTTP_HOST;
$Return =array();
// Variable for return.
// $Return[0] : [true|false]
// $Return[1] : Processing result save.
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $Email)) {
$Return[0]=false;
$Return[1]="${Email} is E-Mail form that is not right.";
if ($Debug) echo "Error : {$Email} is E-Mail form that is not right.<br>";
return $Return;
}
else if ($Debug) echo "Confirmation : {$Email} is E-Mail form that is not right.<br>";
// E-Mail @ by 2 by standard divide. if it is $Email this "lsm@ebeecomm.com"..
// $Username : lsm
// $Domain : ebeecomm.com
// list function reference : http://www.php.net/manual/en/function.list.php
// split function reference : http://www.php.net/manual/en/function.split.php
list ( $Username, $Domain ) = split ("@",$Email);
// That MX(mail exchanger) record exists in domain check .
// checkdnsrr function reference : http://www.php.net/manual/en/function.checkdnsrr.php
if ( checkdnsrr ( $Domain, "MX" ) ) {
if($Debug) echo "Confirmation : MX record about {$Domain} exists.<br>";
// If MX record exists, save MX record address.
// getmxrr function reference : http://www.php.net/manual/en/function.getmxrr.php
if ( getmxrr ($Domain, $MXHost)) {
if($Debug) {
echo "Confirmation : Is confirming address by MX LOOKUP.<br>";
for ( $i = 0,$j = 1; $i < count ( $MXHost ); $i++,$j++ ) {
echo " Result($j) - $MXHost[$i]<BR>";
}
}
}
// Getmxrr function does to store MX record address about $Domain in arrangement form to $MXHost.
// $ConnectAddress socket connection address.
$ConnectAddress = $MXHost[0];
}
else {
// If there is no MX record simply @ to next time address socket connection do .
$ConnectAddress = $Domain;
if ($Debug) echo "Confirmation : MX record about {$Domain} does not exist.<br>";
}
// fsockopen function reference : http://www.php.net/manual/en/function.fsockopen.php
$Connect = fsockopen ( $ConnectAddress, 25 );
// Success in socket connection
if ($Connect)
{
if ($Debug) echo "Connection succeeded to {$ConnectAddress} SMTP.<br>";
// Judgment is that service is preparing though begin by 220 getting string after connection .
// fgets function reference : http://www.php.net/manual/en/function.fgets.php
if ( ereg ( "^220", $Out = fgets ( $Connect, 1024 ) ) ) {
// Inform client's reaching to server who connect.
fputs ( $Connect, "HELO $HTTP_HOST\r\n" );
if ($Debug) echo "Run : HELO $HTTP_HOST<br>";
$Out = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Inform sender's address to server.
fputs ( $Connect, "MAIL FROM: <{$Email}>\r\n" );
if ($Debug) echo "Run : MAIL FROM: <{$Email}><br>";
$From = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Inform listener's address to server.
fputs ( $Connect, "RCPT TO: <{$Email}>\r\n" );
if ($Debug) echo "Run : RCPT TO: <{$Email}><br>";
$To = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Finish connection.
fputs ( $Connect, "QUIT\r\n");
if ($Debug) echo "Run : QUIT<br>";
fclose($Connect);
// Server's answering cord about MAIL and TO command checks.
// Server about listener's address reacts to 550 codes if there does not exist
// checking that mailbox is in own E-Mail account.
if ( !ereg ( "^250", $From ) || !ereg ( "^250", $To )) {
$Return[0]=false;
$Return[1]="${Email} is address done not admit in E-Mail server.";
if ($Debug) echo "{$Email} is address done not admit in E-Mail server.<br>";
return $Return;
}
}
}
// Failure in socket connection
else {
$Return[0]=false;
$Return[1]="Can not connect E-Mail server ({$ConnectAddress}).";
if ($Debug) echo "Can not connect E-Mail server ({$ConnectAddress}).<br>";
return $Return;
}
$Return[0]=true;
$Return[1]="{$Email} is E-Mail address that there is no any problem.";
return $Return;
}