Escenarios de correo electrónico

Escenarios en plural porque me he encontrado con varios de ellos que he resuelto o estoy en proceso de resolver y a los que no quiero perder la pista.

Cuentas de correo totalmente virtuales

En este dominio resulta que todas las cuentas son virtuales. Están registradas en un directorio LDAP que se emplea para verificar credenciales y para obtener el ID de los usuarios y crear sus buzones.

Los siguientes fragmentos de configuración son para el programa exim4 teniendo como destino final los buzones IMAP gestionados por Dovecot. Las últimas mejoras en exim han considerado que emplear datos procedentes directamente del exterior, de las cabeceras del mensaje, para construir rutas en el sistema no son buena idea. La configuración se ha complicado lo suyo pero al final más o menos empiezo a entender cómo va.

Autentificación

plain_server:                                                                                                                                                                 
  driver = plaintext                                                                                                                                                          
  public_name = PLAIN                                                                                                                                                         
  server_prompts = :                                                                                                                                                          
  server_condition = ${if \                                                                                                                                                   
     ldapauth \                                                                                                                                                               
       { user="cn=${quote_ldap:$auth2},ou=users,dc=zeine,dc=es" \                                                                                                             
         pass=${quote:$auth3} \                                                                                                                                               
         ldap://LDAP_SERVER\                                                                                                                                                    
       }{yes}{no}}                                                                                                                                                            
  server_set_id = $auth2                                                                                                                                                      

El nombre del usuario y la contraseña se emplean para crear la acreditación con el servidor LDAP y ver si admite o no la conexión.

Enrutado

ldap_users:                                                                                                                                                                   
        debug_print = "R: LDAP users lookup for $local_part@$domain"                                                                                                          
        driver = accept                                                                                                                                                       
        domains = zeine.es                                                                          
        local_parts = ${lookup ldap {ldap://LDAP_SERVER/LDAP_BASE?cn?sub?(cn=${quote_ldap:$local_part})}}                                                                     
        transport = LOCAL_DELIVERY                                                                                                                                            
                                     
a

La condición para este enrutador es que el dominio sea el local (zeine.es) y se efectúa una búsqueda empleando la parte local del remitente ($local_part) para obtener el campo cn de la entrada que se utilizará en $local_part_data tras la directiva local_parts.

El transporte directo es el predeterminado que en el caso de esta instalación es el envío a dovecot.

Transporte

dovecot_transport:                                                                                                                                                            
        debug_print = "T: dovecot for $local_part@$domain"                                                                                                                    
        driver = appendfile                                                                                                                                                   
        user = vmail                                                                                                                                                          
        group = vmail                                                                                                                                                         
        mode = 0700                                                                                                                                                           
        directory = /srv/mail/${lc:$local_part_data}/                                                                                                                         
        maildir_format = true                                                                                                                                                 
        mode_fail_narrower = false                                                                                                                                            
        envelope_to_add = true                                                                                                                                                
        return_path_add = true  

En este caso añadimos directamente el archivo al directorio cuya ruta hemos construido con $local_part_data y que ya no se considera emponzoñado (tainted) por lo que puede usarse tranquilamente.

La idea es utilizar mejor una conexión con dovecot vía LMTP o similar para independizar mejor el despacho de correo.