当域MX不存在时,sendmail悬挂
-
30-09-2019 - |
题
我正在使用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不执行此操作,则应检查其配置。您还需要考虑如何处理无法发送电子邮件的电子邮件地址。
不隶属于 StackOverflow