如何编写代码来检查电子邮件是否存在?例如,donkey_sdh123 @ gmail.com,donkey_sdh123 @ yahoo.com或donkey_sdh123@lycos.com所有这些电子邮件都不存在于gmail,yahoo和lycos数据库中。
查看截图。 donkey_sdh123@gmail.com很糟糕。这意味着它不存在。我怎样才能在我的项目中实现同样的东西?
javascript,jquery shell脚本,c或c ++是受欢迎的。没有.net。
答案 0 :(得分:6)
简而言之:这是不可能的。最多可以尝试检查相关域是否有MX记录并尝试连接到其邮件服务器。即使这样也不能保证它处于工作状态。
您绝对无法以某种标准化的方式检查其上是否存在特定的电子邮件,因为许多服务器采用了许多伪装和别名的方法。由于VRFY
和MAIL
/ RCPT
中的多种原因,服务器可以并且将在SMTP中将不存在的地址报告为有效。您可以获得的唯一明确答案是,如果电子邮件被MAIL
/ RCPT
拒绝,则该电子邮件无效,但被接受并不能证明其有效,因为它可以被拒绝电子邮件处理线。在没有实际发送任何内容的情况下滥用MAIL
/ RCPT
也可能导致您被阻止。
如果您想验证用户提供的电子邮件,最好的方法是在那里发送确认信。
您还应该检查是否确实需要确认的工作电子邮件。
答案 1 :(得分:5)
当我需要测试电子邮件是否存在时,我总是回到以下文章:http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/
答案 2 :(得分:2)
请参阅此代码,我是从网上获得的。
class SmtpValidator {
private $options = array(
"port" => 25,
"timeout" => 1, // Connection timeout to remote mail server.
"sender" => "info@webtrafficexchange.com",
"short_response" => false,
);
/**
* Override the options for those specified.
*/
function __construct($options = null) {
if (!empty($options)) {
if (is_array($options)) {
foreach ($options as $key => $value) {
$this->options[$key] = $value;
}
}
}
}
/**
* Validate the email address via SMTP.
* If 'shore_response' is true, the method will return true or false;
* Otherwise, the entire array of useful information will be provided.
*/
public function validate($email, $options = null) {
$result = array("valid" => false);
$errors = array();
// Email address (format) validation
if (empty($email)) {
$errors = array("Email address is required.\n");
} else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors = array("Invalid email address.\n");
} else {
list($username, $hostname) = split('@', $email);
if (function_exists('getmxrr')) {
if (getmxrr($hostname, $mxhosts, $mxweights)) {
$result['mx_records'] = array_combine($mxhosts, $mxweights);
asort($result['mx_records']);
} else {
$errors = "No MX record found.";
}
}
foreach ($mxhosts as $host) {
$fp = @fsockopen($host, $this->options['port'], $errno, $errstr,
$this->options['timeout']);
if ($fp) {
$data = fgets($fp);
$code = substr($data, 0, 3);
if($code == '220') {
$sender_domain = split('@', $this->options['sender']);
fwrite($fp, "HELO {$sender_domain}\r\n");
fread($fp, 4096);
fwrite($fp, "MAIL FROM: <{$this->options['sender']}>\r\n");
fgets($fp);
fwrite($fp, "RCPT TO:<{$email}>\r\n");
$data = fgets($fp);
$code = substr($data, 0, 3);
$result['response'] = array("code" => $code, "data" => $data);
fwrite($fp, "quit\r\n");
fclose($fp);
switch ($code) {
case "250": // We're good, so exit out of foreach loop
case "421": // Too many SMTP connections
case "450":
case "451": // Graylisted
case "452":
$result['valid'] = true;
break 2; // Assume 4xx return code is valid.
default:
$errors[] = "({$host}) RCPT TO: {$code}: {$data}\n";
}
} else {
$errors[] = "MTA Error: (Stream: {$data})\n";
}
} else {
$errors[] = "{$errno}: $errstr\n";
}
}
}
if (!empty($errors)) {
$result['errors'] = $errors;
}
return ($this->options['short_response']) ? $result['valid'] : $result;
}
}
答案 3 :(得分:1)
可以通过telnet连接到远程smtp服务器:
http://www.yuki-onna.co.uk/email/smtp.html
唯一的问题是许多邮件服务器不接受smtp(例如yahoo),并且由于有关地址是否对垃圾邮件发送者有价值的信息,因此很容易发现存在哪些电子邮件地址不符合任何电子邮件主机的利益
您可以使用ping或其他网络扫描对域名是否存在进行基本检查,并且您可以使用Google API搜索电子邮件地址,以防在互联网上以明文形式列出。但是你和那里的所有诈骗者做同样的事情,所以这可能不值得尝试。
另一件需要注意的事情是,许多电子邮件提供商允许用户提供衍生,临时或别名地址,这些地址可以在有限的时间内使用或使用,但不是邮箱本身。在这种情况下,即使用户会收到发送给它的电子邮件,即使是有效的检查员也会认为该地址不存在。
由于过期的地址可能不会被释放(为了防止人们获得以前用户的邮件),因此会出现误报的来源(检查是的但是错误),以及误报(检查说不,但这是错误的),以及像垃圾邮件发送者一样被处理的所有摩擦。