我有一个问题,我有一个PHP脚本来检查电子邮件地址是否存在.
但似乎雅虎,hotmail,aol和其他提供商正在接受任何电子邮件,而不是拒绝无效的电子邮件.
只有Gmail和许多像stackoverflow.com这样的域名都拒绝了没有虚假的电子邮件.
检查我的脚本,让我知道我是否可以做一些检查雅虎和其他人.
html帖子表格
<html>
<body>
<form action="checkemail.php" method="POST">
<b>E-mail</b> <input type="text" name="email">
<input type="submit">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
PHP
<?php
/* Validate an email address. */
function jValidateEmailUsingSMTP($sToEmail, $sFromDomain = "gmail.com", $sFromEmail = "email@gmail.com", $bIsDebug = false) {
$bIsValid = true; // assume the address is valid by default..
$aEmailParts = explode("@", $sToEmail); // extract the user/domain..
getmxrr($aEmailParts[1], $aMatches); // get the mx records..
if (sizeof($aMatches) == 0) {
return false; // no mx records..
}
foreach ($aMatches as $oValue) {
if ($bIsValid && !isset($sResponseCode)) {
// open the connection..
$oConnection = @fsockopen($oValue, 25, $errno, $errstr, 30);
$oResponse = @fgets($oConnection);
if (!$oConnection) {
$aConnectionLog['Connection'] = "ERROR";
$aConnectionLog['ConnectionResponse'] = $errstr;
$bIsValid = false; // unable to connect..
} else {
$aConnectionLog['Connection'] = "SUCCESS";
$aConnectionLog['ConnectionResponse'] = $errstr;
$bIsValid = true; // so far so good..
}
if (!$bIsValid) {
if ($bIsDebug) print_r($aConnectionLog);
return false;
}
// say hello to the server..
fputs($oConnection, "HELO $sFromDomain\r\n");
$oResponse = fgets($oConnection);
$aConnectionLog['HELO'] = $oResponse;
// send the email from..
fputs($oConnection, "MAIL FROM: <$sFromEmail>\r\n");
$oResponse = fgets($oConnection);
$aConnectionLog['MailFromResponse'] = $oResponse;
// send the email to..
fputs($oConnection, "RCPT TO: <$sToEmail>\r\n");
$oResponse = fgets($oConnection);
$aConnectionLog['MailToResponse'] = $oResponse;
// get the response code..
$sResponseCode = substr($aConnectionLog['MailToResponse'], 0, 3);
$sBaseResponseCode = substr($sResponseCode, 0, 1);
// say goodbye..
fputs($oConnection,"QUIT\r\n");
$oResponse = fgets($oConnection);
// get the quit code and response..
$aConnectionLog['QuitResponse'] = $oResponse;
$aConnectionLog['QuitCode'] = substr($oResponse, 0, 3);
if ($sBaseResponseCode == "5") {
$bIsValid = false; // the address is not valid..
}
// close the connection..
@fclose($oConnection);
}
}
if ($bIsDebug) {
print_r($aConnectionLog); // output debug info..
}
return $bIsValid;
}
$email = $_POST['email'];
$bIsEmailValid = jValidateEmailUsingSMTP("$email", "gmail.com", "email@gmail.com");
echo $bIsEmailValid ? "<b>Valid!</b>" : "Invalid! :(";
?>
Run Code Online (Sandbox Code Playgroud)
Pek*_*ica 12
如果您需要确定存在电子邮件地址,请向其发送电子邮件.它应包含带有随机ID的链接.只有在单击该链接并且包含正确的随机ID时,才会激活用户的帐户(或广告发布,或发送订单,或者您正在执行的任何操作).
这是验证电子邮件地址是否存在的唯一可靠方法,并确保填写表单的人员可以访问它.
Sve*_*sen 10
没有100%可靠的方法来检查电子邮件地址的有效性.但是,你可以采取一些措施来至少清除明显无效的地址.
电子邮件地址出现的问题实际上与蜗牛邮件非常相似.以下所有三点也可用于发送蜗牛邮件(只需使用物理地址更改DNS记录).
1.检查地址格式是否正确
检查电子邮件地址的格式非常困难,但PHP有一个尝试执行此操作的验证过滤器.过滤器不处理" 评论和折叠空白 ",但我怀疑有人会注意到.
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== FALSE) {
echo 'Valid email address formatting!';
}
Run Code Online (Sandbox Code Playgroud)
2.检查域名是否存在DNS记录
如果存在DNS(域名系统)记录,则至少有人设置了该记录.这并不意味着地址上有电子邮件服务器,但如果地址存在则更有可能.
$domain = substr($email, strpos($email, '@') + 1);
if (checkdnsrr($domain) !== FALSE) {
echo 'Domain is valid!';
}
Run Code Online (Sandbox Code Playgroud)
3.将确认电子邮件发送到该地址
这是查看某人是否位于电子邮件地址另一端的最有效方式.如果没有以有序的方式回复确认电子邮件 - 例如3小时 - 那么地址可能存在一些问题.
小智 6
您可以在此处使用Telnet和MX记录更多信息来验证"已使用或真实"的电子邮件,因为PHP存在一个很棒的库调用php-smtp-email-validation来简化流程.
使用文件example1.php创建一个布尔函数,并在验证电子邮件文本时调用它.对于Gmail,Hotmail,Outlook,直播和MSM我没有任何问题但是对于Yahoo和Terra,该库无法正确验证电子邮件
| 归档时间: |
|
| 查看次数: |
35769 次 |
| 最近记录: |