我正在使用PHP的SwiftMailer库来批量发送电子邮件(以下CANSPAM和RFCS)。

一切正常,直到我跨过DNS中没有相应MX条目的域。那时,我的脚本只是悬挂 - 我假设这是因为Sendmail尚未返回。这可以持续几分钟,或者可以持续数小时。

我已经确认我的脚本(Slash Sendmail)的地址是没有DNS MX条目的地址。其他一切都很好。

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

谢谢你的帮助

---更新---我尝试了下面的解决方案,这帮助我缩小了问题所在。似乎不是存在MX条目是否存在的问题。问题是DNS查找需要永远返回。有没有简单的方法可以设置超时,因此,如果DNS不在<5s中返回,我可以继续前进?

有帮助吗?

解决方案

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';

其他提示

您可以使用 getmxrr:

if (getmxrr($hostname, $mxhosts)) {
   // MX record exists
   var_dump($mxhosts);
}

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

如果我正确记得RFC,则具有A记录的主机也应该是有效的电子邮件目的地。但是,只有A记录的域可能没有该地址的邮件服务器。 (同样适用于MX目标,但这应该少得多,而且通常是暂时的。)

适当的电子邮件服务应随着时间的推移启动电子邮件和重试发送。如果您的SendMail不执行此操作,则应检查其配置。您还需要考虑如何处理无法发送电子邮件的电子邮件地址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top