有没有办法ping一封电子邮件或类似的方式来检查它是否是一个真正的有效地址?我不是在谈论正则表达式或php验证过滤器等,而是实际上检查该地址是否存在?
连接收件人邮件服务器并提供邮件,促使邮件服务器拒绝或接受邮件是可能的,但不可靠。并非所有邮件服务器都会检查地址的有效性,因此不要依赖它。类似问题在这里。
检查主机名是否存在的有用函数(90%有效!):
function validate_email($email)
{
if(!preg_match ("/^[\w\.-]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]+$/", $email))
return false;
list($prefix, $domain) = explode("@",$email);
if(function_exists("getmxrr") && getmxrr($domain, $mxhosts))
return true;
elseif (@fsockopen($domain, 25, $errno, $errstr, 5))
return true;
else
return false;
}
// pattern was taken from PHP's own source
$pattern = "/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\")|([A-Za-z0-9_][A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]*(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9\\-]))?)+[A-Za-z]+))$/D";
if (preg_match($pattern, $email)) {
/**
* allow ip address as domain OR it should be a valid TLD
*/
$long = ip2long(substr($email, strrpos($email, '@')+1));
return (($long !==FALSE && $long>-1)
|| isValidTld(substr($email, strrpos($email, '.')+1)));
}
这仍然不能保证它能正常工作,但除了发送电子邮件和捕获可能的反弹之外...这几乎就是全部(除了mx-check)...
filter_var($email, FILTER_VALIDATE_EMAIL)
有什么问题吗? - biakaveron