2010-11-10 159 views
1

我使用PHP的SwiftMailer库批量发送电子邮件(在CANSPAM和RFC之后)。Sendmail在域MX不存在时挂起

一切正常,直到我运行一个在DNS中没有对应MX条目的域。那时,我的脚本就挂了 - 我假设这是因为sendmail没有返回。这可以持续几分钟,或者可以持续几个小时。

我已确认我的脚本(slash sendmail)挂在的地址是没有DNS MX条目的地址。其他的一切都很好。

在我尝试发送消息之前,有没有一种方法可以检查DNS MX是否存在于PHP内部?这是否可扩展(即,DNS上的额外查找是否真的让我放慢了速度,或者它是否正常b/c,然后将MX缓存到本地以供sendmail用于传递邮件)?

感谢您的帮助

--- UPDATE --- 我尝试以下解决方案,这让我缩小问题是什么。这似乎不是MX条目是否存在的问题。问题在于DNS查找将永远返回。有没有简单的方法可以设置超时,所以如果DNS不返回< 5秒,我可以继续吗?

回答

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

你也可以试试这个,以防止阻塞(有调整getmxrr超时无选项):

if ([email protected](substr($email,strrpos($email,'@')+1),25,$errno,$errstr,5)) 
    echo 'No MX record found'; 
+0

谢谢!这有助于;现在看来问题不在于它是否存在,而在于返回该值的滞后。更新了上面的问题,关于如何在5秒后使请求超时的任何建议? – 2010-11-10 19:37:34

+0

看到我的其他建议 – stillstanding 2010-11-10 19:48:28

+0

所以不会试图打开一个套接字连接到电子邮件的域?我的问题是(经常)我发送到onedomain.com(可能有或没有A记录),但MX是for two.onedomain.com。所以,当我打开一个套接字时,它仍然不会(准确地)告诉我该电子邮件是否应该发送(它告诉我有一个关于onedomain.com的记录,我真正想知道的是一个记录[ MX查找]如果该域名有MX条目)。我是否认为这两件事不是一回事? – 2010-11-10 21:48:40

2

您可以使用getmxrr

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

谢谢!请参阅我对这个问题的更新 - 任何想法? – 2010-11-10 19:37:53

+0

'fsockopen'会做到这一点。请参阅[仍然上面的答案](http://stackoverflow.com/questions/4148135/sendmail-hangs-when-domain-mx-doesnt-exist/4148273#4148273)。 – netcoder 2010-11-10 20:07:40

1

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

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

正确的电子邮件服务如果你的sendmail没有这样做,那么你应该检查它的配置,你还需要考虑如何处理电子邮件不能发送到的电子邮件地址