Solução completa de serviço de correio baseado em software livre (Debian GNU/Linux)
Recompilação do artigo "Postfix-2 + domínios virtuais + MySQL + SASL + PostfixAdmin", de autoria do Sr. Marco A. S. Máximo. Nesse novo artigo os passos foram tomados levando em consideração os recursos do Debian e usando (sempre que possível) os pacotes dos repositórios oficiais.
Parte 6: Instalando o Postfix
Usaremos o apt-get para a instalação do Postfix e os pacotes adicionais que usaremos.
# apt-get install postfix postfix-pcre postfix-mysql postfix-tls
Abaixo algo que eu tive de fazer (ficou dando erro) ;)
# touch /etc/postfix/aliases
# newaliases
Você pode verificar os módulos habilitados com o comando:
# postconf -m
static
cidr
nis
dbm
regexp
environ
proxy
btree
unix
hash
tcp
mysql
pcre
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
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
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
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
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". Exemplo:
#service type private unpriv chroot wakeup maxproc command + args smtp inet n - n - - smtpd virtual unix - n n - - virtual pickup fifo n - n 60 1 pickup
Configure o suporte ao maildrop:
maildrop unix - n n - - pipe
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 que a caixa postal pode chegar até o usuário ser avisado pelo sistema. A mensagem de aviso é enviado pelo MAILDROP com o conteúdo do arquivo "/etc/maildrop/quotawarnmsg".
# 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:120
virtual_gid_maps = static:120
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 = Desculpe, o diretório de correio do usuário estourou sua quota, por favor tente novamente depois.
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:120
virtual_gid_maps = static:120
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 = Desculpe, o diretório de correio do usuário estourou sua quota, por favor tente novamente depois.
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ções;
- 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.
# rm -rf /var/spool/postfix/etc
Agora é hora de testar se o Postfix está se comunicando com o MySQL:
# /etc/init.d/postfix restart
Precisamos criar um domínio e um usuário para teste.
Vamos fazer primeiramente na "mão", fazendo 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 domínio VIRTUAL e LOCAL:
mysql> INSERT INTO domain (
domain,
description,
transport,
active)
VALUES (
'dominio1.com.br' ,
'Dominio de Teste' ,
'maildrop' ,
'1');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO domain(
domain,
description,
transport,
active)
VALUES (
'local.com.br' ,
'Dominio LOCAL da Máquina' ,
'local' ,
'1');
Query OK, 1 row affected (0.00 sec)
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 (
'fulano@dominio1.com.br' ,
encrypt('xxxxx') ,
'Usuario Fulano' ,
'/var/spool/correio/' ,
'dominio1.com.br/fulano/Maildir/' ,
'10000000S' ,
'dominio1.com.br');
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO mailbox (
username,
password,
name,
home,
maildir,
quota,
domain)
VALUES (
'usuario@local.com.br' ,
encrypt('xxxxx') ,
'Usuario Local' ,
'/var/spool/correio/' ,
'local.com.br/usuario/Maildir/' ,
'10000000S' ,
'local.com.br');
Query OK, 1 row affected (0.05 sec)
mysql> SELECT username, name, home, maildir, quota, domain FROM mailbox;
fulano@dominio.com.br - Usuario Fulano - /var/spool/correio/ - dominio1.com.br/fulano/Maildir/ - 10000000S - dominio1.com.br
usuario@local.com.br - Usuario Local - /var/spool/correio/ - local.com.br/usuario/Maildir/ - 10000000S - local.com.br
mysql> exit
Bye Criando o HOME do usuário:
# mkdir -p /var/spool/correio/dominio1.com.br/fulano
# maildirmake++ /var/spool/correio/dominio1.com.br/fulano/Maildir
ou
# maildirmake /var/spool/correio/dominio1.com.br/fulano/Maildir
# chown maildrop:www-data /var/spool/correio/ -R
# chmod 770 /var/spool/correio/ -R
Configurações bem detalhadas... Com certeza vai facilitar a vida de muita gente.
Fica a sugestão para implementar um webmail...