Montando um servidor de e-mail completo com Postfix
Este tutorial aborda a criação de um servidor de e-mail baseado em banco de dados MySQL, com suporte a cota de usuários, antispam, antivírus, webmail e tudo mais o que se pode imaginar.
Parte 11: Instalando o Postfix
Vamos instalar o Postfix com suporte a Maildir + SASL + MySQL, na
maioria das distribuições isso não vem habilitado por padrão, sendo
necessário uma nova compilação. O Postfix também não tem suporte a
cota de disco com o formato Maildir, sendo necessário, em alguns
casos, a instalação de uma Patch para tal. No nosso caso, como já
explicado, a cota será administrada pelo MAILDROP, sendo assim, não
será necessário a instalação de nenhum PATCH.
Baixe o Postfix de:
Dependências - Instale as dependências para a compilação do Postfix:
# urpmi libdbtcl3.3
# urpmi libdb3.3-devel
# urpmi libmysql12-devel
# urpmi libpcre0-devel
# urpmi libsasl2-devel
Instalando:
# tar -zxvf postfix-2.0.16.tar.gz -C /source/
# cd /source/postfix-2.0.16/
# make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=/usr/lib/libmysqlclient.so -lm -L/usr/lib -R/usr/lib -lsasl2'
# make
# make upgrade
Verifique se o suporte ao MySQL foi habilitado:
# postconf -m
static
pcre
nis
regexp
environ
proxy
mysql
btree
unix
hash
Configurando o Postfix:
Crie 4 arquivos dentro do diretório /etc/postfix/ com o seguinte conteúdo:
Baixe o Postfix de:
Dependências - Instale as dependências para a compilação do Postfix:
# urpmi libdbtcl3.3
# urpmi libdb3.3-devel
# urpmi libmysql12-devel
# urpmi libpcre0-devel
# urpmi libsasl2-devel
Instalando:
# tar -zxvf postfix-2.0.16.tar.gz -C /source/
# cd /source/postfix-2.0.16/
# make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=/usr/lib/libmysqlclient.so -lm -L/usr/lib -R/usr/lib -lsasl2'
# make
# make upgrade
Verifique se o suporte ao MySQL foi habilitado:
# postconf -m
static
pcre
nis
regexp
environ
proxy
mysql
btree
unix
hash
Configurando o Postfix:
Crie 4 arquivos dentro do diretório /etc/postfix/ com o seguinte conteúdo:
# mysql_virtual_alias_maps.cf
# -----------------------------
user = postfix
password= xxxxx
dbname = postfix
table = alias
select_field = goto
where_field = address
hosts = localhost
# -----------------------------
user = postfix
password= xxxxx
dbname = postfix
table = alias
select_field = goto
where_field = address
hosts = localhost
# mysql_virtual_mailbox_maps.cf
# ------------------------------
user = postfix
password= xxxxx
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
hosts = localhost
# ------------------------------
user = postfix
password= xxxxx
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
hosts = localhost
# mysql_transport_maps.cf
# --------------------------
user = postfix
password = xxxxxx
hosts = localhost
dbname = postfix
table = domain
select_field = transport
where_field = domain
# --------------------------
user = postfix
password = xxxxxx
hosts = localhost
dbname = postfix
table = domain
select_field = transport
where_field = domain
# mysql_virtual_mailbox_limit_maps.cf
# ------------------------------------
user = postfix
password = xxxxx
dbname = postfix
table = mailbox
select_field = quota
where_field = username
hosts = localhost
# ------------------------------------
user = postfix
password = xxxxx
dbname = postfix
table = mailbox
select_field = quota
where_field = username
hosts = localhost
OBS: Não esqueça de configurar as linhas "user, password" conforme a sua configuração.
MASTER.CF:
# vim /etc/postfix/master.cf
OBS: Nesse ambiente, não irei utilizar o Postfix com a opção de CHROOT, sendo assim, edite o /etc/postfix/master.cf e troque TODOS os "y" por "n" na coluna "chroot".
Configure o suporte ao Maildrop:
maildrop unix - n n - - pipe
flags=DRhu user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient}
flags=DRhu user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient}
OBS:
- A configuração da segunda linha deve ter pelo menos 2 espaços no começo da linha, conforme o exemplo.
- O parâmetro "-w 90" representa a porcentagem de utilização da caixa postal pode chegar até ser avisado pelo sistema. A mensagem de aviso é enviado pelo MAILDROP com o conteúdo do arquivo /etc/maildrop/quotawarnmsg.
MAIN.CF:
# vim /etc/postfix/main.cf
Faça o backup do arquivo original e crie o /etc/postfix/main.cf com o seguinte conteúdo:
#======== CONFIGURAÇÕES ===============
queue_directory = /var/spool/postfix/
program_directory=/usr/sbin
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mail_owner = postfix
default_privs=nobody
default_transport=smtp
alias_maps=hash:/etc/postfix/aliases
alias_database=hash:/etc/postfix/aliases
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
manpage_directory = /usr/local/man
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
smtpd_banner=$myhostname ESMTP MEU DOMINIO
disable_vrfy_command=yes
home_mailbox=Maildir/
# ========== NOME DO DOMÍNIO ===========
myhostname=postfix.dominio.com.br
mydomain=local.com.br
myorigin= $mydomain
mydestination= $mydomain, $transport_maps
#=====REDES p/ Relay======
# 192.168.0.0/24=MINHA REDE
#
mynetworks=127.0.0.0/8 192.168.0.0/24
#======== MYSQL ==============
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /postfix
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_uid_maps = static:108
virtual_gid_maps = static:108
transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf
#======= Quota ============
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps= mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 100000000
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====== SASL ================
#smtpd_sasl_auth_enable = yes
#smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#smtpd_recipient_restrictions =
# permit_sasl_authenticated,
# permit_mynetworks,
# check_relay_domains
# =======MAILDROP ==========
fallback_transport = /usr/bin/maildrop
maildrop_destination_recipient_limit = 1
unknown_local_recipient_reject_code = 450
queue_directory = /var/spool/postfix/
program_directory=/usr/sbin
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mail_owner = postfix
default_privs=nobody
default_transport=smtp
alias_maps=hash:/etc/postfix/aliases
alias_database=hash:/etc/postfix/aliases
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
manpage_directory = /usr/local/man
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
smtpd_banner=$myhostname ESMTP MEU DOMINIO
disable_vrfy_command=yes
home_mailbox=Maildir/
# ========== NOME DO DOMÍNIO ===========
myhostname=postfix.dominio.com.br
mydomain=local.com.br
myorigin= $mydomain
mydestination= $mydomain, $transport_maps
#=====REDES p/ Relay======
# 192.168.0.0/24=MINHA REDE
#
mynetworks=127.0.0.0/8 192.168.0.0/24
#======== MYSQL ==============
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_base = /postfix
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_uid_maps = static:108
virtual_gid_maps = static:108
transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf
#======= Quota ============
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps= mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 100000000
virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
#====== SASL ================
#smtpd_sasl_auth_enable = yes
#smtpd_sasl_security_options = noanonymous
#broken_sasl_auth_clients = yes
#smtpd_recipient_restrictions =
# permit_sasl_authenticated,
# permit_mynetworks,
# check_relay_domains
# =======MAILDROP ==========
fallback_transport = /usr/bin/maildrop
maildrop_destination_recipient_limit = 1
unknown_local_recipient_reject_code = 450
OBS:
- Essa é a configuração básica desse arquivo, fique à vontade para incluir novas implementação.
- Note que as linhas referentes ao SASL estão comentadas, elas só serão úteis durante a sua configuração.
- O parâmetro "maildrop_destination_recipient_limit" faz com que o MAILDROP entregue os emails para mais de um destinatário, caso contrario, apenas um irá receber a mensagem.
Configurações finais:
# rm -rf /var/spool/postfix/etc
# rm /usr/lib/sendmail
# ln -s /usr/sbin/sendmail /usr/lib/sendmail
Agora é hora de testar se o Postfix esta se comunicando com o MySQL.
# service postfix restart
Precisamos criar um domínio e um usuário para teste. Vamos fazer primeiramente na "mão", fazendo passo a passo para você visualizar todo o procedimento de criação de um usuário virtual.
Logue-se como ROOT no MySQL e faça:
# mysql -D postfix -pxxxxx
Criando o Dominio VIRTUAL e LOCAL:
mysql> INSERT INTO domain (
domain,
description,
transport,
active)
VALUES (
'dominio1.com.br' ,
'Dominio de Teste' ,
'maildrop' ,
'1');
mysql> INSERT INTO domain (
domain,
description,
transport,
active)
VALUES (
'local.com.br' ,
'Dominio LOCAL da Máquina' ,
'local' ,
'1');
mysql> SELECT domain, description, transport, active FROM domain;
+-----------------+--------------------------+-----------+--------+ | domain | description | transport | active | +-----------------+--------------------------+-----------+--------+ | dominio1.com.br | Dominio de Teste | maildrop | 1 | | local.com.br | Dominio LOCAL da Máquina | local | 1 | +-----------------+--------------------------+-----------+--------+
Criando o Usuário:
ATENÇÃO: Não esqueça de escolher uma senha em "encrypt('xxxxx')"
mysql> INSERT INTO mailbox (
username,
password,
name,
home,
maildir,
quota,
domain)
VALUES (
'marco.maximo@dominio1.com.br' ,
encrypt('xxxxx') ,
'Marco Maximo' ,
'/postfix/' ,
'dominio1.com.br/marco.maximo/Maildir/' ,
'10000000S' ,
'dominio1.com.br');
mysql> SELECT username FROM mailbox;
+-----------------------------+ | username | +-----------------------------+ | marco.maximo@dominio.com.br | +-----------------------------+Criando o HOME do usuário:
# mkdir -p /postfix/dominio1.com.br/marco.maximo
# maildirmake++ /postfix/dominio1.com.br/marco.maximo/Maildir
ou
# maildirmake /postfix/dominio1.com.br/marco.maximo/Maildir
# chown maildrop:apache /postfix/ -R
# chmod 770 /postfix/ -R
Testando o Maildrop:
Teste se o MAILDROP consegue enviar o email para a caixa postal dos usuários.
# cat /etc/lilo.conf | maildrop-mysql -d marco.maximo@dominio1.com.br
# ls /postfix/dominio1.com.br/marco.maximo/Maildir/new/
1068052088.M222683P4357V00000030I03C90_0.marco,S=621
Beleza, funcionou.
Testando o Postfix:
Como usuário local:
# echo "Funcionou..." | mail -s "TESTE do POSTFIX" marco@local.com.br
******************** LOG DO POSTFIX *******************
Nov 11 14:24:39 marco postfix/pickup[21819]: F285215721: uid=0 from=<root>
Nov 11 14:24:39 marco postfix/cleanup[21880]: F285215721: message-id=<20031111162439.F285215721@postfix.dominio.com.br>
Nov 11 14:24:39 marco postfix/nqmgr[21820]: F285215721: from=<root@local.com.br>, size=327, nrcpt=1 (queue active)
Nov 11 14:24:40 marco postfix/local[21884]: F285215721: to=<marco@local.com.br>, orig_to=<marco>, relay=local, delay=1, status=sent (maildir)
********************************************************
# ls /home/marco/Maildir/new/
1068567812.V302I15701.marco.local.com.br
Beleza, funcionou.
Como usuário virtual:
# echo "Funcionou..." | mail -s "TESTE do POSTFIX" marco.maximo@dominio1.com.br
******************** LOG DO POSTFIX *******************
Nov 7 14:28:00 teste postfix/pickup[20191]: 82EE0143AD: uid=0 from=<root>
Nov 7 14:28:00 teste postfix/cleanup[20226]: 82EE0143AD: message-id=<20031107162800.82EE0143AD@postfix.dominio.com.br>
Nov 7 14:28:00 teste postfix/nqmgr[20192]: 82EE0143AD: from=<root@local.com.br,.local.com.br>, size=817, nrcpt=1 (queue active)
Nov 7 14:28:00 teste postfix/pipe[20228]: 82EE0143AD: to=<marco.maximo@dominio1.com.br>, relay=maildrop, delay=0, status=sent (dominio1.com.br)
************************************************
# ls /postfix/dominio1.com.br/marco.maximo/Maildir/new/
1068222707.M754502P20250V000302I000135EA_0.teste,S=342
Opa, acho que foi:
# cat /postfix/dominio1.com.br/marco.maximo/Maildir/new/ 1068222707.M754502P20250V0000302I000135EA_0.teste\,S\=342
-------------------------------------------------------------
Received: by postfix.dominio.com.br (Postfix, from userid 0)
id AE1ED143AD; Fri, 7 Nov 2003 14:31:47 -0200 (BRST)
To: marco.maximo@dominio1.com.br
Subject: TESTE do POSTFIX
Message-Id: <20031107163147.AE1ED143AD@postfix.dominio.com.br>
Date: Fri, 7 Nov 2003 14:31:47 -0200 (BRST)
From: root@local.com.br,.local.com.br (root)
Funcionou...
-------------------------------------------------------------
É, foi!!!!! :-)
Teste de Autenticação do IMAP:
# telnet 0 143
Trying 0.0.0.0...
Connected to 0 (0.0.0.0).
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE STARTTLS] Courier-IMAP ready. Copyright 1998-2003
Double Precision, Inc. See COPYING for distribution information.
0 login marco.maximo@dominio1.com.br xxxxxx
0 OK LOGIN Ok.
0 select inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited
* 1 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 1068222985] Ok
0 OK [READ-WRITE] Ok
0 logout
* BYE Courier-IMAP server shutting down
0 OK LOGOUT completed
Connection closed by foreign host.
Beleza, funcionou!!!
Teste de Autenticação do POP3:
# telnet 0 110
Trying 0.0.0.0...
Connected to 0 (0.0.0.0).
Escape character is '^]'.
+OK Hello there.
user marco.maximo@dominio1.com.br
+OK Password required.
pass xxxxx
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
1 351
.
quit
+OK Bye-bye.
Connection closed by foreign host.
Beleza, funcionou!!!
DICA: Em caso de erro de autenticação, sempre dê uma olhada nos logs do MySQL e veja se foi feito e como foi feito o SELECT do courier. Isso pode ser útil para identificar erros no arquivo de configuração do courier.
Um outro problema pode ser no MySQL: ou o serviço não esta funcionando ou o usuário não tem permissão de acesso ao banco de dados.