Cómo especificar el directory de destino en Postfix con MySQL?

He configurado un server de correo con Postfix, Dovecot y MySQL. Dovecot funciona perfectamente. Postfix envía correo, pero tengo un problema con la recepción de correo.

Después de 2 días de debugging y ajustes, ahora puedo recibir correos con éxito. El único problema es que Postfix guarda los correos en el lugar equivocado. Quiero que los correos se guarden en el directory user@domain.tld para user@domain.tld pero los correos se guardan en el file /var/mail/vhosts/user@domain.tld .

 / var / mail / vhosts / user @ domain . tld ------------------------------- ----------------------------- ^ virtual_mailbox_base ^ ^ sql result from ^ | virtual_mailbox_maps | 

Configuración de Postfix

 # (postconf -d; postconf -d; postconf -n;) | sort | uniq -u alias_maps = hash:/etc/aliases append_dot_mydomain = no biff = no broken_sasl_auth_clients = yes local_recipient_maps = $virtual_mailbox_maps mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 mydestination = localhost.localdomain, localhost myhostname = {censonetworking} mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 myorigin = /etc/mailname process_id = 6297 process_id = 6298 readme_directory = no recipient_delimiter = + smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_path = private/auth smtpd_sasl_tls_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem smtpd_tls_cert_file = /etc/ssl/certs/mail.roofworkshop.com.crt smtpd_tls_key_file = /etc/ssl/private/mail.roofworkshop.com.key smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_security_level = may smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_note_starttls_offer = yes smtp_tls_security_level = may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf virtual_gid_maps = static:5000 virtual_mailbox_base = /var/mail/vhosts virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_uid_maps = static:5000 

mysql-virtual-mailbox-domains.cf

 user = mailuser password = {censonetworking} hosts = 127.0.0.1 dbname = mailserver query = SELECT name FROM virtual_domains WHERE name='%s' 

mysql-virtual-mailbox-maps.cf

 user = mailuser password = {censonetworking} hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM virtual_users WHERE email='%s' 

Otro método es utilizar mysql expansiones característica en postfix. Ver el hombre 5 mysql_table .

Aquí la versión alternativa de su consulta

 query = SELECT '%d/%u/' FROM virtual_users WHERE email='%s'; 

Cuando ingresó user@example.com , la cadena %d/%u/ se expandirá a example.com/user/ . Esta parte WHERE email='%s' limitará esta consulta sólo a nombre de usuario válido.

Vea también esta input del blog para get el ejemplo de estas expansiones.


El extracto pertinente de la página de documentation

consulta La plantilla de consulta SQL utilizada para search en la database, donde% s es un sustituto de la dirección que Postfix intenta resolver, por ejemplo, query = SELECT replacement FROM aliases WHERE mailbox = '% s'

Este parámetro admite las siguientes expansiones '%':

%% Se sustituye por un carácter literal '%'.

% s Se sustituye por la tecla de input. SQL quoting se utiliza para asegurarse de que la key de input no agrega metacaracteres inesperados.

% u Cuando la key de input es una dirección de la forma user @ domain,% u se sustituye por la parte local citada SQL de la dirección. De lo contrario,% u se reemplaza por toda la cadena de búsqueda. Si la parte local está vacía, la consulta se suprime y no devuelve ningún resultado.

% d Cuando la key de input es una dirección del usuario @ dominio de formulario,% d se reemplaza por la parte de dominio citada SQL de la dirección. De lo contrario, la consulta se suprime y no devuelve resultados.

Hice un pequeño truco para resolver el problema. mysql-virtual-mailbox-maps.cf file mysql-virtual-mailbox-maps.cf como sigue:

 user = mailuser password = {censonetworking} hosts = 127.0.0.1 dbname = mailserver query = SELECT CONCAT(SUBSTRING(email, LOCATE('@', email) + 1), '/', SUBSTRING_INDEX(email, '@', 1), '/') AS `domain` FROM virtual_users WHERE email='%s' 

Todavía me gustaría saber si hay methods mejores que esta solución barata.