我发现一些网站声称可以验证电子邮件地址是否有效。是否可以仅使用 PHP 检查电子邮件地址是否有效?
<?php
if($_POST['email'] != ''){
// The email to validate
$email = $_POST['email'];
// An optional sender
function domain_exists($email, $record = 'MX'){
list($user, $domain) = explode('@', $email);
return checkdnsrr($domain, $record);
}
if(domain_exists($email)) {
echo('This MX records exists; I will accept this email as valid.');
}
else {
echo('No MX record exists; Invalid email.');
}
}
?>
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>
这就是我现在所拥有的。它检查域是否存在,但无法检查用户的电子邮件存在于该域中。可以使用PHP来做到这一点吗?
您无法仅使用单个 PHP 方法验证(具有足够的准确性来依赖(电子邮件是否确实存在。您可以向该帐户发送电子邮件,但即使仅凭此也无法验证该帐户是否存在(见下文(。您至少可以验证它的格式至少像一个
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
//Email is valid
}
如果需要,您可以添加另一个检查。解析域,然后运行 checkdnsrr
if(checkdnsrr($domain)) {
// Domain at least has an MX record, necessary to receive email
}
许多人走到这一步,仍然不相信那里没有一些隐藏的方法。以下是一些注意事项,供您考虑是否绑定并决心验证电子邮件:
垃圾邮件发送者也知道"连接技巧"(您开始发送电子邮件并依靠服务器在此时反弹(。另一个答案链接到这个有这个警告的库
换句话说,如果存在无效地址,某些邮件服务器会静默拒绝测试邮件,以防止垃圾邮件发送者检查其用户的电子邮件并过滤有效电子邮件,因此此功能可能无法在所有邮件服务器上正常工作。
则可能不会收到无效地址响应。事实上,几乎所有的邮件服务器都带有接受所有传入邮件的选项(以下是使用 Postfix 进行操作的方法(。 链接到验证库的答案忽略了该警告。
垃圾邮件黑名单。他们按IP地址列入黑名单,如果您的服务器不断进行验证连接,您将面临在Spamhaus或其他阻止列表中结束的风险。如果您被列入黑名单,验证电子邮件地址对您有什么好处?
如果验证电子邮件地址真的那么重要,那么可接受的方法是强制用户回复电子邮件。向他们发送一封完整的电子邮件,其中包含他们必须单击才能验证的链接。它不是垃圾邮件,您可以保证任何回复都有有效的地址。
2023 年更新:今天,如果它有效的话,这会让你被阻止。请参阅评论。
您应该与 SMTP 联系。
这意味着您必须连接到该电子邮件的SMTP服务器。
连接到 SMTP 服务器后,应发送以下命令:
HELO somehostname.example
MAIL FROM: <no-reply@gmail.com>
RCPT TO: <emailtovalidate@domain.example>
如果您收到"<emailtovalidate@domain.example>中继访问被拒绝",则表示此电子邮件无效。
有一个简单的PHP类。您可以使用它:
http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html
我整个早上都在搜索相同的答案,并且几乎发现在您需要验证它时,可能无法验证您需要检查的每个电子邮件地址是否确实存在。因此,作为一种解决方法,我创建了一个简单的PHP
脚本来验证电子邮件地址的格式是否正确,并且还验证使用的域名是否正确。
GitHub
这里 https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master
<?php
# What to do if the class is being called directly and not being included in a script via PHP
# This allows the class/script to be called via other methods like JavaScript
if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])){
$return_array = array();
if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify'])){
$return_array['error'] = 1;
$return_array['message'] = 'No email address was submitted for verification';
$return_array['domain_verified'] = 0;
$return_array['format_verified'] = 0;
}else{
$verify = new EmailVerify();
if($verify->verify_formatting($_GET['address_to_verify'])){
$return_array['format_verified'] = 1;
if($verify->verify_domain($_GET['address_to_verify'])){
$return_array['error'] = 0;
$return_array['domain_verified'] = 1;
$return_array['message'] = 'Formatting and domain have been verified';
}else{
$return_array['error'] = 1;
$return_array['domain_verified'] = 0;
$return_array['message'] = 'Formatting was verified, but verification of the domain has failed';
}
}else{
$return_array['error'] = 1;
$return_array['domain_verified'] = 0;
$return_array['format_verified'] = 0;
$return_array['message'] = 'Email was not formatted correctly';
}
}
echo json_encode($return_array);
exit();
}
class EmailVerify {
public function __construct(){
}
public function verify_domain($address_to_verify){
// an optional sender
$record = 'MX';
list($user, $domain) = explode('@', $address_to_verify);
return checkdnsrr($domain, $record);
}
public function verify_formatting($address_to_verify){
if(strstr($address_to_verify, "@") == FALSE){
return false;
}else{
list($user, $domain) = explode('@', $address_to_verify);
if(strstr($domain, '.') == FALSE){
return false;
}else{
return true;
}
}
}
}
?>
截至 2023 年,应该没有可靠的技术方法来检查邮件地址的存在。如果有,这将是垃圾邮件发送者进一步垃圾邮件的好方法,因为他们可以轻松扫描有效的电子邮件。
唯一的方法是发送选择加入邮件。这不仅会检查地址是否存在,还会检查该地址是否适合该用户。如果地址存在但属于其他人,则无济于事。在欧洲等一些国家,这甚至是法律要求的。