<?php
/**
* 完整郵箱驗證
* @param string $email
* @return bool
*/
function validateEmail(string $email): bool {
// 1. 格式驗證(簡化版,覆蓋 99% 合法地址)
// 更嚴格可用 filter_var($email, FILTER_VALIDATE_EMAIL)
$pattern = '/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i';
if (!preg_match($pattern, $email)) {
return false;
}
// 2. 域名 MX 記錄驗證
$domain = substr(strrchr($email, '@'), 1); // 取 @ 後部分
if (!checkMX($domain)) {
return false;
}
return true;
}
/**
* 檢查域名是否存在 MX 記錄
* Windows 下 checkdnsrr() 可能不可用,提供 fallback
*/
function checkMX(string $domain): bool {
if (function_exists('checkdnsrr')) {
return checkdnsrr($domain, 'MX');
}
// Windows 兼容:使用 nslookup 解析
$output = [];
$resultCode = 0;
exec("nslookup -type=MX " . escapeshellarg($domain), $output, $resultCode);
if ($resultCode !== 0) return false;
foreach ($output as $line) {
if (stripos($line, 'mail exchanger') !== false || stripos($line, 'MX preference') !== false) {
return true;
}
}
return false;
}
function myCheckDNSRR(string $host, string $type = 'MX'): bool {
if (!function_exists('checkdnsrr')) {
// 純 PHP 實現(需啟用 dns 相關擴展或 exec 權限)
$records = dns_get_record($host, DNS_MX);
return !empty($records);
}
return checkdnsrr($host, $type);
}
$emails = [
'test@example.com',
'invalid-email',
'user@nonexistent-domain-12345.xyz',
'admin@gmail.com',
];
foreach ($emails as $email) {
$valid = validateEmail($email);
echo "$email : " . ($valid ? '✅ 通過' : '❌ 失敗') . "\n";
}
// 輸出示例:
// test@example.com : ✅ 通過
// invalid-email : ❌ 失敗
// user@nonexistent-domain-12345.xyz : ❌ 失敗
// admin@gmail.com : ✅ 通過
僅檢查 MX 記錄不代表郵箱真實存在。極高可靠性需求(如註冊送券)可嘗試 **SMTP RCPT TO** 探測,但:
**建議**:註冊流程僅做格式 + MX 驗證,**發送驗證郵件**作為最終確認(雙重 Opt-in)。
`filter_var($email, FILTER_VALIDATE_EMAIL)` + `checkdnsrr($domain, 'MX')` 是 PHP 內置的最佳組合。Windows 環境下用 `dns_get_record()` 或 `exec('nslookup')` 兼容。切記:**郵件驗證鏈接才是唯一真理**。