Banco de Dados - MySQL

Instalando Servidor de E-mail com suporte a SMTP + POP + IMAP + Quota e SGBD MySQL

Este atigo mostra passo-a-passo um método de instalação de um servidor de e-mail com suporte a SMTP, POP, IMAP, QUOTA e armazenamento e controle de contas com Banco de Dados MySQL. Veja como é possível obter um servidor de e-mail para domínios virtuais, utilizando Postfix, Courier IMAP, MYSQL e SASL.

por Marco A. S. Máximo



Como usuário normal execute:

Listagem 8: Desabilçitando IPV6

$ cd /usr/local/src/courier-imap-1.6.2/ $ ./configure --without-ipv6 --enable-workarounds-for-imap-client-bugs

A opção --without-ipv6 desbilita o suporte ao IPV6, caso você não o use. A opção --enable-workarounds-for-imap-client-bugs habilita o suporte a algums bugs conhecidos de alguns clientes de email ao protocolo IMAP ( Netscape Communicator 4.7 não funciona sem essa opção).

Caso ocorra algum erro, pode ser a falta dos pacotes gdbm e gdbm-devel, usados para a autenticação com biblitecas GDBM com o módulo authuserdb. Esse processo demora um pouco e pode dar a impressão que o programa entrou em loop, não se preocupe isso é normal. Após o configure terminar devemos agora compila-lo: $ make

Após a compilação, logue-se como ROOT e instale o courier-imap:

Listagem 9: Instalando o courier-type

$ su #./make install

Ele será instalado no diretório /usr/lib/courier-imap. Vá para o diretório /usr/lib/courier-imap/etc e crie os arquivos de configuração do courier a partir dos arquivos de exemplos ( *.dist) ex:

Listagem 10: Criando arquivos de configuração

# cp imapd.dist imapd # cp imapd-ssl.dist imapd-ssl # cp pop3d.dist pop3d # cp pop3d-ssl.dist pop3d-ssl # cp authmysqlrc.dist authmysqlrc # cp authdaemonrc.dist authdaemonrc

Isso criará os seguintes arquivos de configuração do courier ( imapd, pop3d, authmysqlrc, authdaemonrc, imapd-ssl, pop3d-ssl) esses 2 últimos para conexões seguras.

DICA: Acho interresante manter os arquivos *.dist, isso ira ajudar caso você queira lembrar das configurações default do courier.

As configurações default dos arquivos (imapd e pop3d), ao meu ver, já são boas. Altere caso você sinta necessidade.

Conecte-se no MySQL e crie um usuário para o Courier poder acessar a base de dados "mail". Ex:

Listagem 11: Criando usuário para acessar a base de dados

 # mysql -D mysql -p Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 810 to server version: 3.23.46-log Type "help;" or "\h" for help. Type "\c" to clear the buffer. mysql> mysql> INSERT INTO user(host,user,password) VALUES ("localhost","courier",""); Query OK, 1 row affected (0.00 sec) mysql> UPDATE user SET password=password("senha") WHERE user="courier"; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) mysql> GRANT select,insert,update on mail.* TO courier; Query OK, 0 rows affected (0.01 sec) mysql> exit

Com o usuário "courier" criado no MySQL, edite o arquivo: /usr/lib/courier-imap/etc/authmysqlrc

Esse arquivo é responsável pelas configurações do Courier para que ele conecte no MySQL e autentique os usuários.Edite-o conforme as suas configurações.

Listagem 12: Exemplo de configurações

MYSQL_SERVER localhost MYSQL_USERNAME courier MYSQL_PASSWORD senha MYSQL_SOCKET /var/lib/mysql/mysql.sock MYSQL_PORT 3306 MYSQL_OPT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE virtual_users MYSQL_CRYPT_PWFIELD password MYSQL_UID_FIELD uid MYSQL_GID_FIELD gid MYSQL_LOGIN_FIELD id MYSQL_HOME_FIELD home MYSQL_NAME_FIELD nome MYSQL_MAILDIR_FIELD maildir MYSQL_QUOTA_FIELD quota MYSQL_WHERE_CLAUSE imapok=1

OBS: Você também pode editar o arquivo /usr/lib/courier-imap/etc/authdaemonrc e habilitar apenas os módulos de autenticação que você gostaria de usar.

Vamos agora iniciar o COURIER e o POP e fazer alguns testes de conexão.

Os arquivos que iniciam o serviço do courier e o pop são: /usr/lib/courier-imap/libexec/imapd.rc /usr/lib/courier-imap/libexec/pop3d.rc

Achei cômodo criar 2 links simbólicos para eles, com o nome de courier-imap e pop3, dentro do diretórios aonde estão os meus scripts de inicialização:

Listagem 12: Criação de links

# cd /etc/init.d/ # ln -s /usr/lib/courier-imap/libexec/imapd.rc courier-imap # ln -s /usr/lib/courier-imap/libexec/pop3d.rc pop3

Para iniciá-los apartir desse diretório é só digitar: # ./courier-imap start # ./pop3 start

Quando você inicia o courier, ele ira lê o arquivo /usr/lib/courier- imap/libexec/authlib/authdaemond, esse arquivo irá checar qual o modo de autenticação você ira usar depedendo dos pacotes que você tem instalado, caso você pretenda usar um outro modo de autenticação (plain, ldap, postgres), altere as configurações desse arquivo. Como vamos usar MySQL, não será necessário alterar esse arquivo.

Para saber ser os serviços imap e pop iniciaram sem problema, vamos rodar os serguintes comandos:

Listagem 13: Verificando inicialização correta dos arquivos

# ps ax 3387 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start 3388 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond 3389 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond 3390 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond 3395 0:00 /usr/lib/courier-imap/libexec/couriertcpd -addres 3396 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond 3397 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond 3399 0:00 /usr/lib/courier-imap/libexec/courierlogger imapd 3409 0:00 /usr/lib/courier-imap/libexec/couriertcpd -addres 3411 0:00 /usr/lib/courier-imap/libexec/courierlogger pop3d

Deve aparecer algo como isso. As linhas indicam que os serviços imap e pop3 subiram usando a autenticação pelo MySQL.

Vamos checar se as portas dos serviços estão abertas e repondendo:

Listagem 14: Testando se as portas estão abertas

# netstat -a|less Proto Recv-Q Send-Q Endereço Local Endereço Remoto Estado tcp 0 0 *:pop-3 *:* OUÇA tcp 0 0 *:imap2 *:* OUÇA

Listagem 15: Teste do IMAP

# telnet 0 143 Trying 0.0.0.0... Connected to 0. Escape character is "^]". * OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc. See COPYING for distribution information. 0 logout 

Listagem 16: Teste do POP3

# telnet 0 110 Trying 0.0.0.0... Connected to 0. Escape character is "^]". +OK Hello there. quit

Se aparecer isso, então esta ok. Vamos agora instalar/configurar o Postfix.

Instalando o Postfix

Vamos instalar o Postfix com suporte a Maildir+Cota de Disco+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 formarto Maildir, sendo necessário a instalação de uma Patch para tal.

Baixe o Postfix de: ftp://ftp.matrix.com.br/pub/postfix/official/

OBS: Atualmente o Postfix já esta na versão 2.0, lançada recentemente, mas o esse patch foi feito para a versão 1.1.11. Caso você não queira usa-lo, uma outra forma de você ter suporte a cota de disco para usuários virtuais, é usando o aplicativo /usr/lib/courier-imap/bin/deliverquota que vem junto com o courier-imap. Ele pode ser usado na linha "mailbox_command" no arquivo "main.cf" do Postfix, esse é um exemplo de sua sintaxe:

Listagem 17: Exemplo de sintaxe do Postfix

mailbox_command=/usr/lib/courier-imap/bin/deliverquota -w 90 ~/Maildir ou mailbox_command=/usr/lib/courier-imap/bin/deliverquota -w 90 10000000 ~/Maildir

Aonde, "-w 90" serve para enviar um email para o usuário caso o seu espaço em disco ultrapasse 90%. "10000000" (+/- 10MB) É a cota em disco para todos os usuários.

E "~/Maildir" É o local da caixa postal do usuário.

Listagem 18: Instalando o Postfix

# tar -zxvf postfix-1.1.11.tar.gz -C /usr/local/src/ # cd /usr/local/src/postfix-1.1.11/

Listagem 19: Instalando o PATCH para Cota

# gzip -cd /local_do_patch/postfix-1.1.11_quota_maildirsize.patch.gz | patch -p1 -E patching file README_FILES/VIRTUAL_README patching file src/global/mail_params.h patching file src/util/file_limit.c patching file src/virtual/mailbox.c patching file src/virtual/maildir.c patching file src/virtual/virtual.c patching file src/virtual/virtual.h

Listagem 20: Habilitando o suporte MySQL e SASL

db*-devel sasl-devel ed # make -f Makefile.init makefiles "CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/local/include" "AUXLIBS=/usr/lib/libmysqlclient.so -lm -L/usr/local/lib -lsasl" # make

Caso não você não tenha o grupo "postdrop", crie: # groupadd postdrop

Caso você ja tenha o Postfix instalado e configurado, então faça só uma atualização: # make upgrade

Caso contrário: # make install

Se correr tudo certo, rode o comando "postconf -m" na saida deve aparecer o nome mysql.

Agora é hora de configurar o Postfix para trabalhar com o MySQL e SASL, não vou entrar em detalhes sobre configuração do Postfix, pois existe ótimos tutoriais a respeito, por exemplo em http://www.conectiva.com/doc/livros/online/8.0/servidor/correioeletronico.htmlhttp://www.conectiva.com/doc/livros/online/8.0/servidor/correioeletronico.html#POSTFIX

Crie os seguintes arquivos dentro do diretório do Postfix, normalmente em /etc/postfix/

Listagem 21: Criando arquivos do Postfix

#transport.cf user = postfix password = senha dbname = mail table = transport select_field = transport where_field = domain hosts = localhost #gids.cf user = postfix password= senha dbname = mail table = virtual_users select_field = gid where_field = id hosts = localhost #uids.cf user = postfix password= senha dbname = mail table = virtual_users select_field = uid where_field = id hosts = localhost #mysql_virtual.cf user = postfix password= senha dbname = mail table = virtual_users select_field = maildir where_field = id hosts = localhost #mysql.aliases.cf user = postfix password= senha dbname = mail table = aliases select_field = rcpt where_field = alias hosts = localhost #mailboxsize-mysql.cf user = postfix password = senha dbname = mail table = virtual_users select_field = quota where_field = id hosts = localhost

Edite o "master.cf" e coloque a seguinte linha: virtual unix - n n - - virtual

Edite o "main.cf" e coloque as seguintes linhas:

Listagem 22: Editando o main.cf

home_mailbox=Maildir/ mydestination = $mydomain, $transport_maps #======= MYSQL============== transport_maps = mysql:/etc/postfix/transport.cf virtual_gid_maps = mysql:/etc/postfix/gids.cf virtual_mailbox_base = /home virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual.cf virtual_maps = mysql:/etc/postfix/mysql.aliases.cf virtual_uid_maps = mysql:/etc/postfix/uids.cf #======= Quota ============ virtual_mailbox_limit_inbox = no virtual_mailbox_limit_maps = mysql:/etc/postfix/mailboxsize-mysql.cf virtual_mailbox_limit_override = yes virtual_maildir_extended = yes virtual_create_maildirsize = yes virtual_mailbox_limit = 100000000 #====== SASL ================ smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_relay_domains

Agora é hora de testar se o Postfix esta se comunicando com o MySQL. # ./postfix start

Vamos criar um dominio virtual e um usuário para teste.

Listagem 23: Criando domínio e usuário para teste

# mysql -D mail -p Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 779 to server version: 3.23.46-log Type "help;" or "\h" for help. Type "\c" to clear the buffer. mysql> mysql> INSERT INTO transport(domain,transport) VALUES ("dominio.com.br","virtual:"); mysql> select * from transport; +----------------+-----------+ | domain | transport | +----------------+-----------+ | dominio.com.br | virtual: | +----------------+-----------+

Beleza!

Listagem 24: Criando um usuário:

mysql> INSERT INTO virtual_users (id,password,home,maildir,date_add,time_add,domain,nome) VALUES ("marco.maximo@dominio.com.br","/home/",encrypt("senha"), "dominio.com.br/marco.maximo/Maildir/","2002-12-18", "05:18:24","dominio.com.br","Marco A. S. Máximo"); mysql>select unique_id, uid, gid, quota from virtual_users where id="marco.maximo@dominio.com.br"; +-----------+----------------------------+-----+-----+----------+ | unique_id | id | uid | gid | quota | +-----------+----------------------------+-----+-----+----------+ | 568 | marco.maximo@dominio.com.br| 104 | 104 | 10000000 | +-----------+----------------------------+-----+-----+----------+ mysql> exit

Listagem 25: Criando o HOME e o Maildir do usuário.

# mkdir -p /home/dominio.com.br/marco.maximo # /usr/lib/courier-imap/bin/maildirmake \ /home/dominio.com.br/marco.maximo/Maildir # chmod -R 700 dominio.com.br/ # chown -R postfix:postfix dominio.com.br/

DICA: Isso parece muito trabalhoso, levando-se em consideração as facilidades do "adduser", porém você pode criar o seu própio script de criação de usuário ou em Shell Script ou PHP etc... Eu fiz o meu em Shell e já estou providenciando um em PHP.

Vamos enviar um email para teste:

# echo "Funcionou..." | mail -s "TESTE de EMAIL" marco.maximo@dominio.com.br

Saida do Log:

postfix/pickup[11200]: C1A3FC87: uid=0 from= postfix/cleanup[12609]: C1A3FC87: message-id=<20030101143500. C1A3FC87@teste.dominio.com.br> postfix/qmgr[10270]: C1A3FC87: from=, size=324, nrcpt=1 (queue active) postfix/virtual[12630]: C1A3FC87: to=, relay=virtual, delay=0, status=sent (maildir)

Opa, acho que foi:

# ls /home/dominio.com.br/marco.maximo/Maildir/new/ 1041431700.12630_0.pwemail1.localdomain,S=390 # cd /home/dominio.com.br/marco.maximo # cat Maildir/new/1041431700.12630_0.pwemail1.localdomain,S\=390 Return-Path: Delivered-To: marco.maximo@dominio.com.br Received: by teste.dominio.com.br (Postfix, from userid 0) id C1A3FC87; Wed, 1 Jan 2003 12:35:00 -0200 (BRST) To: marco.maximo@dominio.com.br Subject: TESTE de EMAIL Message-Id: <20030101143500.C1A3FC87@teste.dominio.com.br> Date: Wed, 1 Jan 2003 12:35:00 -0200 (BRST) From: root@dominio.com.br, (root)

Funcionou...É foi :-)

Teste de Autenticação do IMAP

# telnet 0 143 Trying 0.0.0.0... Connected to 0. Escape character is "^]". * OK Courier-IMAP ready. Copyright 1998-2002 Double Precision, Inc. See COPYING for distribution information. 0 login marco.maximo@dominio.com.br senha 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 1041451666] 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. Escape character is "^]". +OK Hello there user marco.maximo@dominio.com.br +OK Password required. pass senha +OK logged in. list +OK POP3 clients that break here, they violate STD53. 1 401
Marco A. S. Máximo

Marco A. S. Máximo