代码之家  ›  专栏  ›  技术社区  ›  Travis Leleu

当域MX不存在时,sEnmail挂起

  •  1
  • Travis Leleu  · 技术社区  · 14 年前

    在我遇到一个在DNS中没有相应MX条目的域之前,一切都正常。在那一点上,我的脚本只是挂起了——我想这是因为sendmail没有返回。这可能只持续几分钟,也可能持续很多小时。

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

    在尝试发送消息之前,有没有一种方法可以检查DNS MX是否存在于PHP内部?这是可伸缩的吗(即,在DNS上的额外查找真的会让我慢下来吗,还是在b/c模式下,MX被缓存在本地以便sendmail用来传递消息)?

    谢谢你的帮助

    ---更新---

    3 回复  |  直到 14 年前
        1
  •  3
  •   bcosca    14 年前
    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';
    
        2
  •  2
  •   netcoder    14 年前

    你可以用 getmxrr

    if (getmxrr($hostname, $mxhosts)) {
       // MX record exists
       var_dump($mxhosts);
    }
    
        3
  •  1
  •   BillThor    14 年前

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

    正确的电子邮件服务应暂停发送电子邮件,并随着时间的推移重试传递。如果您的sendmail没有这样做,那么您应该检查它的配置。您还需要考虑如何处理无法发送电子邮件的电子邮件地址。