2011-04-28 63 views
5

Tengo un pequeño problema con un script PHP que estoy escribiendo actualmente. Para comenzar, permítanme decir que se supone que el script se conecta a un buzón IMAP, busca algunos correos electrónicos y descarga sus archivos adjuntos. Todo esto ya está codificado y funciona con mi propia cuenta de gmail. El problema surge cuando intento conectarme a un servidor de intercambio. código corto extracto:PHP IMAP Exchange Issue

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

He intentado dos "versión" (con y sin SSL) principal $ host:

1 - {servidor: 993/IMAP/SSL/novalidate-cert} CORREO 2 - {server: 143/imap/novalidate-cert} INBOX

El certificado novalidate trata con un error de certificado. También probé los parámetros "notsl" para ambos, sin ningún resultado notable. El error que consigo es este mensaje precioso, absolutamente no críptica de ninguna manera, forma o forma:

[CLOSED] IMAP connection broken (server response) 

Además, también recibo estos avisos:

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 

Los dos primeros me arman en especial .. Intenté esta secuencia de comandos en otro servidor para asegurarme de que el problema no estuviera relacionado con mi red local. Después de buscar en Google, solo obtuve esto: http://www.phpfreaks.com/forums/index.php?topic=190628.0, que parece una solución un tanto engorrosa.

¿Alguna idea?

Respuesta

9

Tengo este mismo problema, parece que los errores se están generando porque un servidor de Exchange anuncia protocolos de autenticación que no admite (http://vision.eng.shu.ac.uk/mmvlwiki/index.php/Exchange). También parece que este problema está aislado en los servidores de Linux ya que no tengo problemas con el mismo código exacto en un cuadro de Windows. Esto ha sido un problema de larga data y recientemente PHP fue parcheado (v 5.3.2) para permitirle desactivar ciertos protocolos de autenticación (http://php.net/manual/en/function.imap-open.php). El código siguiente funciona de forma intermitente para mí:

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

Esto también funciona de forma intermitente:

$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 I gueto aparejé esto parece funcionar ... aunque tiene el potencial de un bucle sin fin/DOS ataque contra el servidor Exchange de mi empresa, sino/cuidado

Con suerte hay una solución mejor, pero esto debería ayudar:

$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

La adición de una matriz ('DISABLE_AUTHENTICATOR' => 'PLAIN') funcionó para mí, después de horas de depuración para averiguar por qué no podía conectarme al servidor. – Angela

-3

Tengo un script PHP que se conecta a un servidor de correo electrónico OWA y recupera el contenido de un correo electrónico usando la función PHP imap_open. Al usar ese contenido, luego crea una página en una instancia de MindTouch.

Todo este código funciona correctamente, pero el script informaba los errores de falla GSSAPI que se muestran arriba. En mi página de resultados web, se informó (correctamente) el éxito, pero la página también mostró los mensajes de error GSSAPI.

Lo que descubrí en mi código fue que estaba encendiendo error_reporting(E_ALL). Cuando cambié el nivel de informe, el mensaje de error desapareció.

Sé que el error todavía está allí, y no sé por qué. Pero, dado que todo mi código funciona correctamente, solo quería que el mensaje de error desapareciera, porque confundía a mis usuarios.

Cambiando el nivel de informe a uno inferior se encargó de eso.