PHP IMAP Exchange问​​题

Afr*_*mon 6 php imap exchange-server

所以我对我正在编写的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);
Run Code Online (Sandbox Code Playgroud)

我尝试过两个主要的$ 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)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Dav*_*ley 12

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

这也是间歇性的:

$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()));
Run Code Online (Sandbox Code Playgroud)

所以,我这样做了,它似乎确实有效......尽管它有可能对我公司的交换服务器进行无限循环/ DOS攻击但是/关心

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

$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()));

    }    
}
Run Code Online (Sandbox Code Playgroud)

  • 经过数小时的调试后,添加数组('DISABLE_AUTHENTICATOR'=>'PLAIN')对我有用,找出无法连接到服务器的原因. (2认同)