Visite também: Br-Linux ·  VivaOLinux ·  LinuxSecurity ·  Dicas-L ·  NoticiasLinux ·  SoftwareLivre.org ·  [mais]
Voltar   Under-Linux.org Fóruns > UnderLinux Wiki
Wiki Classificados Galeria Reviews Jogos Comunidades RSS Feeds FAQ Termos de Uso Sobre
Cadastre-se FotosBlogs Lista de Membros Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Ferramentas pessoais
Publicidade

From UnderLinux Wiki

Imagem:qmail.png

Postfix + Courier-IMAP + MySQL + Quota + SASL



Tabela de conteúdo

Introdução

Nesse tutorial vou mostrar como configurar um servidor de email Postix para trabalhar com MySQL+COURIER-IMAP+SASL+DOMÍNIOS VIRTUAIS+QUOTA. Não sou nenhum expert em nenhum desses programas,sou apenas um cara esforçado :-), mas o fato de estar trabalhando diariamente com eles, fez com que eu adquirisse uma certa experiência. Esse tutorial é uma compilação de vários tutorias, dicas, manuais e muita dor de cabeça que fui adquirindo até montar esse ambiente.

O meu problema começou quando me chamaram para trabalhar com servidores de email que suportasse vários domínios na mesma máquina, onde cada domínio representava uma empresa distinta, até ai eu sabia que o Postfix tinha esse tipo de suporte. Optei pelo Postfix devido a sua facilidade (experiências anteriores com Qmail :-) e compatilidade com o "Sendmail". Seguindo os manuais, consegui criar essa ambiente para 2 domínios e outros que aparecessem. Os meus problemas começaram quando, por exemplo, um diretor do dominio1 de nome Jose da Silva queria que o seu login fosse jose.silva, até ai tudo bem. Só que um outro diretor do dominio2, também de nome Jose da Silva queria que o seu login também fosse jose.silva. Ferrou!!! Pois eu não poderia criar dois logins iguais, e nem dava para esplicar que esse login já tinha sido reservado para o diretor de uma outra empresa. Olha a encrenca!!! Pedi ajuda nas listas de discursão e me sujeriram usar MySQL, ou um indicador no login; criando depois um alias para esse login. Bem, como eu não conhecia patavinas de MySQL, optei pela segunda dica :-).

Então criei o jose.silva-dm2 e uma alias ( jose.silva@dominio2.com.br = jose.silva-dm2 ). Perfeito, resolveu o problema só que tinha de explicar para todo mundo por que o seu login tinha esse "-dm2" e o seu email, não. Sem falar nos relatório de logs que não ficaram nada bonitos. O negócio começou a ficar feio, quando fechamos com um cliente que o seu Webmail mostrava o login da pessoa que estava logado no momento, e lá estava o "-dm*".

Os meus problemas seriam resolvidos se eu pudesse criar o login já com o domínio ex: jose.silva@dominio1.com.br. E não é que da!! :-) o Linux aceita. Só que quando esse usuário envia uma mensagen pelo Postifix, o seu email sai como "jose.silva@dominio1.com.br@dominio1.com.br", bem! Não preciso dizer mais nada :-)

Alguns dias antes de pedir as contas da empresa :-), resolvi pesquisar sobre o Postfix com MySQL, e o que lhes apresento agora, é o resultado da minha pesquisa.

Há! Ainda continuo na empresa :-)


Configuração

Configurando o MySQL

Muitas distribuições já trazem o MySQL, como eu estou usando o CL8, eu instalei os seguintes pacotes:

- MySQL-client-3.23.46-3cl

- MySQL-3.23.46-3cl

- MySQL-devel-3.23.46-3cl

No conectiva, um script chamado /usr/sbin/mysql_createdb cria a database mysql e configura a senha do usuário ROOT.

# /usr/sbin/mysql_createdb
<pre>

This script will create the main mysql database where user passwords and general permissions are stored. It will also ask you to configure the root password so that a blank one does not get asigned.

<pre>
Please, type the root password:

Please, retype to confirm:

021231 18:08:56 /usr/sbin/mysqld: Shutdown Complete

Sem essa etapa você não conseguirar iniciar o MySQL. Depois da senha criada, é hora de iniciar o MySQL:

#cds (obs: "cds" é um a ALIAS no Conectiva que te leva para o diretório /etc/init.d/)
# ./mysql start
Starting mysqld daemon with databases from /var/lib/mysql [ OK ]

Após iniciar o MySQL, criaremos agora as tabelas de uários e suas configurações, a tabela de transporte e a tabela de aliases. Para ser mais prático, você pode usar o seguinte script chamado mail.db:

Obs: Troque os valores de uid e gid pelo número correspondente ao do seu usuário e grupo do Postfix. Você também pode alterar o valor default (10000000=10MB) da cota de disco.

#=======================MAIL.DB=================================

#Cria a database com o nome de mail
#

CREATE DATABASE mail;
use mail;

#
#Cria a tabela de aliases
#

CREATE TABLE aliases (
alias varchar(255) NOT NULL default '',
rcpt varchar(255) default NULL,
PRIMARY KEY (alias)
) TYPE=MyISAM;


#Cria a tabela transport
#

CREATE TABLE transport (
domain char(128) NOT NULL default '',
transport char(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

#
#Cria a tabela virtua_users
#

CREATE TABLE virtual_users (
unique_id int(32) unsigned NOT NULL auto_increment,
id char(128) NOT NULL default '',
password char(128) default NULL,
uid int(10) unsigned default '104',
gid int(10) unsigned default '104',
home char(255) default NULL,
maildir char(255) default NULL,
date_add date default NULL,
time_add time default NULL,
domain char(128) default NULL,
nome char(255) default NULL,
imapok tinyint(3) unsigned default '1',
quota char(255) default '10000000',
PRIMARY KEY (id),
KEY unique_id (unique_id)
) TYPE=MyISAM;

#==========================================================

Salve esse script como mail.db e execute o seguinte comando:

$mysql -u root -p < mail.db

Isso irá criar todas as tabelas bem como a base de dados "mail".

Vamos agora criar o usuario que o Postfix ira usar para acessar o MySQL:


Logando no MySQL

$ mysql -u root 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 4 to server version: 3.23.46-log

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql>


Adicionando o usuário "postfix"

mysql> INSERT INTO user (host, user, password) VALUES('localhost','postfix','');
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE user set password=PASSWORD('senha') WHERE user='postfix';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT select, insert, update ON mail.* TO postfix;
Query OK, 0 rows affected (0.00 sec)

Beleza! Após ter criado o usuário, saia do MySQL e logue com o usuário que você criou para testar se esta tudo certo.

#mysql -D mail -u postfix -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 6 to server version: 3.23.46-log

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql>
mysql> show tables;
+----------------+
| Tables_in_mail |
+----------------+
| aliases |
| transport |
| virtual_users |
+----------------+

mysql> desc aliases;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| alias | varchar(255) | | PRI | | |
| rcpt | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

- Descrição

Essa tabela é aonde seram criados os meus aliases ou redirecionamentos.

- alias: É o meu alias de email

- rcpt: É o destinatário do email

Ex.:

+--------------------------+------------------------------------------------+
| alias | rcpt |
+--------------------------+------------------------------------------------+
|postmaster@dominio.com.br | marco@dominio.com.br |
+--------------------------+------------------------------------------------+
|postmaster@dominio2.com.br| marco@dominio2.com.br, marcelo@dominio1.com.br |
+--------------------------+------------------------------------------------+


mysql> desc transport;
+-----------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+---------+-------+
| domain | char(128) | | PRI | | |
| transport | char(128) | | | | |
+-----------+-----------+------+-----+---------+-------+
2 rows in set (0.00 sec)

'''- Descrição'''

Essa tabela é aonde você cria e indica se o domínio é virtual ou local.

- '''domain:''' Seu domínio
- '''transport:''' Tipo do transporte que o postfix irá usar para entregar a mensagen. Pode ser virtual ou local.

Ex.:

<pre>
+---------------+-----------+
| domain | transport |
+---------------+-----------+
|dominio.com.br | virtual: |
|dominio2.com.br| local: |
|dominio3.com.br| virtual: |
+---------------+-----------+



mysql> desc virtual_users;
+-----------+---------------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+----------+----------------+
| unique_id | int(32) unsigned | | MUL | NULL | auto_increment |
| id | char(128) | | PRI | | |
| password | char(128) | YES | | NULL | |
| uid | int(10) unsigned | YES | | 104 | |
| gid | int(10) unsigned | YES | | 104 | |
| home | char(255) | YES | | NULL | |
| maildir | char(255) | YES | | NULL | |
| date_add | date | YES | | NULL | |
| time_add | time | YES | | NULL | |
| domain | char(128) | YES | | NULL | |
| nome | char(255) | YES | | NULL | |
| imapok | tinyint(3) unsigned | YES | | 1 | |
| quota | char(255) | YES | | 10000000 | |
+-----------+---------------------+------+-----+----------+----------------+
13 rows in set (0.00 sec)
  • Descrição

É a tabela aonde seram criados os usuários e suas configurações como senha, diretório, cota de disco etc..

  • unique_id: Indica o número do usuário na tabela
  • id: É o login do usuário, pode ser marco.maximo.dominio.com.br ou marco.maximo@dominio.com.br
  • password: É a senha do usuário, você pode usar dois tipos de senhas: crypt() ou clear text. Esse último é interresante caso você vá usar alguma altenticação que use Cram-MD5. Eu uso o crypt, acho mais ético :-)
  • uid: virtual uid (use o do usuário postfix)
  • gid: virtual gid (use o do usuário postfix)
  • home: É o diretório aonde será criado as contas dos usuários
  • maildir: É o Maildir do usuário, aonde os email seram armazenados
  • date_add: Data da criação do usuário
  • time_add: Hora da criação do usuário
  • domain: Domínio de qual faz parte o usuário
  • name: O nome completo do usuário
  • imapok: Esse campo serve para habilitar(1) ou desabilitar(0) a conta do usuário, é usado pelo courier-imap para permitir o logon do usuário. Serve também para judiar um pouco dos seus desafetos dentro da empresa :-)
  • quota: É a cota de disco do usuário, o default é 10MB

Ex.:

  • Criando um usuário na tabela
mysql> INSERT INTO virtual_users ( id,home,password,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 * from virtual_users where id='marco.maximo@dominio.com.br';
+----------+-----+----------+------+----+------+---------+----------+---------+---------+------+--------+-------+
| unique_id | id | password | uid | gid | home | maildir | date_add | time_add | domain | nome | imapok | quota |
+-----------+----+----------+-----+-----+------+---------+----------+----------+--------+------+--------+-------+
| 568 | marco.maximo@dominio.com.br| VnVvbAij8UiC. | 104 | 104 | /home/ | dominio.com.br/marco.maximo/Maildir/ | 2002-12-18 | 05:18:24 | dominio.com.br | Marco A. S. Máximo | 1 | 10000000 |
-----------------------------------------------------------------------------------------------------------------

Obs.: Os campos uid, gid, cota estão com um valor padrão e o campo unique_id é auto incremental.

Como viram, agora eu posso criar o nome do usuário já com o seu domínio, podendo assim adicionar vários usuários de diferentes domínios na mesma tabela. O que temos que fazer, é "ensinar" ao Postfix a conectar-se no MySQL e pegar os dados que ele precisa sobre o usuário. Mas antes vamos configurar o Courier-IMAP.


Instalando o Courier-imap

Como vamos usar o Postfix com suporte a Maildir ao estilo Qmail, então o Currier-Imap é o programa que permite o acesso por IMAP a esse tipo de caixa postal. Ele também vai ser responsável por validar os logins dos usuários e permitir que os mesmos baixem as suas mensagens por POP3, tudo isso, lendo informações da tabela "virtual_users" no MySQL.

Baixe o Courier no site:

http://www.inter7.com/courierimap

http://twtelecom.dl.sourceforge.net/sourceforge/courier/courier-imap-1.6.2.tar.bz2

Apos o download descompacte em um diretório para a compilação.

Ex.:

tar -jxvf courier-imap-1.6.2.tar.bz2 -C /usr/local/src/

Para compilar o courier você precisa estar como usuário comum, se você descompactou como root, mude as permissões do diretório para seu usuário, no meu caso "marco":

# chown -R marco:marco courier-imap-1.6.2/

Como usuário normal execute:

$ 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:

$ 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:

#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.


Configurando

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

Ex.:

# 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. ex:

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:

#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:

#ps ax
3387 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3388 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3389 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3390 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3395 0:00 /usr/lib/courier-imap/libexec/couriertcpd -address=0 -stderrlogger=/usr/lib/courier-imap/libe
3396 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3397 0:00 /usr/lib/courier-imap/libexec/authlib/authdaemond.mysql start
3399 0:00 /usr/lib/courier-imap/libexec/courierlogger imapd
3409 0:00 /usr/lib/courier-imap/libexec/couriertcpd -address=0 -stderrlogger=/usr/lib/courier-imap/libe
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.


Testando

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

# 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


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


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:

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.

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

- Instalando

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

# cd /usr/local/src/postfix-1.1.11/

- 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

- Habilitando o suporte MySQL e SASL

Obs: É necessário os pacotes:

- 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.html#POSTFIX

Crie os seguintes arquivos dentro do diretório do Postfix, normalmente em /etc/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:

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.

# 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!


Configurando

  • 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 * from virtual_users where id='marco.maximo@dominio.com.br';
+----------+-----+----------+------+----+------+---------+----------+---------+---------+------+--------+-------+
| unique_id | id | password | uid | gid | home | maildir | date_add | time_add | domain | nome | imapok | quota |
+-----------+----+----------+-----+-----+------+---------+----------+----------+--------+------+--------+-------+
| 568 | marco.maximo@dominio.com.br| VnVvbAij8UiC. | 104 | 104 | /home/ | dominio.com.br/marco.maximo/Maildir/ | 2002-12-18 | 05:18:24 | dominio.com.br | Marco A. S. Máximo | 1 | 10000000 |
-----------------------------------------------------------------------------------------------------------------

mysql> exit
  • 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

# cat /home/dominio.com.br/marco.maximo/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 :-)


Testando

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

quit
+OK Bye-bye.
Connection closed by foreign host.

Beleza funcionou...

Dica: Caso o usuário não consiga ser autenticado, verifique o arquivo /usr/lib/courier-imap/etc/authmysqlrc. Uma linha errada pode ser a causa do problema ( isso já me valeu uma tarde inteira :-), também olhe o log do mysql normalmente em /var/log/mysql.log e confira se o Courier esta acessando o MySQL.


Testando a Cota de Disco

Quando você enviou um email para marco.maximo@dominio.com.br, o Postfix criou o arquivo chamando "maildirsize" dentro do ~/MAILDIR/ do usuário ex:

# ls /home/dominio.com.br/marco.maximo/Maildir/
courierimapuiddb cur/ maildirsize new/ tmp/

#cat /home/dominio.com.br/marco.maximo/Maildir/maildirsize
10000000S
796 1

Toda vez que o usuário recebe um email, o Postfix calcula o espaço utilizado e escreve nesse arquivo.

Vamos testar se a cota esta funcionado, primeiro vamos alterar o valor da cota do usuário para um valor menor, 1MB é o sulficiente.

Execute no shell:

# mysql -D mail -psenha_do_root -e "SELECT id,quota FROM virtual_users
WHERE id='marco.maximo@dominio.com.br';"
+-----------------------------+----------+
| id | quota |
+-----------------------------+----------+
| marco.maximo@dominio.com.br | 10000000 |
+-----------------------------+----------+

A cota esta em 10MB, vamos altera-la para 1MB

# mysql -D mail -psenha_do_root -e "UPDATE virtual_users SET quota=1000000
WHERE id='marco.maximo@dominio.com.br';"

# mysql -D mail -psenha_do_root -e "SELECT id,quota FROM virtual_users
WHERE id='marco.maximo@dominio.com.br';"
+-----------------------------+---------+
| id | quota |
+-----------------------------+---------+
| marco.maximo@dominio.com.br | 1000000 |
+-----------------------------+---------+

Apague o arquivo maildirsize do usuário

# rm /home/dominio.com.br/marco.maximo/Maildir/maildirsize

Vamos agora enviar email até a sua caixa chegue no limite especificado.

Para isso vou usar um programa que envia email com anexo http://rano.org/mailm/mailm-0.3.tar.gz

#ls -lh /tmp/arquivo.tar
-rwxr-xr-x 1 root root 246k Jan 3 09:14 /tmp/arquivo.tar*

# mailm -s TESTE_QUOTA -t marco.maximo@dominio.com.br -ad /tmp/arquivo.tar
# mailm -s TESTE_QUOTA -t marco.maximo@dominio.com.br -ad /tmp/arquivo.tar
# mailm -s TESTE_QUOTA -t marco.maximo@dominio.com.br -ad /tmp/arquivo.tar
# mailm -s TESTE_QUOTA -t marco.maximo@dominio.com.br -ad /tmp/arquivo.tar
  • Saida do log do Postfix
postfix/virtual[1589]: 216C1A14: to=,
relay=virtual, delay=31, status=sent (maildir)
postfix/virtual[1589]: 216C1A14: to=,
relay=virtual, delay=31, status=sent (maildir)
postfix/virtual[1589]: 216C1A14: to=,
relay=virtual, delay=31, status=sent (maildir)
postfix/virtual[1589]: 9460DA14: to=,
relay=virtual, delay=1, status=bounced (maildir delivery failed: Sorry,
the user's maildir has overdrawn his diskspace quota, please try again
later.)
# cat /home/dominio.com.br/marco.maximo/Maildir/maildirsize
1000000S
341089 1
340198 1

Beleza, mandei 4 arquivos de 246K no último o Postfix barrou a entrega. Lembrando que 1000000 não corresponde a 1MB precisamente :-)


Configuração do SASL

O SASL permite que um usuário consiga enviar email pelo servidor smtp (relay), sem que o seu IP esteja na lista de IP's liberados para isso (mynetworks=) no arquivo main.cf, desde que o usuário exista no sistema. Isso é um ótimo recurso que evita que você abra o seu ralay permitindo assim o envio de SPAM.

Istalando o SASL

Antes, instale os seguintes pacotes:

  • metamail
  • pam-devel

Baixe o Cyrus-SASL: ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-1.5.28.tar.gz

Obs.: Existe no site uma versão 2, porém não consegui faze-lo funcionar.

#tar -zxvf cyrus-sasl-1.5.28.tar.gz -C /usr/local/src/

#cd /usr/local/src/cyrus-sasl-1.5.28/

# ./configure --enable-plain --enable-login --disable-krb4
--disable-gssapi --disable-anon --disable-digest --disable-cram

# make

# make install

O progrmas ira criar o diretório /usr/local/lib/sasl, crie um link simbólico no diretório /usr/lib/sasl

# ln -s /usr/local/lib/sasl/ /usr/lib/sasl

Para permitir a autenticação SASL usando o MySQL, vamos usar o módulo "pam_mysql". Baixe ele de http://sourceforge.net/projects/pam-mysql/

Preparando para compilar:

# tar -zxvf pam_mysql-0.5.tar.gz -C /usr/local/src/

# cd /usr/local/src/pam_mysql/

# make

# cp pam_mysql.so /lib/security/

Configurando

Crie os seguintes arquivos com o respectivo conteúdo:

  • /usr/lib/sasl/smtpd.conf
#smtpd.conf
pwcheck_method: pam
  • /etc/pam.d/smtp
#smtp
auth optional /lib/security/pam_mysql.so user="postfix"
passwd="senha" host="localhost" db="mail" table="virtual_users"
usercolumn="id" passwdcolumn="password" crypt=1
account required /lib/security/pam_mysql.so user="postfix"
passwd="senha" host="localhost" db="mail" table="virtual_users"
usercolumn="id" passwdcolumn="password" crypt=1

Reinicie o Postfix:

# ./postfix restart


Testando

Vamos testar a autenticação SASL, para isso vamos criar nossa senha para teste:

printf 'marco.maximo@dominio.com.brmarco.maximo@dominio.com.brsenha' |
mmencode
bWFyY28ubWF4aW1vQGRvbWluaW8uY29tLmJyAG1hcmNvLm1heGltb0Bkb21pbmlvLmNvbS5icgBzZW5oYQ==

Após ele gerar essa senha, faça:

# telnet 0 25
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
220 teste.dominio.com.br ESMTP Postfix

ehlo teste
250-teste.dominio.com.br
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME

auth plain
bWFyY28ubWF4aW1vQGRvbWluaW8uY29tLmJyAG1hcmNvLm1heGltb0Bkb21pbmlvLmNvbS5icgBzZW5oYQ==
235 Authentication successful

quit
221 Bye
Connection closed by foreign host.

Funcionou! Agora quando você for enviar email, habilite a opção de autenticação no seu cliente de email.

Parabéns.


Epílogo

Atenciosamente, Marco A. S. Máximo.

São Paulo - SP

Linux User n.232424

Fonte

* Postfix:

Baixe o Postfix de:

E o seu patch para Maildir Quota:

ou


* Courier:


* SASL:

Créditos


Imagem:Avatar olhos spawn 2.jpg --Duca 14:08, 11 Janeiro 2006 (BRDT)

Horários baseados na GMT -3. Agora são 23:22.


Powered by vBulletin®
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.