2011-04-28 5 views
5

그래서 현재 쓰고있는 PHP 스크립트에 약간의 문제가 있습니다. 시작하려면 스크립트가 IMAP 사서함에 연결되고 일부 전자 메일을 검색하여 첨부 파일을 다운로드한다고 가정 해 보겠습니다. 이 모든 것은 이미 코딩되어 있으며 내 자신의 Gmail 계정으로 작업하고 있습니다. 문제는 교환 서버에 연결하려고 할 때 발생합니다. 짧은 코드 발췌 :PHP IMAP 교환 문제

1 : 나는 두 가지 주요 $ 호스트 (SSL와없는) "버전"시도

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

- {서버 : 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 다소 성가신 픽스처럼 보인다.

아이디어가 있으십니까?

답변

9

Exchange 서버가 지원하지 않는 인증 프로토콜 (http://vision.eng.shu.ac.uk/mmvlwiki/index.php/Exchange)을 알리기 때문에 오류가 생성되는 것과 같은 문제가 발생합니다. 또한이 문제는 Windows 서버에서 똑같은 코드를 사용하는 데 문제가 없으므로 Linux 서버에 격리 된 것처럼 보입니다. 이것은 오래 전부터 제기되어 왔으며 특정 인증 프로토콜 (http://php.net/manual/en/function.imap-open.php)을 비활성화 할 수 있도록 PHP가 최근에 패치되었습니다 (5.3.2 절). 아래의 코드는 나를 위해 간헐적으로 작동합니다

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

그래서 빈민가 무한 루프의 가능성을 가지고 있지만 ... 제대로 작동 않는이 리깅/내 회사의 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

array ('DISABLE_AUTHENTICATOR'=> 'PLAIN')를 추가하면 몇 시간 동안 디버깅을 한 후에 왜 서버에 연결할 수 없는지 알 수 있습니다. – Angela

-3

OWA 전자 메일 서버에 연결하고 imap_open PHP 함수를 사용하여 전자 메일 내용을 다시 가져 오는 PHP 스크립트가 있습니다. 그 내용을 사용하여 MindTouchure 인스턴스에 페이지를 생성합니다.

이 코드는 모두 올바르게 작동하지만 스크립트는 위에 표시된 GSSAPI 오류 오류를보고합니다. 내 웹 결과 페이지에서 성공이 (올바르게)보고되었지만 페이지에 GSSAPI 오류 메시지가 표시되었습니다.

내가 코드에서 발견 한 것은 내가 error_reporting(E_ALL)을 켜고 있다는 것입니다. 보고 수준을 변경하면 오류 메시지가 사라졌습니다.

나는 오류가 여전히 있다는 것을 알고 있으며, 나는 이유를 모른다. 그러나 모든 코드가 올바르게 작동하기 때문에 사용자를 혼란스럽게 만들었으므로 오류 메시지가 사라지 길 원했습니다.

보고 수준을 낮은 수준으로 변경하면 문제가 발생합니다.