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

PHP 驗證郵箱格式與域名有效性雙重檢查

     編輯:PHP 相關知識

兩級驗證策略

  1. 格式驗證:正則表達式檢查語法合規性(RFC 5322 簡化版)
  2. 域名驗證:DNS MX 記錄查詢確認域名可接收郵件

核心函數實現

<?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;
}

Windows 環境專用封裝

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 : ✅ 通過

進階:SMTP 連通性驗證(可選)

僅檢查 MX 記錄不代表郵箱真實存在。極高可靠性需求(如註冊送券)可嘗試 **SMTP RCPT TO** 探測,但:

  • 許多郵件服務器拒絕 VRFY/RCPT 探測(反垃圾策略)
  • 頻繁探測導致 IP 被列入黑名單
  • 耗時較長(需 TCP 連接、握手),不適合註冊主流程

**建議**:註冊流程僅做格式 + MX 驗證,**發送驗證郵件**作為最終確認(雙重 Opt-in)。

性能優化

  • **緩存 DNS 結果**:相同域名 1 小時內不重複查詢(Redis/Memory)。
  • **異步驗證**:前端輸入失焦發起 AJAX 驗證,不阻塞表單提交。
  • **白名單域名**:企業郵箱、常見服務商(gmail.com、qq.com、163.com 等)直接跳過 DNS 查詢。

總結

`filter_var($email, FILTER_VALIDATE_EMAIL)` + `checkdnsrr($domain, 'MX')` 是 PHP 內置的最佳組合。Windows 環境下用 `dns_get_record()` 或 `exec('nslookup')` 兼容。切記:**郵件驗證鏈接才是唯一真理**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved