1

我正在使用 PHP 的 SwiftMailer 库批量发送电子邮件(遵循 CANSPAM 和 RFC)。

一切正常,直到我遇到在 DNS 中没有相应 MX 条目的域。那时,我的脚本只是挂起——我假设这是因为 sendmail 没有返回。这可以持续几分钟,也可以持续数小时。

我已经确认我的脚本(斜线 sendmail)挂起的地址是那些没有 DNS MX 条目的地址。其他一切都很好。

在我尝试发送消息之前,有没有办法可以检查 PHP 中是否存在 DNS MX?这是可扩展的(即,在 DNS 上的额外查找真的会减慢我的速度吗,或者它会很好 b/c 然后 MX 在本地缓存以供 sendmail 用于传递消息)?

谢谢你的帮助

--- 更新 --- 我尝试了以下解决方案,这帮助我缩小了问题的范围。看来这不是 MX 条目是否存在的问题。问题是 DNS 查找需要永远返回。有没有一种简单的方法可以设置超时,所以如果 DNS 在 < 5 秒内没有返回,我可以继续吗?

4

3 回答 3

3
getmxrr(substr($email,strrpos($email,'@')+1),$hosts);
if (!$hosts)
    echo 'No MX record found';

您也可以尝试这样做以防止阻塞(没有调整getmxrr超时的选项):

if (!@fsockopen(substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5))
    echo 'No MX record found';
于 2010-11-10T19:28:08.673 回答
2

您可以使用getmxrr

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}
于 2010-11-10T19:27:17.463 回答
1

DNS 查找在重复请求时可以很好地扩展。最近的 DNS 服务器会将查找到的值缓存一段时间。使用本地 DNS 缓存服务器可以提高性能,但会使用更多内存(取决于软件和缓存的地址数量,有一点或很多。

如果我没记错 RFC,那么带有 A 记录的主机也应该是有效的电子邮件目的地。但是,只有 A 记录的域可能在该地址没有邮件服务器。(这同样适用于 MX 目标,但这应该不那么频繁,而且通常是暂时的。)

适当的电子邮件服务应该假脱机并随着时间的推移重试发送。如果您的 sendmail 没有这样做,那么您应该检查其配置。您还需要考虑如何处理无法发送电子邮件的电子邮件地址。

于 2010-11-10T19:44:28.787 回答