$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 內建
缺點:無法驗證域名真實存在性
$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
若需確認具體用戶 (如 lastchiliarch) 真實存在,需連線 SMTP 伺服器執行 RCPT TO 指令,但:
<?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 | 避免同步阻塞、可控制併發 |
| 高安全需求 | 雙重驗證 (發送驗證碼郵件) | 唯一能確認用戶真實擁有郵箱 |