BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #3284同步于 2008/5/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

[合集] php中电子邮件地址验证函数

tntzwz
2008/5/27镜像同步0 回复
☆─────────────────────────────────────☆ yegle (奇峰怪石,秀山丽水) 于 (Tue Nov 27 22:18:50 2007) 提到: 嗯,最近在做个页面用到,在zend网站上找到的。相当强悍的一个代码,level3的验证居然会去查@后面的服务器是否有mx记录……囧……更不用说更高的验证了…… <?php /************************************************************************ * This function checks the format of an email address. There are five levels of * checking: * * 1 - Basic format checking. Ensures that: * There is an @ sign with something on the left and something on the right * To the right of the @ sign, there's at least one dot, with something to the left and right. * To the right of the last dot is either 2 or 3 letters, or the special case "arpa" * 2 - The above, plus the letters to the right of the last dot are: * com, net, org, edu, mil, gov, int, arpa or one of the two-letter country codes * 3 - The above, plus attempts to check if there is an MX (Mail eXchange) record for the * domain name. * 4 - The above, plus attempt to connect to the mail server * 5 - The above, plus check to see if there is a response from the mail server. The third * argument to this function is optional, and sets the number of times to loop while * waiting for a response from the mail server. The default is 15000. The actual waiting * time, of course, depends on such things as the speed of your server. * * Level 1 is bulletproof: if the address fails this level, it's bad. Level 2 is still * pretty solid, but less certain: there could be valid TLDs overlooked when writing * this function, or new ones could be added. Level 3 is even less certain: there are * a number of things that could prevent finding an MX record for a valid address * at any given time. 4 and 5 are even less certain still. Ultimately, the only absolutely * positive way to test an email address is to send something to it. * * The function returns 0 for a valid address, or the level at which it failed, for an * invalid address. * ************************************************************************/ function MailVal($Addr, $Level, $Timeout = 15000) { // Valid Top-Level Domains $gTLDs = "com:net:org:edu:gov:mil:int:arpa:"; $CCs = "ad:ae:af:ag:ai:al:am:an:ao:aq:ar:as:at:au:aw:az:ba:bb:bd:be:bf:". "bg:bh:bi:bj:bm:bn:bo:br:bs:bt:bv:bw:by:bz:ca:cc:cf:cd:cg:ch:ci:". "ck:cl:cm:cn:co:cr:cs:cu:cv:cx:cy:cz:de:dj:dk:dm:do:dz:ec:ee:eg:". "eh:er:es:et:fi:fj:fk:fm:fo:fr:fx:ga:gb:gd:ge:gf:gh:gi:gl:gm:gn:". "gp:gq:gr:gs:gt:gu:gw:gy:hk:hm:hn:hr:ht:hu:id:ie:il:in:io:iq:ir:". "is:it:jm:jo:jp:ke:kg:kh:ki:km:kn:kp:kr:kw:ky:kz:la:lb:lc:li:lk:". "lr:ls:lt:lu:lv:ly:ma:mc:md:mg:mh:mk:ml:mm:mn:mo:mp:mq:mr:ms:mt:". "mu:mv:mw:mx:my:mz:na:nc:ne:nf:ng:ni:nl:no:np:nr:nt:nu:nz:om:pa:". "pe:pf:pg:ph:pk:pl:pm:pn:pr:pt:pw:py:qa:re:ro:ru:rw:sa:sb:sc:sd:". "se:sg:sh:si:sj:sk:sl:sm:sn:so:sr:st:su:sv:sy:sz:tc:td:tf:tg:th:". "tj:tk:tm:tn:to:tp:tr:tt:tv:tw:tz:ua:ug:uk:um:us:uy:uz:va:vc:ve:". "vg:vi:vn:vu:wf:ws:ye:yt:yu:za:zm:zr:zw:"; // The countries can have their own 'TLDs', e.g. mydomain.com.au $cTLDs = "com:net:org:edu:gov:mil:co:ne:or:ed:go:mi:"; $fail = 0; // Shift the address to lowercase to simplify checking $Addr = strtolower($Addr); // Split the Address into user and domain parts $UD = explode("@", $Addr); if (sizeof($UD) != 2 || !$UD[0]) $fail = 1; // Split the domain part into its Levels $Levels = explode(".", $UD[1]); $sLevels = sizeof($Levels); if ($sLevels < 2) $fail = 1; // Get the TLD, strip off trailing ] } ) > and check the length $tld = $Levels[$sLevels-1]; $tld = ereg_replace("[>)}]$|]$", "", $tld); if (strlen($tld) < 2 || strlen($tld) > 3 && $tld != "arpa") $fail = 1; $Level--; // If the string after the last dot isn't in the generic TLDs or country codes, it's invalid. if ($Level && !$fail) { $Level--; if (!ereg($tld.":", $gTLDs) && !ereg($tld.":", $CCs)) $fail = 2; } // If it's a country code, check for a country TLD; add on the domain name. if ($Level && !$fail) { $cd = $sLevels - 2; $domain = $Levels[$cd].".".$tld; if (ereg($Levels[$cd].":", $cTLDs)) { $cd--; $domain = $Levels[$cd].".".$domain; } } // See if there's an MX record for the domain if ($Level && !$fail) { $Level--; if (!getmxrr($domain, $mxhosts, $weight)) $fail = 3; } // Attempt to connect to port 25 on an MX host if ($Level && !$fail) { $Level--; while (!$sh && list($nul, $mxhost) = each($mxhosts)) $sh = fsockopen($mxhost, 25); if (!$sh) $fail = 4; } // See if anyone answers if ($Level && !$fail) { $Level--; set_socket_blocking($sh, false); $out = ""; $t = 0; while ($t++ < $Timeout && !$out) $out = fgets($sh, 256); if (!ereg("^220", $out)) $fail = 5; } if ($sh) fclose($sh); return $fail; } //MailVal ?> Usage Example <? if (MailVal($Address, 2)) echo "Invalid address"; ?> ☆─────────────────────────────────────☆ loveloop (把爱洒遍世界) 于 (Thu Nov 29 18:36:49 2007) 提到: 其实这是一种很不科学的办法,相信没有哪个网站会把这种方法用来去验证一个电子邮件的地址。最简单的方法还是目前的电子邮件激活法,方便,准确 ☆─────────────────────────────────────☆ yegle (奇峰怪石,秀山丽水) 于 (Thu Nov 29 18:46:48 2007) 提到: 自己做一个高中同学聚会的报名用到这个,地址就不用验证地这么准确了…… 【 在 loveloop (把爱洒遍世界) 的大作中提到: 】 : 其实这是一种很不科学的办法,相信没有哪个网站会把这种方法用来去验证一个电子邮件的地址。最简单的方法还是目前的电子邮件激活法,方便,准确
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。