Postfix e MySQL · 7 min read · Jan 11, 2026

Usuários Virtuais E Domínios Com Postfix, Courier, MySQL E SquirrelMail (Mandriva 2010.0 x86_64) - Página 2

5 Criar O Banco De Dados MySQL Para Postfix/Courier

Criamos um banco de dados chamado mail:

mysqladmin -u root -p create mail

Em seguida, vamos para o shell do MySQL:

mysql -u root -p

No shell do MySQL, criamos o usuário mail_admin com a senha mail_admin_password (substitua por uma senha de sua escolha) que tem privilégios SELECT, INSERT, UPDATE, DELETE no banco de dados mail. Este usuário será usado pelo Postfix e Courier para se conectar ao banco de dados de e-mail:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Ainda no shell do MySQL, criamos as tabelas que o Postfix e o Courier precisam:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

Como você pode ter notado, com o comando quit; saímos do shell do MySQL e voltamos ao shell do Linux.

A tabela domains armazenará cada domínio virtual que o Postfix deve receber e-mails (por exemplo, example.com).

domain
example.com

A tabela forwardings é para aliasar um endereço de e-mail a outro, por exemplo, encaminhar e-mails de [email protected] para [email protected].

sourcedestination
[email protected][email protected]

A tabela users armazena todos os usuários virtuais (ou seja, endereços de e-mail, porque o endereço de e-mail e o nome de usuário são os mesmos) e senhas (em forma criptografada) e um valor de cota para cada caixa de correio (neste exemplo, o valor padrão é 10485760 bytes, o que significa 10MB).

emailpasswordquota
[email protected]No9.E4skNvGa. (“segredo” em forma criptografada)10485760

A tabela transport é opcional, é para usuários avançados. Ela permite encaminhar e-mails para usuários individuais, domínios inteiros ou todos os e-mails para outro servidor. Por exemplo,

domaintransport
example.comsmtp:[1.2.3.4]

encaminharia todos os e-mails para example.com via o protocolo smtp para o servidor com o endereço IP 1.2.3.4 (os colchetes [] significam “não faça uma busca do registro MX DNS” (o que faz sentido para endereços IP…). Se você usar um nome de domínio totalmente qualificado (FQDN) em vez disso, você não usaria os colchetes.).

6 Configurar Postfix

Agora precisamos dizer ao Postfix onde ele pode encontrar todas as informações no banco de dados. Portanto, precisamos criar seis arquivos de texto. Você notará que digo ao Postfix para se conectar ao MySQL no endereço IP 127.0.0.1 em vez de localhost. Isso ocorre porque o Postfix está sendo executado em uma jaula chroot e não tem acesso ao socket do MySQL, que ele tentaria se conectar se eu dissesse ao Postfix para usar localhost. Se eu usar 127.0.0.1, o Postfix usa a rede TCP para se conectar ao MySQL, o que não é um problema mesmo em uma jaula chroot (a alternativa seria mover o socket do MySQL para a jaula chroot, o que causaria alguns outros problemas).

Agora vamos criar nossos seis arquivos de texto.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Agora criamos um usuário e grupo chamado vmail com o diretório home /home/vmail. Este é onde todas as caixas de correio serão armazenadas.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Em seguida, fazemos algumas configurações do Postfix. Certifique-se de substituir server1.example.com por um FQDN válido, caso contrário, seu Postfix pode não funcionar corretamente!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_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 alcançar está acima da cota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'  
postconf -e 'alias_database = hash:/etc/postfix/aliases'  
postconf -e 'alias_maps = hash:/etc/postfix/aliases'

Depois criamos o certificado SSL que é necessário para TLS:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Nome do País (código de 2 letras) [GB]: <– Insira o Nome do Seu País (por exemplo, “DE”).
Nome do Estado ou Província (nome completo) [Berkshire]: <– Insira o Nome do Seu Estado ou Província.
Nome da Localidade (por exemplo, cidade) [Newbury]: <– Insira Sua Cidade.
Nome da Organização (por exemplo, empresa) [My Company Ltd]: <– Insira o Nome da Sua Organização (por exemplo, o nome da sua empresa).
Nome da Unidade Organizacional (por exemplo, seção) []: <– Insira o Nome da Sua Unidade Organizacional (por exemplo, “Departamento de TI”).
Nome Comum (por exemplo, seu nome ou o nome do host do seu servidor) []: <– Insira o Nome de Domínio Totalmente Qualificado do sistema (por exemplo, “server1.example.com”).
Endereço de E-mail []: <– Insira seu Endereço de E-mail.

Em seguida, altere as permissões do smtpd.key:

chmod o= /etc/postfix/smtpd.key

7 Configurar Saslauthd

Edite /etc/sasl2/smtpd.conf. Deve ficar assim:

vi /etc/sasl2/smtpd.conf

| # Arquivo de configuração da biblioteca SASL para postfix # todos os parâmetros estão documentados em: # /usr/share/doc/cyrus-sasl/options.html # Os parâmetros mech_list listam os mecanismos sasl a serem usados, # o padrão é todos os mecanismos encontrados. #mech_list: plain login # Para autenticar usando o daemon saslauthd separado, (por exemplo, para # usuários do sistema ou ldap). Veja também /etc/sysconfig/saslauthd. #pwcheck_method: saslauthd #saslauthd_path: /var/lib/sasl2/mux # Para autenticar contra usuários armazenados em sasldb. #pwcheck_method: auxprop #auxprop_plugin: sasldb #sasldb_path: /var/lib/sasl2/sasl.db pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/authdaemon/socket |

Em seguida, crie os links de inicialização do sistema para o Postfix e inicie o Postfix, saslauthd e courier-authdaemon:

chmod 755 /var/lib/authdaemon  
chkconfig postfix on  
/etc/init.d/courier-authdaemon start  
/etc/init.d/postfix restart  
/etc/init.d/saslauthd start

8 Configurar Courier

Agora precisamos dizer ao Courier que ele deve autenticar contra nosso banco de dados MySQL. Primeiro, edite /etc/courier/authdaemonrc e altere o valor de authmodulelist para que fique assim:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" #authmodulelist="authpam authpwd authshadow" [...] |

Em seguida, edite /etc/courier/authmysqlrc. Deve ficar exatamente assim (novamente, certifique-se de preencher os detalhes corretos do banco de dados):

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc  
vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Em seguida, reinicie o Courier:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imapd restart  
/etc/init.d/courier-pop3d restart

Executando

telnet localhost pop3

você pode ver se seu servidor POP3 está funcionando corretamente. Ele deve retornar +OK Hello there . (digite quit para voltar ao shell do Linux):

[root@server1 postfix]# telnet localhost pop3  
Trying 127.0.0.1...  
Connected to localhost.localdomain (127.0.0.1).  
Escape character is '^]'.  
+OK Hello there.  
quit  
+OK Better luck next time.  
Connection closed by foreign host.  
[root@server1 postfix]#
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.