for a valid address...Remote: 554 <**@**.com>: Relay access denied
**@**.com does not return valid
E-mail Checking
Moderator: General Moderators
- tecktalkcm0391
- DevNet Resident
- Posts: 1030
- Joined: Fri May 26, 2006 9:25 am
- Location: Florida
Well number one was my first suggestion. Number 3 I agree and don't use this. Number 2 the majority of mail exchangers reject based on RCPT being invalid, in my experience about 80% but I am yet to come across a mail server that sends a 5xx after the email is sent. If a 250 is sent on RCPT no indication of false address is sent later although the server might be set up to bounce the email after the connection has been closed.d11wtq wrote:1. Send an email and ask for a reply
2. Hope the server informs you if the RCPT envelope doesn't exist before DATA is sent
3. Hope the server accepts VRFY as a command
-
Robert Plank
- Forum Contributor
- Posts: 110
- Joined: Sun Dec 26, 2004 9:04 pm
- Contact:
I liked that script better when it was a PHPBuilder article in 1999-ish. Asking the mail server to validate the user isn't reliable anymore, thanks to spam countermeasures. Just check the string for an @ sign and be done with it.Everah wrote:That is freaking sweet! Have you ever opened that code or published it? Me thinks it would be a nice fit in the PHPClasses.org library.
- RobertGonzalez
- Site Administrator
- Posts: 14293
- Joined: Tue Sep 09, 2003 6:04 pm
- Location: Fremont, CA, USA
This should probably be in code snippets or something...
Code: Select all
<?php
// Copyright (C) 2001 Ron Harwood and L. Patrick Smallwood
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// File: functions/validateemailformat.php
function validateEmailFormat ( $email ) {
// Some shortcuts for avoiding <span style='color:blue' title='I'm naughty, are you naughty?'>smurf</span>
$esc = '\\\\'; $Period = '\.';
$space = '\040'; $tab = '\t';
$OpenBR = '\['; $CloseBR = '\]';
$OpenParen = '\('; $CloseParen = '\)';
$NonASCII = '\x80-\xff'; $ctrl = '\000-\037';
$CRlist = '\n\015'; // note: this should really be only \015.
// Items 19, 20, 21 -- see table on page 295 of 'Mastering Regular Expressions'
$qtext = "[^$esc$NonASCII$CRlist\"]"; // for within "..."
$dtext = "[^$esc$NonASCII$CRlist$OpenBR$CloseBR]"; // for within [...]
$quoted_pair = " $esc [^$NonASCII] "; // an escaped character
// *********************************************
// Items 22 and 23, comment.
// Impossible to do properly with a regex, I make do by allowing at most
// one level of nesting.
$ctext = " [^$esc$NonASCII$CRlist()] ";
// $Cnested matches one non-nested comment.
// It is unrolled, with normal of $ctext, special of $quoted_pair.
$Cnested = "";
$Cnested .= "$OpenParen"; // (
$Cnested .= "$ctext*"; // normal*
$Cnested .= "(?: $quoted_pair $ctext* )*"; // (special normal*)*
$Cnested .= "$CloseParen"; // )
// $comment allows one level of nested parentheses
// It is unrolled, with normal of $ctext, special of ($quoted_pair|$Cnested)
$comment = "";
$comment .= "$OpenParen"; // (
$comment .= "$ctext*"; // normal*
$comment .= "(?:"; // (
$comment .= "(?: $quoted_pair | $Cnested )"; // special
$comment .= "$ctext*"; // normal*
$comment .= ")*"; // )*
$comment .= "$CloseParen"; // )
// *********************************************
// $X is optional whitespace/comments
$X = "";
$X .= "[$space$tab]*"; // Nab whitespace
$X .= "(?: $comment [$space$tab]* )*"; // If comment found, allow more spaces
// Item 10: atom
$atom_char = "[^($space)<>\@,;:\".$esc$OpenBR$CloseBR$ctrl$NonASCII]";
$atom = "";
$atom .= "$atom_char+"; // some number of atom characters ...
$atom .= "(?!$atom_char)"; // ... not followed by something that
// could be part of an atom
// Item 11: doublequoted string, unrolled.
$quoted_str = "";
$quoted_str .= "\""; // "
$quoted_str .= "$qtext *"; // normal
$quoted_str .= "(?: $quoted_pair $qtext * )*"; // ( special normal* )*
$quoted_str .= "\""; // "
// Item 7: word is an atom or quoted string
$word = "";
$word .= "(?:";
$word .= "$atom"; // Atom
$word .= "|"; // or
$word .= "$quoted_str"; // Quoted string
$word .= ")";
// Item 12: domain-ref is just an atom
$domain_ref = $atom;
// Item 13: domain-literal is like a quoted string, but [...] instead of "..."
$domain_lit = "";
$domain_lit .= "$OpenBR"; // [
$domain_lit .= "(?: $dtext | $quoted_pair )*"; // stuff
$domain_lit .= "$CloseBR"; // ]
// Item 9: sub-domain is a domain-ref or a domain-literal
$sub_domain = "";
$sub_domain .= "(?:";
$sub_domain .= "$domain_ref";
$sub_domain .= "|";
$sub_domain .= "$domain_lit";
$sub_domain .= ")";
$sub_domain .= "$X"; // optional trailing comments
// Item 6: domain is a list of subdomains separated by dots
$domain = "";
$domain .= "$sub_domain";
$domain .= "(?:";
$domain .= "$Period $X $sub_domain";
$domain .= ")*";
// Item 8: a route. A bunch of "@ $domain" separated by commas, followed by a colon.
$route = "";
$route .= "\@ $X $domain";
$route .= "(?: , $X \@ $X $domain )*"; // additional domains
$route .= ":";
$route .= "$X"; // optional trailing comments
// Item 5: local-part is a bunch of $word separated by periods
$local_part = "";
$local_part .= "$word $X";
$local_part .= "(?:";
$local_part .= "$Period $X $word $X"; // additional words
$local_part .= ")*";
// Item 2: addr-spec is local@domain
$addr_spec = "$local_part \@ $X $domain";
// Item 4: route-addr is <route? addr-spec>
$route_addr = "";
$route_addr .= "< $X";
$route_addr .= "(?: $route )?"; // optional route
$route_addr .= "$addr_spec"; // address spec
$route_addr .= ">";
// Item 3: phrase........
$phrase_ctrl = '\000-\010\012-\037'; // like ctrl, but without tab
// Like atom-char, but without listing space, and uses phrase_ctrl.
// Since the class is negated, this matches the same as atom-char plus space and tab
$phrase_char = "[^()<>\@,;:\".$esc$OpenBR$CloseBR$NonASCII$phrase_ctrl]";
// We've worked it so that $word, $comment, and $quoted_str to not consume trailing $X
// because we take care of it manually.
$phrase = "";
$phrase .= "$word"; // leading word
$phrase .= "$phrase_char *"; // "normal" atoms and/or spaces
$phrase .= "(?:";
$phrase .= "(?: $comment | $quoted_str )"; // "special" comment or quoted string
$phrase .= "$phrase_char *"; // more "normal"
$phrase .= ")*";
// Item 1: mailbox is an addr_spec or a phrase/route_addr
$mailbox = "";
$mailbox .= "$X"; // optional leading comment
$mailbox .= "(?:";
$mailbox .= "$addr_spec"; // address
$mailbox .= "|"; // or
$mailbox .= "$phrase $route_addr"; // name and address
$mailbox .= ")";
// test it and return results
$isValid = preg_match("/^$mailbox$/xS",$email);
return($isValid);
} // END validateEmailFormat
?>I generally link to it, so as not to clutter the forums, and so that people can get updates if there are some in the future. Not to mention, they can also look at the rest of the code in the game.astions wrote:This should probably be in code snippets or something...
http://svn.sourceforge.net/viewcvs.cgi/ ... iew=markup