首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 郵箱地址驗證完整方案:filter_var、checkdnsrr、正則表達式三層防護

     編輯:PHP 綜合知識

三層驗證策略

第一層:filter_var 格式驗證 (PHP 內建)

$email = "lastchiliarch@163.com";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // string(21) "lastchiliarch@163.com"

$email = "asb";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // bool(false)

$email = "1@a.com";
var_dump(filter_var($email, FILTER_VALIDATE_EMAIL)); // string(7) "1@a.com" (通過但域名可能不存在)

優點:無需寫正則、效能高、PHP 內建
缺點:無法驗證域名真實存在性

第二層:checkdnsrr 域名 MX 記錄驗證

$email = "lastchiliarch@163.com";
var_dump(checkdnsrr(array_pop(explode("@", $email)), "MX")); // bool(true)

$email = "1@a.com";
var_dump(checkdnsrr(array_pop(explode("@", $email)), "MX")); // bool(false)

原理:查詢域名 MX (Mail Exchange) 記錄是否存在
缺點:網路請求較慢、不適合大量同步驗證、無法確認具體用戶存在

第三層:組合驗證 (推薦生產環境)

$email_arr = ["lastchiliarch@163.com", "1@a.com"];
foreach ($email_arr as $email) {
    // 第一層:格式檢查
    if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
        echo "invalid format: $email\n";
        continue;
    }
    // 第二層:域名 MX 記錄
    $domain = array_pop(explode("@", $email));
    if (checkdnsrr($domain, "MX") === false) {
        echo "invalid domain: $email\n";
        continue;
    }
    echo "valid: $email\n";
}
// 輸出: invalid domain: 1@a.com

更精確驗證:SMTP 連線驗證用戶存在性

若需確認具體用戶 (如 lastchiliarch) 真實存在,需連線 SMTP 伺服器執行 RCPT TO 指令,但:

  • 許多郵件伺服器禁止 VRFY/RCPT 掃描
  • 可能被判定為垃圾郵件行為導致 IP 封鎖
  • 實作複雜度高,一般不建議

正則表達式驗證 (傳統表單驗證)

<?php
header("Content-Type: text/html; charset=UTF-8");
$reply = "";
if (isset($_POST["email_address"])) {
    $email = $_POST["email_address"];
    // 正則:用戶名@域名.後綴(可含二級域名)
    $pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
    if (preg_match($pattern, $email)) {
        $reply = "電子郵件地址合法<br><br>\n";
        $user = preg_replace($pattern, "$1", $email);
        $domain = preg_replace($pattern, "$2", $email);
        $reply .= "用戶名:$user<br>\n域名:$domain<br>\n";
    } else {
        $reply = "電子郵件地址不合法";
    }
}
?>
<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml">
<head><title>電子郵件地址驗證</title></head>
<body style="text-align:center;">
<h1>電子郵件地址驗證程序</h1>
<form action="#" method="post">
請輸入電子郵件地址:<input name="email_address" type="text" style="width:300px;" /><br>
<input type="submit" value="驗證" />
</form>
<?php echo $reply; ?>
</body></html>

驗證方案選擇指南

場景推薦方案理由
註冊表單即時驗證filter_var + 前端 JS 正則快速、無網路延遲、用戶體驗佳
後端註冊處理filter_var + checkdnsrr攔截明顯偽造域名
大量郵箱清洗filter_var 批次 + 異步 checkdnsrr避免同步阻塞、可控制併發
高安全需求雙重驗證 (發送驗證碼郵件)唯一能確認用戶真實擁有郵箱

最佳實踐建議

  1. 永遠發送驗證郵件:格式/域名驗證只能輔助,唯有驗證碼能確認擁有權
  2. 前後端雙重驗證:前端攔截明顯錯誤,後端做嚴格檢查
  3. 非同步處理 checkdnsrr:佇列任務、限流、重試機制
  4. 緩存驗證結果:同域名多次驗證時複用 MX 查詢結果
  5. 記錄驗證日誌:分析無效郵箱來源、優化註冊流程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved