direcciones de correo Zimbra en PHP

26 de abril de 2008

Para obtener un listado de direcciones de correo del Zimbra es posible acceder via PHP al servidor de LDAP donde se guarda toda la información de los usuarios dados de alta. De esta forma podemos publicar en nuestra intranet corporativa un listado siempre actualizado de las direcciones de todos los empleados.

Desde la base de datos LDAP podremos consultar el nombre del usuario, su dirección de correo, teléfono, estado de la cuenta, etc.
Lo que recomiendo primero es utilizar algún LDAP Explorer para conectarse al servidor de LDAP del Zimbra y ver su estructura para comprender el nombre de los campos del siguiente código en PHP.

Supongamos que nuestro servidor de correo esta en 10.10.10.10 y que nuestro dominio de correo es midominio.com. El código PHP para acceder a LDAP seria:

   $ad = ldap_connect("ldap://10.10.10.10");
   ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
   $ldapbind = ldap_bind($ad,"","");      
   //*** buscamos todos los detarpamentos o Unidades Organizativas (OU)
   $result = ldap_search($ad, "ou=people,dc=midominio,dc=com","(uid=*)");
   ldap_sort($ad,$result,"uid");
   $info = ldap_get_entries($ad, $result);

   echo "<table border=0>";
   echo "  <tr>";
   echo "   <td>usuario";
   echo "   <td>direccion";
   echo "   <td>departamento";
   echo "   <td>telefono";
   echo "   <td>estado";
   echo "  </tr>";

   for ( $i=0; $i<$info["count"]; $i++ ) {
      $r = "uid=".$info[$i]["uid"][0].",ou=people,dc=midominio,dc=com";
      $result = ldap_search($ad, $r,"(sn=*)");
      $info2 = ldap_get_entries($ad, $result);
      for ($j=0; $j<$info2["count"]; $j++) {
         if ( ($info2[$j]["displayname"][0]<>"") && ($info2[$j]["objectclass"][3]<>"zimbraCalendarResource") ) {

            echo "   <tr>";
            echo "      <td>" .$info2[$j]["displayname"][0]. "";
            echo "      <td>" .$info2[$j]["mail"][0] ."";
            echo "      <td>" .utf8_decode($info2[$j]["ou"][0]) ."";
            echo "      <td>" .$info2[$j]["telephonenumber"][0].$info2[$j]["objectclass"][3]."</td>";

            $estado = "";
            if ($info2[$j]["zimbramailstatus"][0]=="disabled")
               $estado = "CERRADO!";
            echo "<td>".$estado."</td>";
            echo "</tr>";

        }
      }
   }

   echo "<</table>";
   ldap_close($ad);
Para hacer funcionar este código asegúrate que primero tú servidor PHP tiene soporte para LDAP, de lo contrario tendrás que instalarlo y segundo asegúrate que el firewall donde tengas instalado el Zimbra te deja acceder al puerto de LDAP.