【问题标题】:PHP IMAP Exchange IssuePHP IMAP 交换问题
【发布时间】:2011-08-14 11:37:21
【问题描述】:

所以我目前正在编写的 PHP 脚本有一点问题。首先,让我说脚本应该连接到 IMAP 邮箱,搜索一些电子邮件并下载它们的附件。所有这些都已经编码,并且正在使用我自己的 gmail 帐户。当我尝试连接到交换服务器时出现问题。短代码摘录:

$mbox = imap_open($host, $login, $password);
echo '<br/>' . imap_last_error() . '<br/>';
$emails = imap_search($mbox, 'FROM "patate@patate.com"', SE_UID);

我尝试了两个主要的 $host “版本”(有和没有 SSL):

1 - {server:993/imap/ssl/novalidate-cert}收件箱 2 - {server:143/imap/novalidate-cert}INBOX

novalidate-cert 处理证书错误。我还尝试了这两个参数的“notsl”参数,但没有任何明显的结果。我得到的错误是这个可爱的信息,绝对不是以任何方式、形状或形式神秘的:

[CLOSED] IMAP connection broken (server response)

另外,我也收到这些通知:

Notice: Unknown: Unknown GSSAPI failure: An invalid name was supplied (errflg=1) in Unknown on line 0 
Notice: Unknown: GSSAPI mechanism status: Hostname cannot be canonicalized (errflg=1) in Unknown on line 0 
Notice: Unknown: Retrying PLAIN authentication after AUTHENTICATE failed. (errflg=1) in Unknown on line 0 
Notice: Unknown: Retrying PLAIN authentication after AUTHENTICATE failed. (errflg=1) in Unknown on line 0 
Notice: Unknown: Can not authenticate to IMAP server: AUTHENTICATE failed. (errflg=2) in Unknown on line 0 
Notice: Unknown: [CLOSED] IMAP connection broken (server response) (errflg=1) in Unknown on line 0

前两个让我特别困惑...我确实在另一台服务器上尝试过这个脚本,以确保问题与我的本地网络无关。经过大量的谷歌搜索,我只得到了这个:http://www.phpfreaks.com/forums/index.php?topic=190628.0,这似乎是一个有点麻烦的修复。

有什么想法吗?

【问题讨论】:

    标签: php exchange-server imap


    【解决方案1】:

    我遇到了同样的问题,似乎正在生成错误,因为 Exchange 服务器公布了它不支持的身份验证协议 (http://vision.eng.shu.ac.uk/mmvlwiki/index.php/Exchange)。这个问题似乎也与 linux 服务器隔离,因为我对 Windows 机器上完全相同的代码没有任何问题。这是一个长期存在的问题,最近对 PHP 进行了修补 (v 5.3.2) 以允许您禁用某些身份验证协议 (http://php.net/manual/en/function.imap-open.php)。下面的代码间歇性地为我工作:

    $this->inbox = imap_open("{server:993/imap/ssl/novalidate-cert}$inbox", 
                               $username, $password, NULL, 1, 
                               array('DISABLE_AUTHENTICATOR' => 'PLAIN')) or 
                       die(var_dump(imap_errors()));
    

    这也是间歇性的:

    $this->inbox = imap_open("{server:993/imap/ssl/novalidate-cert}$inbox", 
                               $username, $password, NULL, 1, 
                               array('DISABLE_AUTHENTICATOR' => 'GSSAPI')) or 
                       die(var_dump(imap_errors()));
    

    所以我在贫民区操纵了这个,它似乎确实有效......虽然它有可能对我公司的交换服务器进行无限循环/DOS 攻击,但是 /care

    希望有更好的解决方案,但这应该会有所帮助:

    $tryCnt = 0;
    
    while(!is_resource($this->inbox)){
    
        $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", 
                                   $username, $password, NULL, 1, 
                                   array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
        $tryCnt ++;
    
        if(!is_resource($this->inbox)){
    
            $this->inbox = imap_open("{server.com:993/imap/ssl/novalidate-cert}$inbox", 
                                       $username, $password, NULL, 1, 
                                       array('DISABLE_AUTHENTICATOR' => 'PLAIN'));
            $tryCnt ++;
    
        }
    
        if($tryCnt > 20){
    
            echo "Cannot Connect To Exchange Server:<BR>";
            die(var_dump(imap_errors()));
    
        }    
    }
    

    【讨论】:

    • 添加 array('DISABLE_AUTHENTICATOR' => 'PLAIN') 对我有用,经过数小时的调试以找出我无法连接到服务器的原因。
    【解决方案2】:

    我有一个 PHP 脚本,它连接到 OWA 电子邮件服务器并使用 imap_open PHP 函数返回电子邮件的内容。然后,它使用该内容在 MindTouch 实例中创建一个页面。

    所有这些代码都可以正常工作,但是脚本报告了上面显示的 GSSAPI 失败错误。在我的网页结果页面中,(正确)报告了成功,但该页面还显示了 GSSAPI 错误消息。

    我在代码中发现我打开了error_reporting(E_ALL)。当我更改报告级别时,错误消息消失了。

    我知道错误仍然存​​在,但我不知道为什么。但是,由于我的所有代码都正常工作,我只是希望错误消息消失,因为它让我的用户感到困惑。

    将报告级别更改为较低的级别可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2017-04-22
      • 1970-01-01
      • 2013-07-08
      • 2011-01-11
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多