Servidor de Email · 3 min read · Oct 06, 2025

Solução Completa de Servidor de Email com Domínios e Usuários Virtuais (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - Página 4

B. Configurando o Postfix para Usuários e Domínios Virtuais

Mesmo que os servidores de troca de email não estejam entregando emails para os usuários e domínios virtuais, eles estarão rejeitando com base em destinos válidos/inválidos. Portanto, precisamos que os servidores mx consigam se conectar ao servidor SQL para verificar os destinos. Vá em frente e coloque as informações no postconf:

# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_extended = yes'
# postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf'
# postconf -e 'virtual_mailbox_limit_override = yes'
# postconf -e 'virtual_maildir_limit_message = "O usuário que você está tentando contatar excedeu sua cota."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'

Existem várias “pegadinhas” aqui. Esta configuração hospedará as caixas de correio dos usuários virtuais em /vmail. Se você precisar armazenar suas caixas de correio em outro local, altere a linha virtual_mailbox_base de acordo.

O virtual_minimum_uid e virtual_uid_maps apontam para o id do usuário 150. Este id de usuário é para um usuário “Correio Virtual” criado especificamente. Ele usa o grupo padrão “mail”, com o gid padrão (Debian) de 8. Você pode criar o usuário e o diretório assim:

# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Caixa de Correio Virtual" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/

Agora precisamos instalar as ferramentas do cliente NFS:

# apt-get install nfs-common portmap

O diretório então precisa ser montado no compartilhamento NFS. Para fazer um teste simples, execute o seguinte:

# mount files-1.internal.example.com:/vmail /vmail

Você deve agora ter acesso ao compartilhamento /vmail de files-1. Tente escrever um arquivo (não deve funcionar!):

# cd /vmail
# touch tmp

NOTA: Você deve receber um erro de somente leitura!

Assumindo que tudo está funcionando, vá em frente e desmonte o NFS:

# cd /
umount /vmail

E então torne a montagem permanente colocando o seguinte em seu /etc/fstab:

[...]  
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0

Vá em frente e monte o sistema de arquivos mais uma vez:

# mount /vmail

… e você está pronto para começar!

C. Configuração do MySQL do Postfix

O Postfix foi instalado com suporte ao MySQL, mas isso não significa que ele já sabe como usar nosso banco de dados. Ele precisa ser fornecido com várias informações de consulta SQL para cada tipo de tabela em nosso banco de dados. Essas informações são armazenadas nos arquivos MySQL definidos no arquivo main.cf. Observe que nos arquivos a seguir, a última linha contém um único comentário (precedido por #) com a consulta completa. Versões recentes do Postfix podem usar isso em vez das outras declarações. Se você estiver usando uma versão mais nova, basta comentar todas as outras linhas e descomentar a declaração da consulta.

/etc/postfix/mysql_virtual_alias_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = alias  
select_field = goto  
where_field = address  
additional_conditions = and active = '1'  
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
/etc/postfix/mysql_virtual_domains_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = domain  
where_field = domain  
additional_conditions = and backupmx = ‘0? and active = ‘1?  
#query = SELECT domain FROM domain WHERE domain=’%s’ AND backupmx = ‘0? AND active = ‘1?
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = quota  
where_field = username  
additional_conditions = and active = ‘1?  
#query = SELECT quota FROM mailbox WHERE username=’%s’ AND active = ‘1?
/etc/postfix/mysql_virtual_mailbox_maps.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = mailbox  
select_field = CONCAT(domain,’/',maildir)  
where_field = username  
additional_conditions = and active = ‘1?  
#query = SELECT CONCAT(domain,’/',maildir) FROM mailbox WHERE username=’%s’ AND active = ‘1?
/etc/postfix/mysql_virtual_transports.cf
user = vmail_user  
password = vmail_user_password  
hosts = sql-1.internal.example.com  
dbname = virtual_mail  
table = domain  
select_field = transport  
where_field = domain  
additional_conditions = and active = ‘1?  
#query = SELECT transport FROM domain WHERE domain=’%s’ AND active = ‘1?
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.