2011-04-28 123 views
5

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

$mbox = imap_open($host, $login, $password); 
echo '<br/>' . imap_last_error() . '<br/>'; 
$emails = imap_search($mbox, 'FROM "[email protected]"', SE_UID); 

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

1 - {服务器:993/IMAP/SSL/NOVALIDATE证书} 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这似乎是一个有点麻烦的修复。

任何想法?

回答

9

我有这个相同的问题,它看起来像错误正在生成,因为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())); 

SO我贫民窟操纵这一点,似乎工作...虽然它有可能为一个无限循环/我公司的Exchange服务器上的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())); 

    }  
} 
+2

数小时('DISABLE_AUTHENTICATOR'=>'PLAIN')的添加为我工作,经过几个小时的调试,找出为什么我无法连接到服务器。 – Angela 2014-11-03 00:13:49

-3

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

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

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

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

将报告级别更改为较低的级别。