Como especificar o diretório de destino no Postfix com o MySQL?

3

Eu configurei um servidor de e-mail com o Postfix, o Dovecot e o MySQL. Dovecot funciona perfeitamente. O postfix envia e-mails, mas tenho um problema em receber e-mails.

Após 2 dias de configurações de depuração e ajustes, agora consigo receber e-mails com sucesso. O único problema é que o Postfix salva as mensagens no lugar errado. Eu quero que os e-mails sejam salvos em /var/mail/vhosts/domain.tld/user/ diretório para [email protected] , mas os e-mails são salvos em /var/mail/vhosts/[email protected] arquivo .

/ v a r / m a i l / v h o s t s / u s e r @ d o m a i n . t l d
-------------------------------   -----------------------------
^    virtual_mailbox_base     ^   ^     sql result from       ^
                                  |   virtual_mailbox_maps    |

-

Configuração do 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 = {censored}
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 = {censored}
hosts = 127.0.0.1
dbname = mailserver
query = SELECT name FROM virtual_domains WHERE name='%s'

mysql-virtual-mailbox-maps.cf

user = mailuser
password = {censored}
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s'
    
por Hkan 14.09.2015 / 12:20

2 respostas

5

Outro método é usar o recurso de expansões do mysql no postfix. Veja man 5 mysql_table .

Aqui a versão alternativa da sua consulta

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

Quando a entrada for [email protected] , a string %d/%u/ será expandida para example.com/user/ . Esta parte WHERE email='%s' limitará essa consulta apenas ao nome de usuário válido.

Veja também esta postagem do blog para obter o exemplo dessas expansões.

O trecho relevante da página de documentação

query The SQL query template used to search the database, where %s is a substitute for the address Postfix is trying to resolve, e.g. query = SELECT replacement FROM aliases WHERE mailbox = '%s'

This parameter supports the following '%' expansions:

%% This is replaced by a literal '%' character.

%s This is replaced by the input key. SQL quoting is used to make sure that the input key does not add unexpected metacharacters.

%u When the input key is an address of the form user@domain, %u is replaced by the SQL quoted local part of the address. Otherwise, %u is replaced by the entire search string. If the localpart is empty, the query is suppressed and returns no results.

%d When the input key is an address of the form user@domain, %d is replaced by the SQL quoted domain part of the address. Otherwise, the query is suppressed and returns no results.

    
por 14.09.2015 / 16:44
4

Eu fiz um pequeno truque para resolver o problema. Eu mudei o arquivo mysql-virtual-mailbox-maps.cf da seguinte forma:

user = mailuser
password = {censored}
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'

Eu ainda gostaria de saber se existem métodos melhores do que essa alternativa barata.

    
por 14.09.2015 / 12:49