PHP邮件无限期挂起-如何调试


PHP mail hangs indefinitely - How to debug?

我设置了一个简单的邮件系统,类似于以下内容:

$from = 'me <me@me.com>';
$to = 'you <you@you.com>';
$subject = 'subject';
$body = 'body';
$host = 'www.me.com';
$headers = array('From' => $from, 'To' => $to, 'Subject' => $subject);
$smtp = Mail::Factory('smtp', array('host' => $host, 'auth' => true,
                      'username' => 'username', 'password' => 'password'));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail)) {
    throw new Exception('emailException');
}

然而,当我尝试运行脚本时,浏览器(chrome)会永久挂起。没有抛出异常,浏览器也没有显示错误页面,它只是坐着等待响应(超过12分钟,是我离开它的最长时间)。

我的实际程序略有不同(代码包含在一个函数中,其中信息作为参数传递)。我使用了静态调试,并确认传入的参数是正确的,但它从未出错,所以我甚至无法在$mail中测试任何错误信息。

有人知道我应该如何调试这个吗?

更新当调用$smtp->send(…)

时,我可以确认页面挂起

调试可以在日志文件中完成,您可能会发现一些PEAR错误。

此外,您还可以通过在每一行代码之间的echo语句进行调试,这样您就可以确切地知道它挂在哪里。

尝试连接到不存在的主机时可能会出现长时间延迟。所以这就是我开始搜索的地方,尽管12分钟非常非常长。您需要使用PEAR类,因为您需要通过指定的SMTP服务器进行发送?

IME,关于PHP邮件功能的99%以上的报告错误都是邮件问题,无论是PHP还是其接口问题。

为什么要尝试直接连接到服务器,而不是使用PHP的mail()?

你有外壳进入机器的权限吗?它使以下操作变得更简单,但是您可以从PHP中完成这些操作。

你能解析smtp服务器的主机名吗?

你能连接到smtp服务器上的端口25吗?

身份验证是如何实现的?(应包含在对EHLO的回复中)

如果你有shell访问权限,那么通过日志代理或捕获usnig-tcpdump/wireshark来路由连接,看看连接在哪里被卡住了。

很可能邮件服务器没有实现正确的SMTP,身份验证出现问题。