实现思路
- 通过PHP系统函数 dns_get_record 获取邮箱的DNS解析记录
- 通过正则匹配识别邮箱的类型
1、dns_get_record
/*
php5内置系统函数
$hostname:必填参数,指定要查找其DNS资源记录的主机名。
$type:选填参数,指定要搜索的DNS记录的类型 可选值:
DNS_A
DNS_CNAME
DNS_HINFO
DNS_CAA
DNS_MX
DNS_NS
DNS_PTR
DNS_SOA
DNS_TXT
DNS_AAAA
DNS_SRV
DNS_NAPTR
DNS_A6
DNS_ALL
DNS_ANY(默认)
对应DNS解析类型,这里我们主要用到 DNS_MX 邮件交换器
*/
dns_get_record(
string $hostname,
int $type = DNS_ANY,
array &$authoritative_name_servers = null,
array &$additional_records = null,
bool $raw = false
): array|false
2、代码实现
<?php
class DnsAnalysis
{
protected function analysis(string $email, int $type = DNS_MX)
{
$emailRegex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/';
if (empty($email) || !preg_match($emailRegex, $email)) return '邮箱格式错误';
list($prefix, $domain) = explode('@', $email);
$result = dns_get_record($domain, $type);
if (empty($result)) return '未检测到域名解析';
$first = current($result);
if (preg_match('/^mx(\d*).qq.com$/', $first['target'])) {
return 'QQ邮箱';
} else if (preg_match('/^mxbiz(\d*).qq.com$/', $first['target'])) {
return '腾讯企业邮箱';
} else if (preg_match('/^163mx(\d*).mxmail.netease.com$/', $first['target'])) {
return '163邮箱';
} else if (preg_match('/^mx(\d*).qiye.163.com$/', $first['target'])) {
return '163企业邮箱';
} else if (preg_match('/^126mx(\d*).mxmail.netease.com$/', $first['target'])) {
return '126邮箱';
} else if (preg_match('/^mx(\d*).mail.aliyun.com$/', $first['target'])) {
return '阿里云邮箱';
}
return '未知类型';
}
public function index()
{
$email = '123@163.com';
echo $this->analysis($email);
}
}
3、常用邮箱DNS记录数据
163邮箱:
163mx00.mxmail.netease.com
163mx01.mxmail.netease.com
163mx02.mxmail.netease.com
163mx03.mxmail.netease.com
163企业邮箱:
mx.qiye.163.com
mx2.qiye.163.com
126邮箱:
126mx00.mxmail.netease.com
126mx01.mxmail.netease.com
126mx02.mxmail.netease.com
126mx03.mxmail.netease.com
QQ邮箱:
mx1.qq.com
mx2.qq.com
mx3.qq.com
腾讯企业邮箱:
mxbiz1.qq.com
mxbiz2.qq.com
阿里云邮箱:
mx2.mail.aliyun.com