【问题标题】:PHP imap_open works on 7.0.6 but not on 5.4.16PHP imap_open 适用于 7.0.6 但不适用于 5.4.16
【发布时间】:2016-10-27 08:36:46
【问题描述】:

所以,我有一个通用/应用程序/系统帐户(术语不同),它可以访问多个邮箱。我使用的用户名格式为<domain>/<username>/<mailbox>,这是唯一“与众不同”的东西。以下行适用于 PHP 7.0.6(我的笔记本电脑),但不适用于 5.4.16(开发服务器):

$mbox = imap_open("<host>:993/ssl/novalidate-cert", 
               "<domain>/<username>/<mailbox>", <pass>,
               NULL, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));

我得到的错误是:

PHP 通知:未知:无法对 IMAP 服务器进行身份验证:AUTHENTICATE 失败。 (errflg=2) 在第 0 行的未知中

我尝试过的:

  • 邮箱的原始帐户(&lt;domain&gt;/&lt;user&gt; 格式的用户名)有效
  • $mailboxOP_DEBUG 标志中使用/debug - 这些都没有任何用处
  • 使用 python 调试到服务器的消息。这将验证用户名是否作为三段字符串发送并且也有效
  • 删除第 3 段(邮箱)以为我可以稍后选择它 - 导致两种情况/版本的身份验证失败

问题:

  1. 这是一个 PHP 错误吗?
  2. 还有其他方法可以做到这一点吗? (我无法更改 PHP 版本)
  3. 我能否以某种方式启用消息记录? (没有 root 所以没有 tcpdump 选项)

【问题讨论】:

  • 您好,您是尝试连接到 Gmail 还是发生在所有域中?我发现了一些关于这试图设置标志两次(php.net/manual/en/function.imap-open.php 搜索 errflg=2 在此页面中,有帖子)还有一点 - 你正在发送一个关于 SSL 的标志,然后是另一个关于你不关心的标志关于证书(novalidate-cert)?您是否尝试删除 /ssl?我认为这可能是你得到的问题。如果您尝试删除 /ssl,请告诉我 :)
  • 嗨@Hrabosch。我正在连接到 MS 交换服务器(不确定版本,但我可以找到)。删除 /ssl 使其挂起(无响应、无登录、无错误)。我还尝试使用端口143(没有ssl)而不是993,这会导致相同的错误消息。我会假设这不包括 SSL 问题......你知道有什么方法可以调试它并查看 IMAP 消息吗?
  • 所以,我将尝试我所知道的回答中描述的几点,等待它:)
  • $mbox = imap_open("{&lt;host&gt;:993/ssl/novalidate-cert/}&lt;mailbox&gt;", "&lt;domain&gt;/&lt;username&gt;", &lt;pass&gt;, NULL, array('DISABLE_AUTHENTICATOR' =&gt; 'GSSAPI'));
  • @Wolfeh 嘿,我确实在主机部分使用{},但是因为该帐户可以访问多个“邮箱”/帐户(不是文件夹,每个邮箱都有“收件箱”,所以我有 3 个以上的文件夹使用该名称)我必须将邮箱添加到用户名的末尾。这确实适用于 php7 和 python...

标签: php exchange-server imap imap-open


【解决方案1】:

在我看来,你可以尝试做这样的事情:

$mbox = imap_open("<host>:993/ssl/novalidate-cert", 
               "<domain>/<username>/<mailbox>", <pass>,
               NULL, array('DISABLE_AUTHENTICATOR' => 'GSSAPI')) or 
                   die(var_dump(imap_errors()));

您应该能够看到更多错误。接下来,您可以尝试切换到 PLAIN 而不是 GSSAPI,并尝试将 n_retries 设置为 1,最后考虑添加有关 IMAP 的标志。

$mbox = imap_open("<host>:993/imap/ssl/novalidate-cert", 
                   "<domain>/<username>/<mailbox>", <pass>,
                   NULL,  1, array('DISABLE_AUTHENTICATOR' => 'PLAIN')) or 
                       die(var_dump(imap_errors()));

我认为 Exchange 存在问题,它不允许它不支持的身份验证协议。如果你在 win 上运行它并且它可以工作并且你的开发环境在 Linux 上,我几乎可以肯定这就是那个问题。

【讨论】:

  • 嘿,检查了所有这些...没有运气 :( 请注意,我正在使用 PLAIN 身份验证,因为该标志正在禁用 GSSAPI。最后一个如果启用会导致有关 kerberos 的警告(这很常见)。/imap 似乎并没有改变任何东西......
  • 还有var_dump?它是否显示更多内容?那么尝试禁用所有呢? :D GSSAPI、NTLM 和 PLAIN。您是否尝试禁用所有功能?您是否尝试过 NTLM?
  • 确实尝试了所有组合。我使用了具有相同凭据的fMailbox,并且一切正常!我 99% 确定这是我正在使用的 php 版本中的错误。不幸的是,我无法更改它...
  • 如果您在防火墙中阻止了端口怎么办?你能连接到开发环境并尝试telnet imap.domain.com 993,请填写正确的域。如果不是,那么防火墙有问题!
  • 嘿@Hrabosch,检查连接并确认没问题...如果我设法解决这个问题,我会在这里发帖,但由于赏金到期,我把它交给你,感谢你的时间和精力:)
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2011-09-09
  • 2012-07-15
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多