2011-04-28 116 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)。當我更改報告級別時,錯誤消息就消失了。

我知道錯誤仍然存​​在,我不知道爲什麼。但是,由於我所有的代碼工作正常,我只想讓錯誤消息消失,因爲它讓我的用戶感到困惑。

將報告級別更改爲較低的級別。