PHP IMAP Exchange问​​题

时间:2011-04-28 07:28:35

标签: php exchange-server imap

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

$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} INBOX 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这似乎是一个有点麻烦的修复。

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

我遇到同样的问题,看起来正在生成错误,因为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()));

    }    
}

答案 1 :(得分:-3)

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

所有这些代码都能正常工作,但脚本报告了上面显示的G​​SSAPI失败错误。在我的Web结果页面中,(正确)报告了成功,但页面也显示了GSSAPI错误消息。

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

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

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