17

场景:
我的网络应用程序上有一个联系表,它收到很多垃圾邮件。
我正在松散地验证电子邮件地址的格式,即 ^.+@.+\..+$
我正在使用垃圾邮件过滤服务 (defensio),但返回的垃圾邮件分数与有效邮件重叠。在 0.4 的阈值下,一些垃圾邮件通过,一些客户的问题被错误地抛出日志并显示错误。

所有垃圾邮件都使用虚假的电子邮件地址,例如 zxmzxm@ywduasm.com

美国的专用 PHP5 Linux 服务器,mysql,仅记录垃圾邮件,通过电子邮件发送非垃圾邮件(未存储)。

建议: 使用 phpcheckdnsrr(preg_replace(/^.+?@/, '', $_POST['email']), 'MX')检查电子邮件域是否解析为有效地址,登录到文件,然后针对无法解析的消息重定向错误,然后像以前一样继续使用垃圾邮件过滤器服务来处理根据checkdnsrr().

我已经读过(我本人对此持怀疑态度)你不应该将这种类型的验证留给远程查找,但为什么呢?

除了连接问题之外,无论如何我都会遇到比联系表格更大的问题,checkdnsrr 会遇到误报/误报吗?
会有一些地址类型无法解析吗?政府地址?ip电子邮件地址?
我是否需要转义传递给 checkdnsrr() 的主机名?

解决方案: 所有三个答案的组合(希望我可以接受多个作为复合答案)。

我在用:

$email_domain = preg_replace('/^.+?@/', '', $email).'.';
if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){
   //validation error
}

所有垃圾邮件都被记录和轮换。以期在以后升级到作业队列。

有一些评论是关于要求邮件服务器让用户验证,我觉得这将是太多的流量,可能会以某种方式让我的服务器被禁止或陷入困境,这只是为了删除大部分正在发送的电子邮件由于服务器地址无效而被退回。

http://en.wikipedia.org/wiki/Fqdn

RFC2821
The lookup first attempts to locate an MX record associated with the name.
If a CNAME record is found instead, the resulting name is processed as if 
it were the initial name.
If no MX records are found, but an A RR is found, the A RR is treated as
if it was associated with an implicit MX RR, with a preference of 0,
pointing to that host.  If one or more MX RRs are found for a given
name, SMTP systems MUST NOT utilize any A RRs associated with that
name unless they are located using the MX RRs; the "implicit MX" rule
above applies only if there are no MX records present.  If MX records
are present, but none of them are usable, this situation MUST be
reported as an error.

非常感谢所有人(尤其是 ZoogieZork 的 A 记录后备提示)

4

5 回答 5

6

我认为使用 MX 查找没有任何害处,checkdnsrr()而且我也看不到误报可能会出现。您不需要转义主机名,实际上您可以使用这种技术,并通过与 MTA 交谈并测试用户是否存在于给定主机上来更进一步(但是这种技术可能并且可能会让您有些错误一些主机的积极因素)。

于 2009-12-29T20:22:00.737 回答
5

DNS 查找有时会很慢,具体取决于网络流量和拥塞情况,因此需要注意这一点。

如果我在你的鞋子里,我会测试一下,看看效果如何。大约一周左右,将所有电子邮件记录到数据库或日志文件中,并包含一个字段以指示它是否会被标记为垃圾邮件或合法电子邮件。一周结束后,看看结果,看看它的表现是否符合您的预期。

采用这种日志记录/测试方法可以让您灵活地对其进行测试,而不必担心丢失客户电子邮件。

我已经养成了在我的表单中添加一个用 CSS 隐藏的额外字段的习惯,如果它被填写,我认为它是由垃圾邮件机器人提交的。我还确保使用像“url”或“website_url”这样的名称,看起来像是垃圾邮件机器人的合法字段名称。为该字段添加一个标签,上面写着“不要填写此字段”,这样如果某人的浏览器没有正确呈现它,他们就会知道不要填写垃圾邮件字段。到目前为止,它对我来说效果很好。

于 2009-12-29T21:04:03.957 回答
3
function mxrecordValidate($email){
        list($user, $domain) = explode('@', $email);
        $arr= dns_get_record($domain,DNS_MX);
        if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){
                return $arr[0]['target'];
        }
}
$email= 'user@radiffmail.com';

if(mxrecordValidate($email)) {
        echo('This MX records exists; I will accept this email as valid.');
}
else {
        echo('No MX record exists;  Invalid email.');
}
于 2014-03-12T14:04:17.703 回答
1
//The Code *https://davidwalsh.name/php-email-validator*  
function domain_exists($email, $record = 'MX'){
    list($user, $domain) = explode('@', $email);
    return checkdnsrr($domain, $record);
}

if(domain_exists('user@davidwalsh.name')) {
    echo('This MX records exists; I will accept this email as valid.');
} else {
    echo('No MX record exists;  Invalid email.');
}
于 2019-07-04T19:40:29.083 回答
0

MX 查找只是图片的一部分,如果您想确保电子邮件地址本身是有效的,那么您需要尝试向该帐户发送电子邮件。

另一种可能的情况是,无论如何,有人可以简单地使用来自受感染机器的被劫持的电子邮件帐户。当然,这可能不太可能发生,但它仍然会发生。

有电子邮件地址验证库可以做到这一点,只需搜索电子邮件验证。

所有这些都可以异步完成。我在我的站点上进行了此设置,在这种情况下,电子邮件保存在数据库中(出于审核目的),一个作业排队,然后当该作业执行时,将在该时间点执行任何额外的验证。它将繁重的工作转移到另一个线程。

对用户来说,它看起来好像电子邮件已经发送,它是(它在数据库中),并且可以在内部查看,但实际的电子邮件不会被邮寄出去,直到该作业执行,可以立即或某些设置时间量取决于服务器负载。

沃尔特

于 2009-12-29T21:25:58.610 回答