我正在使用PHP的SwiftMailer库批量发送电子邮件(在CANSPAM和RFC之后)。
一切正常,直到我遇到DNS中没有相应MX条目的域。那时,我的脚本只是挂起 - 我假设它是因为sendmail没有返回。这可以持续几分钟,也可以持续数小时。
我已经确认我的脚本(斜杠sendmail)挂起的地址是那些没有DNS MX条目的地址。其他一切都很好。
在尝试发送邮件之前,有没有办法可以检查PHP内部是否存在DNS MX?这是可扩展的(即,DNS上的额外查找是否真的会减慢我的速度,或者它是否会很好b / c然后MX在本地缓存以便sendmail用于传递消息)?
感谢您的帮助
---更新--- 我尝试了下面的解决方案,这帮助我缩小了问题的范围。似乎这不是MX条目是否存在的问题。问题是DNS查找将永远返回。有没有一种简单的方法可以设置超时,所以如果DNS没有返回< 5s,我可以继续前进吗?
答案 0 :(得分: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';
答案 1 :(得分:2)
您可以使用getmxrr:
if (getmxrr($hostname, $mxhosts)) {
// MX record exists
var_dump($mxhosts);
}
答案 2 :(得分:1)
DNS查找在重复请求时可以很好地扩展。最近的DNS服务器将缓存一段时间的查找值。使用本地DNS缓存服务器可以提高性能,但会使用更多内存(一点点或很多内存,具体取决于软件和缓存的地址数量。
如果我正确记住了RFC,那么拥有A记录的主机也应该是有效的电子邮件目的地。但是,只有A记录的域可能没有该地址的邮件服务器。 (同样适用于MX目标,但这应该不那么频繁,通常是暂时的。)
正确的电子邮件服务应该假脱机并随着时间的推移重试递送。如果您的sendmail没有这样做,那么您应该检查它的配置。您还需要考虑如何处理无法发送电子邮件的电子邮件地址。