INTRODUÇÃO POSTFIX


Este é um "Tutorial" criado por Jefferson baseado no tutorial original:

Este tutorial aborda a criação de um servidor de e-mail baseado em banco de dados MySQL, com suporte a QUOTA de usuários, antispam, antivírus, webmail e tudo mais o que se pode imaginar.


Tutorial criado em: 09/12/2006                  Última Atualização: 18/12/2006

Plataforma: FreeBSD 6.0

Versão do Tutorial: TUTORIAL-POSTFIX-1.1.3-Beta

Licensa: LDP ( Linux Documentation Project )

 




 

Versões para OpenBSD em breve!


Copyright (c) 2004 Jefferson <jeffi@linuxajuda.org>.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found here.
 

 
 
 

O seu propósito, é mostrar como configurar um servidor de e-mail Postfix para trabalhar com vários domínios em uma mesma máquina, utilizando para isso, o MySQL.

Esse tutorial é voltado para administradores de sistema ou usuários interessados em montar um ambiente de email de alta performance. Os requisitos necessários, são o conhecimento em FreeBSD, um pouco de Postfix e experiência na compilação de pacotes.

Não me responsabilizo por qualquer problema ou perda de informações que esse tutorial possa vir a causar. Fiz um grande esforço para tentar deixar esse tutorial o mais didático e intuitivo possível, chegando até a montar duas vezes o mesmo ambiente. Tudo isso para que, quem se propor a utilizá-lo tenha um mínimo de sucesso.

Sendo assim, não darei suporte a usuários desse material nem responderei a e-mails com pedido de ajuda.



Ficarei muito feliz em receber e-mails de agradecimentos ou relatos de sucesso que esse tutorial possa ter proporcionado.

Também, gostaria que vocês mandassem sugestões e críticas (construtivas) para um maior enriquecimento desse material.

 

APLICATIVOS ! ! !

 

 

A SOLUÇÃO ! ! !

Descrição da solução e características do site:

  • Este site utiliza um menu deslizante ao lado esquerdo para facilitar a busca e a navegação dos tópicos relacionados.
     
  • Correção de todos os links do site. No caso de haver algum link fora, favor me notificar através de e-mail.
     
  • Este ambiente terá agora como plataforma o sistema operacional FreeBSD 6.0.
     
  • Utilizar o Postfix em conjunto com o MySQL, ou seja, todas as contas e aliases dos usuários são criadas no banco de dados e não no sistema, como é por padrão.
     
  • Pode-se utilizar as contas LOCAIS (do sistema) já criadas, em conjunto com o MySQL, nesse caso, toda conta criada no MySQL é reconhecida pelo Postfix com uma conta "VIRTUAL" e as contas locais como "LOCAL".
     
  • Utilização de contas do tipo Maildir (igual ao Qmail). Isso traz vantagem na segurança e no desempenho.
     
  • Utilização do Maildrop para controle de QUOTAS.
    Aviso ao usuário, por parte do MAILDROP, caso o seu espaço em disco ultrapasse os 90% de utilização;
     
  • PostfixADMIN, um ambiente completo para gerenciar as contas virtuais através de uma página WEB;
     
  • VACATION, aplicativo que permite o Postfix enviar um email de resposta automático, pode ser usado para casos em que o usuário não se encontre no escritório;
     
  • Clamav + SpamAssassin;
     
  • Mcafee, agora você pode contar com outro podesoro antivirus neste ambiente. Porém, os dois não devem trabalhar simultaneamente, vou apenas ensinar como deixar os dois configurados.
     
  • SMTP-AUTH, utilização do mesmo método AUXPROP de autenticação de usuários no SASL2 usado no artigo anterior.
     
  • Webmail (squirrelmail) com suporte ao MySQL, Courier-IMAP e Domínios Virtuais;
     
  • Nesse ambiente foi utilizado o sistema FreeBSD 6.0. E a vantagem deste tutorial, é que pode ser portado para qualquer outra versão do FreeBSD anterior.
     
  • Mostrarei como fazer a instalação dos programas utilizando o sistema via "ports" e em outros casos utilizando os "SOURCES".
     

O PROBLEMA ! ! !

Meu problema começou quando me chamaram para trabalhar com servidores de e-mail que suportassem 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 e um outro motivo da escolha foi devido a sua facilidade (péssimas experiências anteriores com Qmail :-)) e também a sua compatibilidade com o "Sendmail".

Seguindo os manuais, consegui criar um ambiente para 2 domínios e outros tantos que aparecessem.

Outros problemas começaram, quando por exemplo, um diretor do DOMINIO1 de nome José 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 José 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 explicar que esse login já tinha sido reservado para o diretor de uma outra empresa. Olha a encrenca!

Pedi ajuda nas listas de discussões e me sugeriram usar MySQL ou um indicador no login; criando depois um alias para esse login.

Bem, como eu não conhecia patavina de MySQL, optei pela segunda dica. Então criei:

"jose.silva-dm2" é 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 e-mail, não. Sem falar nos relatórios 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, por exemplo: jose.silva@dominio1.com.br. E não é que dá! :-) O FreeBSD aceita. Só que quando esse usuário envia uma mensagem 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 como última solução, pesquisar sobre o Postfix com MySQL. E o que lhes apresento agora, é o resultado da minha pesquisa. Há! Ainda continuo na empresa :-)
 

INSTALAÇÃO DO FreeBSD 6.0 ! ! !

  • Bom, então vamos ao que interessa! Suponho que você tenha o CD do FreeBSD 6.0, e que você já saiba dar boot pelo CD =). Vamos particionar seu HD. Aqui no meu laboratório usei um HD de 40GB.
     
  • Ao contrário do Linux, o sistema de partições do FreeBSD é chamado de UFS ( Unix FileSystem ), e a maneira de como ele pode ser particionado é bem interessante. As partições são criadas dentro de Slices ( fatias ) de no máximo 7 partições dentro de cada Slice. E como vamos utilizar mais de 8 partições neste ambiente, é necessário que seja criado então 2 Slices. A partir dai, podemos criar as partições da forma que desejarmos, mas para mantermos um padrão bem organizado, eu optei por criar partições em um HD de 40GB da seguinte forma:

     
  • Primeiro Slice:
 
Filesystem Size Mounted on  System
 
/dev/ad0s1b
1 GB
swap
Swap
/dev/ad0s1a
700 MB
/
UFS
/dev/ad0s1g
1 GB
/home
UFS
/dev/ad0s1d
100 MB
/tmp
UFS
/dev/ad0s1e
4 GB
/usr
UFS
/dev/ad0s1f
4 GB
/var
UFS
/dev/ad0s1h
1 GB
/www
UFS

 

  • Segundo Slice:

 
Filesystem Size Mounted on  System
 
/dev/ad0s2d
29 GB
/mailbox
UFS
  • Obs: Como você pode ver, a unica diferença entre as duas tabelas é a nomenclatura, onde "ad0s1" refere-se ao primeiro slice e o "ad0s2" refere-se ao segundo slice.

    Uma rápida explicação das partições:

    /dev/ad0s1f - /var - Logs
    /dev/ad0s1h - /www - Webmail
    /dev/ad0s2d - /mailbox - Caixas Postais

    Bom, este foi um pequeno exemplo de como você poderá particionar o seu HD para este ambiente.

    Não entrarei em mais detalhes sobre particionamento.

    Caso tenha maiores dúvidas sobre particionamento, sugiro que pesquise nos sites abaixos:
     
    http://www.google.com.br  
    http://www.freebsd.org/handbook  

    Dica !!!!
    • Na instalação do FreeBSD, selecione a opção "Developer" e selecione "YES" para a instalação do PORTS quando questionado.
 

ANTES DE COMEÇAR ! ! !

Coloque todos os programas dentro do diretório '~/', pois esse diretório será usado para compilar os fontes. Isso não influência em NADA a instalação, apenas tenho preguiça de digitar /usr/local/src/  =)

Toda instalação será executada como ROOT.

PS: Onde aparecer os caracteres "xxxxx", troque pela sua senha correspondente.

Então vamos iniciar nossa configuração criando primeiramente toda a base para o nosso MTA, começando pelos 'users e groups', que serão necessários para a instalação dos programas 'Maildrop' e 'Postfix'.

Uma forma interessante de manutenção do sistema FreeBSD, é o seu utilitário de frontend chamado "sysinstall", com ele você pode criar grupos e usuário, configurar ips estáticos, ajustar hora do sistema entre outras coisas. Então vou mostrar aqui como criar um usuário de ambas as formas, utilizando tanto o sysinstall como cria-los à moda antiga. Criaremos o seu usuário utilizando o sysintall e os demais usando a linha de comando.

Execute o comando "sysinstall" sem as aspas, e logo verá uma tela como esta, e selecione a opção "Configure como mostrado na tela abaixo."

Depois selecione a opção "User Management" como mostra a figura abaixo:

Depois selecione a opção "User" como mostra a figura abaixo:

Preencha os campos como mostra a figura abaixo, é necessário que você coloque o seu usuário no grupo wheel, pois sem isso você não poderá usar o comando SU para se tornar super usuário. É importante também selecionar a shell de sua preferência, no meu caso, gosto de usar o /bin/csh, mas você pode usar a shell que mais te agrada, no FreeBSD, o BASH não vem instalado por padrão, caso você tenha interesse em usa-la, você terá que instalar via SOURCE ou via PORTS. Mas não vou entrar no mérito de instalações de shells neste tutorial. Agora selecione a opção Ok para criar seu usuário.

 

Bom, feito isso, seu usuário foi criado, espero que você tenha gostado do exemplo acima. Agora vamos criar os outros usuários necessário para o ambiente usando a linha de comando.
 


/* Crie o grupo e usuário para o MAILDROP: */

# pw groupadd maildrop -g 108
# pw adduser maildrop -d /var/spool/mail -g 108 -u 108 -s /sbin/nologin

/* Crie o grupo e usuário para o POSTFIX: */

# pw groupadd postdrop
# pw adduser postfix -d /dev/null -s /sbin/nologin
 

Criamos então um user através do sysinstall, dessa forma ele também cria automaticamente o seu homedir que será usado para salvar os softwares que serã baixados em seu sistema e posteriormente compilados e instalados, outro para o Maildrop e também para o Postfix, . Lembrando que o nome "jeffi" é apenas para exemplo, esteja a vontade para criar o user com o nome que você desejar.

Um fator de máxima importância neste ambiente que devemos realizar, é a desativação do Sendmail. Pois ele já vem instalado e ativado por padrão no FreeBSD, mas nós não queremos ele por aqui certo ? Uma dica legal também, é a ativação do serviço de SSH para acesso remoto.

Para desativar o Sendmail e ativar o SSH, devemos editar o arquivo /etc/rc.conf e adicionar as linhas:

sendmail_enable="NONE"
sshd_enable="YES"

Mate o processo do sendmail e inicie o processo do sshd. Agora se quiser, reinicie o servidor para ver se as configurações terão efeito quando você tiver uma queda de energia ou tiver que reiniciar o servidor por algum motivo bastante crítico.

É isso ae !!!!

 

INSTALANDO O MYSQL E A BASE DO POSTFIX !!!



Logando no sistema como ROOT, execute os seguintes comandos:
 

# cd /usr/ports/databases/mysql41-server/
# make install clean
 
 
Próximo passo será alterar o caminho do arquivo de log do MySQL, aconselho indicar o dir padrão de todos os outros logs, no caso o /var/log/mysql/mysqld.log. Assim fica mais fácil até mesmo no caso de haver outro administrador na empresa. Para isso crie o arquivo em /etc/my.cnf com o seguinte conteúdo:
 
[mysql.server]
datadir=/var/db/mysql
socket=/tmp/mysql.sock

[mysqladmin]
socket=/tmp/mysql.sock

[mysqld]
datadir=/var/db/mysql
socket=/tmp/mysql.sock
language=/usr/local/share/mysql/english/

log=/var/log/mysql/mysqld.log

[mysql]
socket=/tmp/mysql.sock
 
 
Crie o diretório de log do MySQL e mude a permissão:
 
# mkdir /var/log/mysql
# chown mysql:mysql /var/log/mysql

/* Inicie o serviço MySQL e teste: */

# /usr/local/etc/rc.d/mysql-server

/* Saída do Log do MySQL: */

# cat /var/log/mysql/mysqld.log

/usr/local/libexec/mysqld, Version: 4.1.13-log. started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
 

Para que o serviço volte a operar automaticamente caso o servidor seja reiniciado, é necessário editar o arquivo /etc/rc.conf, vou mostrar um exemplo de pós instalação do FreeBSD ( ativação do portas USB, configuração de rede, hostname, ativação do sshd, e desativação do sendmail ), é um exemplo bem básico.
 

# -- sysinstall generated deltas -- # Fri Dec 8 23:20:54 2006
# Created: Fri Dec 8 23:20:54 2006
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf.

usbd_enable="YES"

ifconfig_xl0="inet 192.168.0.3 netmask 255.255.255.0"
keymap="br275.iso.acc"
defaultrouter="192.168.0.1"
hostname="srvmail.postfix"

sshd_enable="YES"
sendmail_enable="NONE"

mysql_enable="YES"

 

Agora temos que setar uma senha para o usuário ROOT do MYSQL, para isto, utilize o comando abaixo alterando os caracteres "xxxxxx" pela sua respectiva senha.
 
# mysqladmin -u root password xxxxxx

Beleza! Vamos agora criar as tabelas para o POSTFIX. Crie um arquivo com o nome "postfix_mysql.db" ( ou qualquer outro nome que você queira usar ) com o seguinte conteúdo:

ATENÇÃO:

  • Substitua, no primeiro bloco, o valor "xxxxx" pela senha dos usuários correspondentes.
     
  • Substitua, caso queira, o diretório onde ficarão as caixas postais dos usuários, no último bloco no campo home. No meu caso estou usando o diretório "/mailbox/".

DICA: Uma boa dica aqui, é no caso de você querer utilizar algum Frontend para MySQL para facilitar a administração do mesmo em caso de acesso remoto. Para isso você terá que alterar no campo 'Host' de um dos users que terá acesso ao banco de dados remotamente. Você pode utitlizar para isso o usuário "postfixadmin", então troque o valor 'localhost' por '%' no script abaixo. Apenas siga as marcações em vermelho para encontrar as linhas a serem alteradas.


# INÍCIO DO postfix_mysql.db =================
#
# Postfix / MySQL


# Cria o banco de dados postfix

create database postfix;
use postfix;

# Tabela alias

create table alias (
address varchar(255) not null primary key,
goto text not null,
domain varchar(255) not null,
create_date datetime not null default '0000-00-00 00:00:00',
change_date datetime not null default '0000-00-00 00:00:00',
active tinyint(4) not null default '1');

# Tabela domain

create table domain (
domain varchar(255) not null primary key,
description varchar(255) not null,
transport varchar(255) not null default 'maildrop',
create_date datetime not null default '0000-00-00 00:00:00',
change_date datetime not null default '0000-00-00 00:00:00',
active tinyint(4) not null default '1');

# Tabela mailbox

create table mailbox (
username varchar(255) not null primary key,
password varchar(255) not null,
name varchar(255) not null,
home char(255) default '/mailbox/',
maildir varchar(255) not null,
quota varchar(255) not null default '10485760S',
domain varchar(255) not null,
create_date datetime not null default '0000-00-00 00:00:00',
change_date datetime not null default '0000-00-00 00:00:00',
active tinyint(4) not null default '1',
passwd_expire enum('N','Y') default 'Y',
uid int(10) unsigned default '108',
gid int(10) unsigned default '108');

# Tabela admin

create table admin (
username varchar(255) not null primary key,
password varchar(255) not null,
domain varchar(255) not null,
create_date datetime not null default '0000-00-00 00:00:00',
change_date datetime not null default '0000-00-00 00:00:00',
active tinyint(4) not null default '1');

# Cria os usuários (postfix, maildrop e postfixadmin) com suas respectivas senhas e privilegios.

grant select on postfix.* to postfix@localhost identified by 'xxxxx';
grant select on postfix.* to maildrop@localhost identified by 'xxxxx';
grant select,update,delete,insert on postfix.* to postfixadmin@localhost identified by 'xxxxx';

# Altera o campo host da tabela user e db do banco mysql para que o user postfixadmin ter acesso de qualquer lugar.

use mysql
update user set host = 'localhost ou %' where user = 'postfixadmin';
update db set host = 'localhost ou %' where user = 'postfixadmin';

# Salva definições

FLUSH PRIVILEGES;

# Script by NoComments

 


Depois do arquivo criado, execute o comando com a senha do usuário root do MySQL:
 
# mysql -psenha_do_root < postfix_mysql.db
 
O banco e as tabelas, bem como o usuário do postfix serão criados. Vamos testar o acesso do usuário postfix:
 

# mysql -D postfix -u postfix -psenha_do_postfix

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: 4.0.26-log

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

mysql>
 

 

mysql> show tables;
+-------------------+
| Tables_in_postfix |
+-------------------+
| admin             |
| alias             |
| domain            |
| mailbox           |
+-------------------+

mysql> desc alias;

+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| address     | varchar(255) |      | PRI |                     |       |
| goto        | text         |      |     |                     |       |
| domain      | varchar(255) |      |     |                     |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+

Descrição: Essa tabela é onde serão criados os redirecionamentos (ALIAS).

address: É o endereço do novo redirecionamento (ALIAS)
goto: É o destinatário(s) do redirecionamento.

Exemplo:

address => goto
postmaster@dominio.com.br > jeffi@dominio.com.br
postmaster@dominio2.com.br => jeffi@dominio2.com.br, jeffi@dominio1.com.br


mysql> desc domain;
+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| domain      | varchar(255) |      | PRI |                     |       |
| description | varchar(255) |      |     |                     |       |
| transport   | varchar(128) |      |     | maildrop            |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+

Descrição: Essa tabela é aonde você cria e indica o domínio.

transport: Nesse campo, você indica se o transporte será "local", para usuários do sistema ou "maildrop", para usuários virtuais. O padrão é "maildrop".


mysql> desc mailbox;
+---------------+------------------+------+-----+---------------------+-------+
| Field         | Type             | Null | Key | Default             | Extra |
+---------------+------------------+------+-----+---------------------+-------+
| username      | varchar(255)     |      | PRI |                     |       |
| password      | varchar(255)     |      |     |                     |       |
| name          | varchar(255)     |      |     |                     |       |
| home          | varchar(255)     | YES  |     | /mailbox/           |       |
| maildir       | varchar(255)     |      |     |                     |       |
| quota         | varchar(255)     |      |     |10000000S            |       |
| domain        | varchar(255)     |      |     |                     |       |
| create_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |
| change_date   | datetime         |      |     | 0000-00-00 00:00:00 |       |
| active        | tinyint(4)       |      |     | 1                   |       |
| uid           | int(10) unsigned | YES  |     | 108                 |       |
| gid           | int(10) unsigned | YES  |     | 108                 |       |
| passwd_expire | enum('N','Y')    | YES  |     | Y                   |       |
+---------------+------------------+------+-----+---------------------+-------+

Descrição: É a principal tabela, onde serão criados os usuários e suas configurações como senha, diretório, QUOTA de disco, etc.

  • username: É o login do usuário. Exemplo: jeffi@dominio1.com.br
     
  • password: É a senha do usuário, você pode usar dois tipos de senhas: crypt() ou clear text. Esse último é interessante caso você vá usar alguma autenticação que use Cram-MD5. Eu uso o crypt, acho mais ético.
     
  • name: O nome completo do usuário.
     
  • home: É o diretório aonde será criado as caixas postais dos usuários. Normalmente é usado o /home, mas no meu caso usarei o diretório /mailbox/.

    Usar um outro diretório no lugar do /home/ é recomendável, pois o dono desse diretório deve ser o usuário maildrop. Isso pode causar um problema caso você já tenha usuários criados nesse diretório.
     
  • maildir: É o Maildir do usuário, aonde os email serão armazenados.
     
  • quota: É a QUOTA de disco do usuário, o default é 10MB. Note o "S" no final do valor, ele é necessário para o MAILDROP criar o arquivo "maildirsize" no diretório do usuário. Esse arquivo contém um cálculo da QUOTA atual do usuário.
     
  • domain: Domínio de qual faz parte o usuário.
     
  • active: Esse campo serve para habilitar(1) ou desabilitar(0) a conta do usuário, é usado pelo courier-imap para permitir o login do usuário. Serve também para maltratar um pouco dos seus desafetos dentro da empresa :-)
     
  • uid: virtual uid (use o do usuário maildrop).
     
  • gid: virtual gid (use o do usuário maildrop).
     
  • passwd_expire: Esse campo é utilizado por alguns programas para forçar a mudança de senha por parte do usuário.

mysql> desc admin;
+-------------+--------------+------+-----+---------------------+-------+
| Field       | Type         | Null | Key | Default             | Extra |
+-------------+--------------+------+-----+---------------------+-------+
| username    | varchar(255) |      | PRI |                     |       |
| password    | varchar(255) |      |     |                     |       |
| domain      | varchar(255) |      |     |                     |       |
| create_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| change_date | datetime     |      |     | 0000-00-00 00:00:00 |       |
| active      | tinyint(4)   |      |     | 1                   |       |
+-------------+--------------+------+-----+---------------------+-------+

Descrição: Essa tabela é usado pelo PostfixAdmin para criar os administradores que irão ser responsáveis pela administração das contas dos respectivos domínios.

Legal! O nosso banco de email está criado. 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 SASL e o Courier-IMAP.

INSTALANDO O Cyrus-SASL ! ! !

O SASL permite que um usuário consiga enviar emails pelo servidor smtp (relay) sem que o seu IP esteja na lista de IP's liberados para relay, no postfix é configurado na linha "mynetworks" no arquivo main.cf.

O requisito para enviar email é que o usuário exista no sistema. Isso é um ótimo recurso, pois o usuário onde estiver pode enviar email pelo seu servidor, sem que você precise liberar o "Relay" para todo mundo.

O uso desta ferramenta é muito importante, porque impede que usuários não cadastrados no sistema use o seu servidor de e-mail para prática de SPAMS, e você não precisará liberar o RELAY para toda a internet.

Sem esse tipo de configuração, o seu servidor de e-mail iria com certeza parar nas regras de 'RBL' ( RealTime Blackhole List ), o que não seria muito agradável para a empresa e muito menos para o seu chefe. :)

Nessa versão do tutorial, configurei o SASL para autenticação de usuários LOCAIS (do sistema) e VIRTUAIS (MySQL).

Porém, devemos voltar nossa atenção para alguns detalhes antes de compilar e instalar o software. Neste ambiente, o SASL2 ainda não faz autenticação com senhas criptografadas por padrão. Por isto é necessário compilar o SASL2 com os 3 patches em seu respectivo diretorio.

Salve os Patches no diretório "/usr/ports/security/cyrus-sasl2/files" :

Preparando para compilar/instalar o Cyrus-SASL+Patch. Observe primeiramente se os patches estão no diretório correto, senão, copie-os e em seguida instale o SASL2 com os comandos abaixo:

# cp ~/patch-lib::Makefile.in /usr/ports/security/cyrus-sasl2/files
# cp ~/patch-lib::checkpw.c /usr/ports/security/cyrus-sasl2/files
# cp ~/patch-plugins::sql.c /usr/ports/security/cyrus-sasl2/files
# cd /usr/ports/security/cyrus-sasl2
# make WITH_MYSQL=yes
# make install clean
 

Crie o seguinte arquivo com o respectivo conteúdo:
 
# /usr/local/lib/sasl2/smtpd.conf
# -----------

pwcheck_method: auxprop
mech_list: login plain
sql_engine: mysql
auxprop_plugin: sql
srp_mda: md5
password_format: crypt
sql_hostnames: localhost
sql_user: postfix
sql_passwd: xxxxx
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'
sql_verbose: true
 

 

INSTALANDO O COURIER-IMAP ! ! !

Como iremos utilizar o Postfix com suporte para Maildir ao estilo Qmail, então o Courier-IMAP é o programa que permite o acesso a esse tipo de caixa postal. Ele também vai ser responsável por validar os logins dos usuários e permitir que eles baixem as suas mensagens por POP3 ou acesso por IMAP. Tudo isso, lendo informações da tabela "mailbox" no MySQL.

Assim como no Cyrus, nós também iremos utilizar o sistema PORTS do FreeBSD para a instalação deste pacote, é necessário ter acesso root.

# cd /usr/ports/mail/courier-imap
# make WITH_MYSQL=yes
 

Isso irá instalar o courier-authlib automaticamente, necessário para a instalação do courier-imap e criará os seguintes arquivos de configuração do courier: imapd, pop3d, authmysqlrc, authdaemonrc, imapd-ssl, pop3d-ssl. Esses 2 últimos para conexões seguras.

Configurando o Courier:

# cd /usr/local/etc/courier
# mkdir dist
# mv *.dist dist/
 

DICA: Acho interessante manter os arquivos *.dist, isso irá 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ê tenha necessidade.

Edite o /usr/local/etc/authlib/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. Exemplo:

# vi /usr/local/etc/authlib/authmysqlrc
 
MYSQL_SERVER   localhost
MYSQL_USERNAME   postfix
MYSQL_PASSWORD   xxxxx
MYSQL_SOCKET   /tmp/mysql.sock
MYSQL_PORT   3306
MYSQL_OPT   0
MYSQL_DATABASE   postfix
MYSQL_USER_TABLE   mailbox
MYSQL_CRYPT_PWFIELD   password
MYSQL_UID_FIELD   uid
MYSQL_GID_FIELD   gid
MYSQL_LOGIN_FIELD   username
MYSQL_HOME_FIELD   home
MYSQL_NAME_FIELD   name
MYSQL_MAILDIR_FIELD   maildir
MYSQL_QUOTA_FIELD   quota
MYSQL_WHERE_CLAUSE   active=1
 

ATENÇÃO: Não deixe espaços ou tab no começo do nome. Isso causa erro para o Maildrop. Exemplo:

MYSQL_MAILDIR_FIELD     maildir - (Correto!)
  MYSQL_QUOTA_FIELD     quota   - (Incorreto)
 

Antes de iniciar os serviços de pop e imap, é recomendável que você edite o arquivo "/etc/rc.conf" novamente e adicione as seguintes linhas:

courier_authdaemond_enable="YES"
courier_imap_pop3d_enable="YES"
courier_imap_imapd_enable="YES"
 

Coloque as 3 últimas linhas acima no arquivo /etc/rc.conf para que os serviços IMAP e POP3 sejam iniciados automaticamente durante a inicialização do servidor.

É extramamente importante que sejam adicionados nessa ordem, o courier-authdaemond deve ser iniciado antes dos serviços de pop e imap, pois estes serviços dependem do arquivo de configuração do authlib para se conectar ao banco de dados. De outra forma, o courier-imap não conseguirá conectar no banco de dados.

Os scripts de inicialização de qualquer software instalado via PORTS estão localizados em /usr/local/etc/rc.d/, neste diretório você encontrará os scripts de inicialização do courier-authlib, courier-imapd e courier-pop entre outros softwares que você tenha instalado via PORTS.

Mas os que nos interessam no momento são apenas os 3 acima mencionados, certo ? Agora inicie os serviços na mesma ordem colocada no arquivo /etc/rc.conf:

# ./usr/local/etc/rc.d/courier-authdaemond.sh start
# ./usr/local/etc/rc.d/courier-imap-pop3d.sh start
# ./usr/local/etc/rc.d/courier-imap-imapd.sh start
 

Teste se os serviços IMAP e POP iniciaram sem problemas, vamos rodar os seguintes comandos:

# ps ax |grep courier

435 con- I 0:00.01 /usr/local/sbin/courierlogger -facility=mail -pid=/var/run/authdaemond/pid -start /usr/local/libex
436 con- I 0:00.05 /usr/local/libexec/courier-authlib/authdaemond
451 con- I 0:00.02 /usr/local/sbin/courierlogger -pid=/var/run/imapd.pid -start -name=imapd /usr/local/libexec/courie
452 con- I 0:00.05 /usr/local/libexec/courier-imap/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noid
466 con- I 0:00.01 /usr/local/sbin/courierlogger -pid=/var/run/pop3d.pid -start -name=pop3d /usr/local/libexec/courie
467 con- I 0:00.02 /usr/local/libexec/courier-imap/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noid
470 con- I 0:00.04 /usr/local/libexec/courier-authlib/authdaemond
471 con- I 0:00.04 /usr/local/libexec/courier-authlib/authdaemond
472 con- I 0:00.04 /usr/local/libexec/courier-authlib/authdaemond
473 con- I 0:00.04 /usr/local/libexec/courier-authlib/authdaemond
474 con- I 0:00.04 /usr/local/libexec/courier-authlib/authdaemond

 

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

# netstat -an | grep tcp

Proto    Recv-Q    Send-Q    Local Address    Foreign Address      State
tcp4              0             0    *.143                *.*                         LISTEN
tcp4              0             0    *.110                *.*                         LISTEN
tcp4              0             0    *:3306              *:*                         LISTEN
 

Teste do IMAP e POP3:

# telnet localhost 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 logout

* BYE Courier-IMAP server shutting down
0 OK LOGOUT completed
Connection closed by foreign host.

# telnet localhost 110
Trying 0.0.0.0...
Connected to 0 (0.0.0.0).
Escape character is '^]'.
+OK Hello there.

quit
+OK Better luck next time.
Connection closed by foreign host.
 

Se aparecer isso, então esta ok.

Vamos agora instalar/configurar o Maildrop.

INSTALANDO O MAILDROP ! ! !

O Maildrop será responsável pela entrega propriamente dita da mensagem à sua respectiva caixa postal. Ele também fará o controle da QUOTA de disco.

Com o Maildrop você também poderá implementar algumas regras de filtragem.

Baixe e instale o pacote:

# ln -s /usr/local/include/mysql /usr/include/mysql
# tar -jxvf maildrop-1.6.3.tar.bz2 -C /home/~/
# cd /home/~/maildrop-1.6.3/
# ./configure --prefix=/usr --sysconfdir=/etc/maildrop --enable-maildrop-uid=108 -enable-maildrop-gid=108 \
      --enable-syslog=1 --enable-maildropmysql --enable-maildirquota
# make
# make install
# mkdir /etc/maildrop
# cp maildropmysql.config /etc/
# cp maildir/quotawarnmsg /etc/maildrop/
 

Configurando o MAILDROP:

Configure o Maildrop para acessar o MySQL. Edite o arquivo /etc/maildropmysql.conf:

# vi /etc/maildropmysql.config
 
hostname        localhost
port                3306
socket            /tmp/mysql.sock
database        postfix
dbuser           maildrop
dbpw             xxxxx
dbtable          mailbox

default_gidnumber       108
default_uidnumber       108

uid_field               username
uidnumber_field         uid
gidnumber_field         gid
maildir_field           maildir
homedirectory_field     home
quota_field             quota
mailstatus_field        active
where_clause            ""
 

DICA: O Maildrop possui um recurso de aviso de email para o usuário caso a sua caixa postal ultrapasse a porcentagem de utilização de um valor especificado. Nesse tutorial usarei o valor de 90% (explicado mais adiante).

Sendo assim, você pode personalizar a mensagem de aviso que o usuário ira receber, bastando para isso editar o arquivo /etc/maildrop/quotawarnmsg.

 

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 QUOTA 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 QUOTA será administrada pelo MAILDROP, sendo assim, não será necessário a instalação de nenhum PATCH.

 
Baixe o Postfix de:

ftp://ftp.pucpr.br/postfix/official/postfix-2.2.11.tar.gz


Instalando o Postfix:

 

# tar -zxvf postfix-2.3.4.tar.gz -C ~/
# cd ~/postfix-2.3.4/
# make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_CYRUS_AUTH -I/usr/local/include/sasl' 'AUXLIBS=/usr/local/lib/mysql/libmysqlclient.so -lm -L/usr/local/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
 
 
# mysql_virtual_mailbox_maps.cf
# ------------------------------

user = postfix
password = xxxxx
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
hosts = localhost
 
 
# mysql_transport_maps.cf
# --------------------------

user = postfix
password = xxxxx
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
 

OBS: Não esqueça de configurar as linhas "user, password" conforme a sua configuração.

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:

MASTER.CF:

# vi /etc/postfix/master.cf
 
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient}
 
  • 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 que pode chegar até ser avisado pelo sistema. A mensagem de aviso é enviado pelo MAILDROP com o conteúdo do arquivo /etc/maildrop/quotawarnmsg.

Renomeie o arquivo original "main.cf" para evitar problemas:

# mv /etc/postfix/main.cf /etc/postfix/main.cf.bkp

MAIN.CF:

Crie o /etc/postfix/main.cf com o seguinte conteúdo:

# vi /etc/postfix/main.cf
 
#======== CONFIGURAÇÕES ===============
queue_directory = /var/spool/postfix/
program_directory = /usr/sbin
command_directory = /usr/sbin
daemon_directory = /usr/libexec/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 "Version not Available"
disable_vrfy_command = yes
home_mailbox = Maildir/

# ========== NOME DO DOMÍNIO ===========
myhostname = srvmail.postfix
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 = /mailbox
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 = 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.
     
  • 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.
Agora é hora de testar se o Postfix esta se comunicando com o MySQL.
 
# newaliases
#
postfix start

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:
 
# mysql -D postfix -pxxxxx

Criando o Dominio VIRTUAL e LOCAL:


mysql> INSERT INTO domain (
         domain,
         description,
         transport,
         active)
      VALUES (
         'local.com.br',
         'Dominio LOCAL da Máquina',
         'local',
         '1');

mysql> INSERT INTO domain (
         domain,
         description,
         transport,
         active)
      VALUES (
         'dominio1.com.br',
         'Dominio de Teste',
         'maildrop',
         '1');

mysql> SELECT domain, description, transport, active FROM domain;
+-----------------+--------------------------+-----------+--------+
| domain          | description              | transport | active |
+-----------------+--------------------------+-----------+--------+
| local.com.br    | Dominio LOCAL da Máquina | local     |      1 |
| dominio1.com.br | Dominio de Teste         | maildrop  |      1 |
+-----------------+--------------------------+-----------+--------+

Criando o Usuário:
ATENÇÃO: Não esqueça de escolher uma senha em 'xxxxx'

mysql> INSERT INTO mailbox (
         username,
         password,
         name,
         home,
         maildir,
         quota,
         domain,
         active)
      VALUES (
         'jeffi@dominio1.com.br',
         encrypt('xxxxx'),  
         'Jefferson',
         '/mailbox/',
         'dominio1.com.br/jeffi/Maildir/',
         '10000000S',
         'dominio1.com.br',
         '1');

mysql> SELECT username FROM mailbox;
+-----------------------------+
| username                    |
+-----------------------------+
| jeffi@dominio1.com.br       |
+-----------------------------+

Criando Alias:
 
mysql> INSERT INTO alias (
         address,
         goto,
         domain,
         active)
      VALUES (
         'jeffi@dominio1.com.br',
         'jeffi@dominio1.com.br',  
         'dominio1.com.br',
         '1');

mysql> SELECT address,goto,domain,active FROM alias;
+-----------------------+-----------------------+-----------------+--------+
| address               | goto                  | domain          | active |
+-----------------------+-----------------------+-----------------+--------+
| jeffi@dominio1.com.br | jeffi@dominio1.com.br | dominio1.com.br |      1 |
+-----------------------+-----------------------+-----------------+--------+

Criando o HOME do usuário:
 
# mkdir -p /mailbox/dominio1.com.br/jeffi
# maildirmake /mailbox/dominio1.com.br/jeffi/Maildir
# chown -R maildrop:www /mailbox/
# chmod -R 770 /mailbox/
 

Testando o Maildrop:

Teste se o MAILDROP consegue enviar o email para a caixa postal dos usuários.

# cat /etc/motd | maildrop -d jeffi@dominio1.com.br
# ls /mailbox/dominio1.com.br/jeffi/Maildir/new/
1165799733.M355026P663V0600FF01I00056406_0.srvmail.postfix,S=1114
 

Beleza, funcionou.

Testando o Postfix:

Como usuário local:

# echo "Funcionou..." | mail -s "TESTE do POSTFIX" jeffi@local.com.br

******************** LOG DO POSTFIX *******************


Dec 10 15:12:46 srvmail.postfix postfix/pickup[23430]: BF3CC2E0A4: uid=0 from=<root>
Dec 10 15:12:46 srvmail.postfix postfix/cleanup[24196]: BF3CC2E0A4: message-id=<0_242 24_1088446366_1@srvmail.postfix>
Dec 10 15:12:46 srvmail.postfix postfix/qmgr[21233]: BF3CC2E0A4: from=<root@local.com.br>, size=389, nrcpt=1 (queue active)
Dec 10 15:12:46 srvmail.postfix postfix/local[24228]: BF3CC2E0A4: to=<jeffi@local.com.br>, relay=local, delay=0, status=sent (delivered to maildir)
Dec 10 15:12:46 srvmail.postfix postfix/qmgr[21233]: BF3CC2E0A4: removed
 

 
# ls /home/jeffi/Maildir/new/
1165800996.V5aI1cc02M869709.srvmail.postfix

Beleza, funcionou.

Como usuário virtual:

# echo "Funcionou..." | mailto -s "TESTE do POSTFIX" jeffi@dominio1.com.br

******************** LOG DO POSTFIX *******************

Dec 10 15:27:02 srvmail.postfix postfix/pickup[24309]: 245252E08F: uid=0 from=<root>
Dec 10 15:27:02 srvmail.postfix postfix/cleanup[24310]: 245252E08F: message-id=<0_243 25_1088447222_1@srvmail.postfix >
Dec 10 15:27:02 srvmail.postfix postfix/qmgr[21233]: 245252E08F: from=<root@local.com.br>, size=388, nrcpt=1 (queue active)
Dec 10 15:27:02 srvmail.postfix postfix/pipe[24299]: 245252E08F: to=<jeffi@dominio1.com.br>, relay=maildrop, delay=0, status=sent (srvmail.postfix.com.br)
Dec 10 15:27:02 srvmail.postfix postfix/qmgr[21233]: 245252E08F: removed
 
 
# ls /mailbox/dominio1/jeffi/Maildir/new
1165799733.M355026P663V0600FF01I00056406_0.srvmail.postfix,S=1114

Opa, acho que foi:

# cat /mailbox/dominio1/jeffi/Maildir/new/1088448788..postfix\,S\=443

Return-Path: <root@local.com.br>
Delivered-To: jeffi@dominio1.com.br
Received: by postfix.com.br (Postfix, from userid 0)
id 93AAC2E0A3; Mon, 28 Jun 2004 15:53:08 -0300 (BRT)
MIME-Version: 1.0
To: jeffi@dominio1.com.br
Subject: Teste do Postfix
Message-ID: <0_24702_1088448788_1@postfix>
Content-ID: <0_24702_1088448788_2@postfix>
Content-type: text/plain
Date: Mon, 28 Jun 2004 15:53:08 -0300 (BRT)
From: root@local.com.br
 

É, 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 jeffi@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 jeffi@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.

QUOTA DE DISCO !!!

Quem vai ser responsável pelo controle de QUOTA de disco nesse ambiente é o Maildrop.

Os valores de QUOTAs serão cadastrados no banco de dados, sendo independente para cada usuário. O Maildrop irá ler as tabelas do MySQL e conforme o valor especificado, ele irá fazer o controle de tal QUOTA.

Quando você enviou um email para jeffi@dominio1.com.br, o Maildrop criou o arquivo "maildirsize" dentro do ~/MAILDIR/ do usuário. Exemplo:

# ls /mailbox/dominio1.com.br/jeffi/Maildir
courierimapuiddb  cur/  maildirsize  new/  tmp/

# cat /mailbox/dominio1.com.br/jeffi/Maildir/maildirsize
10485760S
796 1

 

Toda vez que o usuário recebe um email, o Maildrop calcula o espaço utilizado e escreve nesse arquivo. Vamos testar se a QUOTA esta funcionado:

Primeiro vamos alterar o valor da QUOTA do usuário para um valor menor, 1MB é o suficiente.

Execute no shell:

# mysql -D postfix -pxxxx -e "SELECT username,quota FROM mailbox WHERE username='jeffi@dominio1.com.br';"
+------------------------------+-----------+
| username                     | quota     |
+------------------------------+-----------+
| jeffi@dominio1.com.br        | 10485760S |
+------------------------------+-----------+

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

# mysql -D postfix -pxxxxx -e "UPDATE mailbox SET quota='1000000S' WHERE username='jeffi@dominio1.com.br';"

# mysql -D postfix -pxxxxx -e "SELECT username, quota FROM mailbox WHERE username='jeffi@dominio1.com.br';"
+------------------------------+----------+
| username                     | quota    |
+------------------------------+----------+
| jeffi@dominio1.com.br        | 1000000S |
+------------------------------+----------+

Vamos agora enviar email até a sua caixa chegue no limite especificado. Para isso vou usar um programa que envia email com anexo chamado "MAILM". Baixe-o em:
# tar -zxvf mailm-0-3.tar.gz -C /home/~/
# cd /home/~/
# ./configure --prefix=/usr
# make
# make install
 

Agora é necessário que você localize qualquer arquivo em seu sistema que possua um tamanho maior que 1MB, para que possamos realizar o teste com o sistema de quota. Veja no exemplo abaixo:

# ls -lh /tmp/arquivo.tar
-rw-r--r--  1 root  root   1.2M Nov  7 15:06 /tmp/arquivo.tar

# mailm -t jeffi@dominio1.com.br -ad /tmp/arquivo.tar
 

******************** LOG DO POSTFIX *******************

Nov 7 15:08:13 teste postfix/pipe[20706]:0CA0A14ECF: to=<jeffi@dominio1.com.br>, relay=maildrop, delay=0, status=bounced (permission denied. Command output: maildrop: maildir over quota. )
 

Lembrando, que 1000000 não corresponde a 1MB precisamente :-)

INSTALANDO O POSTFIXADMIN !!!


O PostfixAdmin é um ambiente de administração do Postfix + MySQL, feito totalmente em PHP. Com ele, você pode:
  • Criar domínio virtuais;
  • Criar/Excluir contas virtuais;
  • Criar/Excluir Aliases;
  • Alteração de Senhas, etc.

Você também pode adaptá-lo às suas necessidades, bastando apenas um conhecimento da linguagem PHP.

Para esse ambiente, foi necessário fazer algumas alterações no código original para adequá-lo ao Maildrop. Essas foram algumas das minhas alterações:

  • Tradução do Ambiente para Português BR
     
  • Desabilitei a criação automática de um ALIAS para cada endereço de email criado, achei desnecessário para esse ambiente.
     
  • Desabilitei a opção de DELETAR os dados do "mailbox" do usuário, em caso de se apagar um ALIAS para essa caixa.
     
  • Adaptação de 2 script para CRIAÇÃO e EXCLUSÃO de usuário. Isso foi necessário, pois o MAILDROP nesse ambiente, não cria o MAILDIR/ do usuário caso ele não exista. Para a EXCLUSÃO, o Postfixadmin não apaga o diretório dos usuários. Com esses 2 scripts, você também pode realizar outras configurações, no meu caso por exemplo, a configuração de um Webmail.
     
  • Uso do SUDO para dar permissões de execução para esses dois scripts.
     
  • Inclusão do campo ATIVO na página de administração com a possibilidade de ativar/desativar um conta de usuário.
     
  • Mudança na forma de apresentação do valor da QUOTA de disco.
     
  • Mudança na forma de apresentação da DATA de alteração da conta, para um formato BR.

ATENÇÃO: Caso você não esteja utilizando o Slackware, certamente a sua distribuição deve possuir o Apache e o PHP nos CD's de instalação. Não entrarei em detalhes sobre configuração do APACHE, pois o foco aqui é outro. Usarei a configuração DEFAULT do servidor.

Instalação:

Se você for utilizar a versão do 'Marco Máximo' com essas alterações, baixe-o nesse link:

Após o download, descompacte no diretório ROOT do servidor WEB ou em algum outro, lembrando apenas de criar um ALIAS na configuração do servidor.

No meu caso, foi criado o dir '/www/dominio1'. Utilizo também o usuário e grupo "nobody" para rodar o Apache.

# tar -jxvf postfixadmin-ALTERADO.tar.bz2 -C /www

Copie os scripts para um outro diretório e mude as permissões:

# mv /www/postfixadmin/*.sh /www/
# chmod 700 /www/*.sh
# chown www:www /www/postfixadmin/ -R
# chmod 755 /www/postfixadmin -R
 

Configuração do SUDO:

Como comentei antes por causa do MAILDROP, nesse ambiente precisei criar 2 scripts: adduser.sh e userdel.sh. Esses scripts devem possuir permissão de ROOT para execução. A forma que achei para resolver esse problema foi o uso do SUDO.

* Se alguém tiver alguma sugestão melhor, por favor entre em contato.

Edite o arquivo /etc/sudoers e adicione as seguintes linhas:

# POSTFIXADMIN
www ALL=NOPASSWD:/www/adduser.sh
www ALL=NOPASSWD:/www/userdel.sh

Edite o arquivo config.inc.php e configure as variáveis conforme a sua configuração. As principais são:

// Login information for the database
$db_host = "localhost";
$db_name = "postfix";
$db_user = "postfixadmin";
$db_pass = "xxxxx";

Depois de configurado as variáveis, habilite o acesso a página de administração de domínio do PostfixAdmin, no meu caso usarei o usuário "admin".

# cd /www/
# htpasswd htaccess admin
New password:
Re-type new password:
Updating password for user admin
 

CONFIGURAÇÃO BÁSICA DO VIRTUAL HOST NO APACHE


Devido aos muitos pedidos, aqui vai uma configuração bem simples do apache para se ter um Webmail + Postfixadmin funcional.

Estou levando em consideração que vocês foram fieis ao tutorial e já tem o Apache+PHP instalados em seus servidores.

Então vamos lá, primeiro vamos configurar o suporte para o PHP no Apache editando o seu arquivo de configuração.
 
# vi /usr/local/etc/apache/httpd.conf

Insira as seguintes linhas no arquivo httpd.conf

LoadModule php4_module libexec/libphp4.so
AddType application/x-httpd-php .php
AddModule mod_php4.c

Ainda dentro do httpd.conf, procure as linhas 'AllowOverride None' e 'AccessFileName .htaccess', troque por:

AllowOverride AuthConfig
AccessFileName htaccess
 

Obs: Para manter uma boa organização dentro do httpd.conf, sugiro que você adicione essas linhas citadas acima juntos com os demais módulos "default" do apache. para isso basta procurar pelas linhas 'LoadModule' dentro do arquivo. Bom, até aqui tudo bem, damos ao apache o suporte ao PHP.

Vamos criar então um VirtualHost, para isto, insira as seguintes linhas de acordo com as suas configurações dentro do httpd.conf, de preferência nas últimas linhas do arquivo onde se encontram as entradas de exemplo do VirtualHost.

Obs: No meu caso eu criei um "alias" no meu servidor DNS para postfixadmin.dominio1.com.br para acessar o postfixadmin e outro para webmail.dominio1.com.br para acessar o meu webmail. Caso você já tenha um servidor DNS, poderá criar alias para facilitar o acesso via web.

EXEMPLO COM DNS:

<VirtualHost *:80>
     ServerAdmin jeffi@dominio1.com.br
     DocumentRoot /www/postfixadmin
     DirectoryIndex index.php
     ServerName postfixadmin.dominio1.com.br
     ErrorLog /var/log/www/postfixadmin/error_log
     CustomLog /var/log/www/postfixadmin/access_log common
<Directory /www/postfixadmin>
     AuthName "ACESSO RESTRITO APENAS PARA ADMINISTRADORES"
     AuthUserFile /www/htaccess
     AuthType Basic
     require valid-user
  </Directory>
</VirtualHost>

<VirtualHost *:80>
     ServerAdmin jeffi@dominio1.com.br
     DocumentRoot /www/dominio1/webmail
     DirectoryIndex index.php
     ServerName webmail.dominio1.com.br
     ErrorLog /var/log/www/dominio1/webmail/error_log
     CustomLog /var/log/www/dominio1/webmail/access_log common
</VirtualHost>

Crie os diretórios de LOGs antes de reiniciar o servidor Apache:

# mkdir -p /var/log/www/postfixadmin
# mkdir -p /var/log/www/dominio1/webmail
# chown nobody:nobody /var/log/www/dominio1/webmail
# chown nobody:nobody /var/log/www/postfixadmin

Reinicie o servidor apache:

# apachectl restart

Agora pelo BROWSER, acesse o endereço:

http://postfixadmin.dominio1.com.br/admin

Ele irá lhe pedir o usuário e o password que você cadastrou no arquivo .htpasswd.

No PostfixAdmin, você precisa cadastrar os administradores correspondentes para cada domínio que você possui na máquina.

Depois de cadastrado o administrador daquele domínio, acesse pelo endereço http://postfixadmin.dominio1.com.br, colocando o usuário e senha cadastrados.

Não irei entrar em detalhes sobre o funcionamento do PostfixAdmin, pois a sua interface é muito intuitiva.

DICA: Caso ocorra algum problema na criação do usuário, verifique a configuração e permissão dos scripts de criação (USERDEL e ADDUSER).

Verifique também no /var/log/messages se o comando sudo foi executado.

Segue abaixo um outro exemplo para configuração do Apache caso você não possua um servidor DNS, e esteja montando este ambiente apenas para estudos.

EXEMPLO SEM DNS:

<VirtualHost *:80>
     ServerAdmin jeffi@dominio1.com.br
     DocumentRoot /www
     DirectoryIndex index.php
     ServerName ip_do_servidor
     ErrorLog /var/log/www/mailserver/error_log
     CustomLog /var/log/www/mailserver/access_log common
<Directory /www/postfixadmin>
     AuthName "ACESSO RESTRITO APENAS PARA ADMINISTRADORES"
     AuthUserFile /www/htaccess
     AuthType Basic
     require valid-user
  </Directory>
</VirtualHost>

Crie o diretório de LOG:

# mkdir -p /var/log/www/mailserver
# chown www:www /var/log/www/dominio1

Restarte o Apache:

# apachectl restart

Com isto você poderá acessar tanto o postfixadmin como o webmail digitando apenas:

http://ip_do_servidor/postixadmin e http://ip_do_servidor/webmail

Obs: No EXEMPLO SEM DNS, os diretórios do "webamail" e "postfixadmin" devem estar em /www conforme a configuração do httpd.conf acima, caso você opte por deixa-los em outro diretório, você deverá mudar as configurações do httpd.conf de acordo com as suas necessidades.

 

INTEGRANDO O POSTFIX COM O CLAMAV !!!


Nesta versão do clamav, é necessário que você tenha a zlib 1.2.2 instalada, então antes de iniciarmos a instalação do clamav, atualize sua zlib, baixe a nova versão em:

http://www.gzip.org/zlib/zlib-1.2.2.tar.gz

Descompacte o arquivo e instale:

# tar -zxvf zlib-1.2.2.tar.gz -C /opt/
# cd zlib-1.2.2
# ./configure --prefix=/usr
# make
# make install
# ldconfig

Bom, seu sistema está pronto para receber o clamav, e para isto vamos seguir o tutorial de um grande amigo, o "gsoares" que permitiu a inclusão de seu artigo neste tutorial sobre integração do clamav direta no postfix.

Outro maravilhoso HOWTO feito por nosso amigo Gleydson (gsoares) com a ajuda de outro grande amigo da comunidade David (thefallen) da rede "FREENODE" de irc.
 

Howto Original:

http://www.nerdgroup.org/doc/postfix_clamav.html

 

Aumento de Desempenho

Muitos admins sofreram ou ainda sofrem com o aumento de virus na Internet, causando lentidao na entrega e recebimento em seus MTAs. Tudo isso por falta de um filtro que trabalhasse diretamente com o postfix sem precisar passar pelo amavis ou mailscanner (os famosos consumidores de memoria e cpu ;)).

Quem não já teve a experiência de integrar o postfix com expressões body_checks para rejeitar o email antes mesmo que ele passe pelo amavis ou mailscanner e se surpreendeu com o alto desempenho. Porem a solução ideal é integrar um antivirus diretamente com o MTA. Nesse tutorial usaremos o postfix junto com o clamav (antivirus livre).

Para isso baixe o clamav e o script do filtro:

ClamAv - http://heanet.dl.sourceforge.net/sourceforge/clamav/clamav-0.84.tar.gz
Clamav Filter - http://www.unitednerds.org/projects/mail/clamav-filter.sh.gz

Primeiramente, descompacte o tar.gz do ClamAV e crie os usuarios padrao.

# tar -xvzf clamav-0.84.tar.gz
# groupadd clamav
# useradd -g clamav -s /bin/false -c "ANTI-VIRUS Clamav" clamav

Para compilarmos, vamos usar algumas opções no ./configure:

# ./configure --prefix=/usr --sysconfdir=/etc
# make
# make install

Pronto, seu ClamAV está instalado, agora so falta configurar o seu /etc/clamd.conf.

Apenas algumas linhas precisam ser alteradas. Entre elas, precisamos comentar a linha "Example" e descomentar as linhas "ScanMail" e "User clamav". Voce pode querer tambem alterar algumas variaveis do ClamAV, como lugar em que é gerado o unix socket. Segue abaixo um exemplo de clamav.conf:

# /etc/clamd.conf
LogTime
# Voce pode ter o log no syslog ou em um arquivo de log, ou ambos.
LogSyslog
LogFile /var/log/clam/clamd.log
PidFile /var/run/clam/clamd.pid
LocalSocket /var/run/clam/clamd.sock
FixStaleSocket
MaxThreads 50
ThreadTimeout 600
MaxDirectoryRecursion 15
FollowFileSymlinks
SelfCheck 600
User clamav
ScanMail
ScanArchive
ArchiveMaxFileSize 10M
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
 

Crie agora o diretório

# mkdir /var/run/clam
# mkdir /var/log/clam
# chown -R clamav:clamav /var/run/clam
# chown -R clamav:clamav /var/log/clam

Nao se esqueça de colocar o /usr/sbin/clamd para ser iniciado no boot. Note que é uma boa ideia inicia-lo ANTES do Postfix (assim, quando o Postfix requisitar o antivirus, ele ja esta la.)

Ex.:

# vi /etc/rc.d/rc.local
 
#!/bin/sh
#
# /etc/rc.d/rc.local: Local system initialization script.
#
# Put any local setup commands in here:
/etc/rc.d/imapd start
/etc/rc.d/pop3d start
/usr/sbin/clamd
/usr/bin/freshclam
postfix start
 
 

Bem, aqui devemos dar nosso agradecimento ao thefallen em ter aberto nossos olhos em relação a essa implementação e pelo desenvolvimento desse filtro.

Baixe o filtro neste endereço e salve-o em /usr/libexec/postfix e siga os passos:

# gunzip clamav-filter.sh.gz
# chmod 0755 clamav-filter.sh
# mkdir /var/spool/filter
# chown clamav:clamav /var/spool/filter
# clamd &
 

Dentro do arquivo master.cf insira as seguintes linhas:

smtp  inet    n       -       n       -       -       smtpd
         -o content_filter=clamav:clamav
 
clamav unix    -       n       n       -       -       pipe
        flags=Rq user=clamav argv=/usr/libexec/postfix/clamav-filter.sh -f ${sender}  --  ${recipient}
  • Obs: Se voce antes usava amavis, nao se esqueca de comentar ou retirar as linhas referentes a ele no master.cf "content_filter = smtp-amavis:[127.0.0.1]:10024" dentro do /etc/postfix/main.cf.

 

Acertando alguns detalhes no Postfix
 

Podemos acertar alguns detalhes no Postfix para evitar um "timeout" sob carga pesada. No master.cf, você pode limitar a quantidade de processos do filtro rodando ao mesmo tempo (para evitar que o workload da maquina suba muito). No exemplo abaixo, limitamos a 15 instâncias do filtro; aumente esse limite com calma e veja até onde seu servidor aguenta sem "abrir o bico" :)
  • Precisamos tambem ajustar a variavel "command_time_limit" no main.cf.
     
  • Essa variável diz quanto tempo um comando externo ao Postfix pode rodar antes de ser "morto" pelo processo "master". O default é de 1000s, esse valor deve ser suficiente para a maioria dos ambientes. No entanto, em horários de pico de utilização da máquina, ou sob ataque, esse limite pode causar erros de "Timeout Exceeded" no Postfix.
     
  • Pode aumenta-lo para um valor maior (talvez 1h) para evitar isso. Basta colocar no main.cf uma linha assim:
#/etc/postfix/main.cf

command_time_limit = 1h

Restarte o postfix:

# postfix reload


Mantendo o "banco de dados" do ClamAV sempre atualizado
 

  • Nesta nova versão do clamav, como vocês perceberam, o arquivo de configuração do clamav mudou de "clamav.conf" para "clamd.conf", o que diferencia os dois arquivos, é realmente o nome, as configurações são as mesmas.
     
  • O freshclam vem com um arquivo de configuração. Então você terá de editar o arquivo, e alterar apenas 2 linhas, siga o exemplo abaixo:
# vi /etc/freshclam

Comente esta linha:

##
## Example config file for freshclam
## Please read the freshclam.conf(5) manual before editing this file.
## This file may be optionally merged with clamd.conf.
##
# Comment or remove the line below.
#Example
 

Ainda no arquivo de configuração do freshclam, procure a linha:

# Uncomment the following line and replace XY with your country
# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list.
# Default: There is no default, which results in an error when running freshclam

# DatabaseMirror db.XY.clamav.net
DatabaseMirror db.br.clamav.net

 
  • Pronto, já está configurado, fácil não ? Você pode alterar mais campos no freshclam.conf de acordo com suas necessidades.
     
  • Pode-se inicia-lo como um "daemon" no sistema, e deixar que ele verifique se há atualizacões no "banco de dados" do ClamAV com o comando:
# /usr/bin/freshclam --log-verbose --daemon-notify --daemon --checks=50
--log=/var/log/clam/freshclam.log

Veja a saída do log:

# cat /var/log/clam/freshclam.log
freshclam daemon 0.84 (OS: linux-gnu, ARCH: i386, CPU: i686)
ClamAV update process started at Mon May 9 13:36:56 2005
main.cvd is up to date (version: 31, sigs: 33079, f-level: 4, builder: tkojm)
daily.cvd is up to date (version: 873, sigs: 1184, f-level: 4, builder: diego)
--------------------------------------
  • Depois que se sentir "seguro" com o funcionamento do ClamAV (depois que ja tiver mostrado pro seu chefe que o ClamAV se atualiza sozinho mesmo :D), voce pode remover as opcoes de "verbose" do clamav.conf e do freshclam. Isso economiza espaco em disco, descartando logs desnecessarios.
    Ah, nao se esqueca de colocar o freshclam para rodar no boot tambem :)

Um pouquinho de Teoria (para os nao tão apressados :D)

O comando "clamdscan" conecta ao daemon (via unix-domain ou tcp sockets) "clamd" e solicita que o daemon verifique o arquivo. Manter o clamd rodando e apenas solicitar verificacões pelo cliente agiliza bastante o processo de verificacão. Dessa maneira, você evita o desperdício de recursos que seria carregar todo o banco de dados de vírus apenas para scanear um arquivo.

É por esse motivo que precisamos rodar o script com o mesmo usuario que o "clamd" estará rodando, para que ele possa acessar as mensagens na fila de filtragem.

Faça um teste rodando o clamdscan e rodando o clamscan (esse não usa o clamd; ele carrega todas as definicões de virus e depois scaneia). No último benchmarking que eu fiz, o clamscan levava em media 80 segundos para fazer o que o clamdscan fazia em 5-7 segundos.

Para integrarmos o ClamAV Filter ao Postfix, usamos as opções de content_filter do Postfix ligadas ao processo "pipe" do mesmo, que permite que enviemos mensagens "para fora" do Postfix.

Há mais explicacões sobre isso na Palestra do evento LinuxChix-BR de 2004, disponivel neste mesmo site (http://www.unitednerds.org/thefallen/docs/?area=Postfix).

 

INTEGRANDO COM O SPAMASSASSIN !!!

Precisamos então instalar o SpamAssassin, execute o comando:

# perl -MCPAN -e shell
 
cpan> install Mail::SpamAssassin
cpan> quit
# spamd&

É provável que precise instalar algumas dependências do SpamAssassin, mas não se preocupe, o MCPAN cuidará disso pra você, apenas pressione ENTER quando for solicitado a instalação das dependências.

É bastante simples integrarmos o SpamAssassin ao nosso script do Clamav Filter. Supondo que você ja tenha instalado o SpamAssassin, e o "spamd" rodando, basta editar o clamav-filter.sh e mudar a linha:

De:

SENDMAIL="/usr/sbin/sendmail -i "

Para:

SENDMAIL="/usr/bin/spamc -f -e /usr/sbin/sendmail -i "

Agradecimentos a David da Guia Carvalho pela dica :)

 

INSTALANDO O MAIL VACATION !!!


VACATION é um recurso que possibilita configurar o servidor para enviar um email de resposta para o remetente de um uma determinada conta, ou seja, quem envia um email para uma conta configurada com esse recurso, recebe automaticamente um email de resposta contendo um agradecimento ou algum aviso sobre a localidade do mesmo. Esse recurso é mais utilizado em caso de férias ou viagem de um funcionário.

Para isso, vamos iniciar a instalação de algumas dependencias do vacation, digitando o comando abaixo:
 
# perl -MCPAN -e shell
 
cpan> install DBI:DBD
cpan> install DBD::mysql

DICA: Normalmente, pode ocorrer alguns erro no teste durante a instalação do módulo DBD::mysql. Caso ocorra esse problema, force a instalação manualmente, exemplo:

# cd ~/.cpan/build/DBD-mysql-3.0008/
# make install

Instalação:

Faça o download do programa em:
# tar -zxvf vacation-2.1.3.tgz -C /opt/

O Vacation utiliza o MySQL para guardar as mensagens de resposta dos usuários, sendo assim, vamos criar as tabelas. Crie um arquivo com o seguinte conteúdo:

#============== vacation_mysql.cf =======
USE postfix;
CREATE TABLE vacation (
    email varchar(255) NOT NULL default '',
    subject varchar(255) NOT NULL default '',
    body text NOT NULL,
    cache text NOT NULL
) TYPE=MyISAM COMMENT='Virtual Vacation - Vacation Daemon Table';
 

E execute:

# mysql -pxxxxx < vacation_mysql.cf

Crie um usuário no sistema para receber os emails que forem enviados para as pessoas que estejam cadastradas no banco de dados do VACATION. Depois copie os arquivos de configuração para o $HOME do usuário criado (vacation).

# pw groupadd vacation
# pw useradd vacation -g vacation -s /bin/sh -d /home/vacation
# mkdir /home/vacation
# cd ~/vacation-2.1.3
# cp dot.forward /home/vacation/.forward
# cp dot.procmailrc /home/vacation/.procmailrc
# cp vacation.pl /home/vacation/
# chown -R vacation:vacation /home/vacation

Configuração:

Edite o arquivo /home/vacation/.forward e indique o caminho correto do procmail. No Slackware é /usr/bin/procmail.

# cat /home/vacation/.forward
"| /usr/bin/procmail"

Edite o arquivo /home/vacation/vacation.pl e configure os valores para acesso ao banco de dados. No meu caso, usei os mesmos dados do usuário do postfixadmin.

$db_name = "postfix";
$db_user = "postfixadmin";
$db_pass = "xxxxx";
$sendmail = "/usr/libexec/sendmail";

DICA: Você também pode editar o arquivo /home/vacation/.procmailrc ou /home/vacation/vacation.pl e habilitar as linhas de logs em caso de erro.

Teste se o usuário do postfixadmin tem acessa o banco:

# mysql -D postfix -u postfixadmin -pxxxxxx -e "desc vacation;"
 
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| email   | varchar(255) |      |     |         |       |
| subject | varchar(255) |      |     |         |       |
| body    | text         |      |     |         |       |
| cache   | text         |      |     |         |       |
+---------+--------------+------+-----+---------+-------+

Edite o arquivo "config.inc.php" do POSTFIXADMIN e habilite o suporte ao vacation:

// When you want to offer the "vacation" daemon to your users,
// set this to "YES".
// You need to install the vacation module first!

$use_vacation = "YES";
$vacation_text = "Resposta automática, caso você esteja fora do escritório.";
$vacation_file = "vacation.php";
$vacation_email = "vacation@local.com.br";

TESTE:

Depois de liberar o suporte a Vacation do PostfixAdmin, acesse a página de login no PostfixAdmin e clique no link referente ao Vacation, nesse caso "Resposta automática, caso você esteja fora do escritório.

Na página que se segue, coloque o email e senha do usuário e edite a mensagem de resposta automática e clique em "Saindo".

Para testar, envie um email para o usuário, você deve receber uma mensagem de aviso do servidor como sendo do usuário.

Para retirar a mensagem automática, coloque o usuário e senha e clique em "Voltando".

Teste, enviando como usuário normal um email para o usuário virtual cadastrado.

$ echo "TESTE" | mailto -s "VACATION" jeffi@dominio1.com.br

DICA: Caso ocorra algum erro de não validação da senha do usuário, tente alterá-la usando o Postfixadmin. Uma causa do erro, pode ser a forma com que o Postfixadmin lê e grava a senha no MySQL.

 

WEBMAIL - SQUIRRELMAIL !!!


Desde o meu primeiro tutorial, muitas pessoas me pediam sugestões de um webmail que se integrasse a esse ambiente, esse também foi um dos meus problemas quando comecei a trabalhar com essa solução.

Dos webmails que testei, o que mais me surpreendeu foi o Squirrelmail. O Squirrelmail é um completo webmail que se integra completamente nesse ambiente com domínios virtuais. Ele é escrito em PHP, o que possibilita a sua total personalização.

Um outro recurso muito interessante, é a possibilidade de se aumentar as funcionalidades do Squirrelmail com a instalação de plugins.

Vou demonstrar uma instalação simples com suporte a MySQL e a instalação de um plugin para mudança de senha.

Dependências:

Apache e PHP.

Instalando:

No site existem versões em RPM, mas aconselho a utilizar as versão SOURCE devido a sua facilidade de personalização.

Faça o download em:

# tar -jxvf squirrelmail-1.4.2.tar.bz2 -C /www/dominio1/
# cd /www/dominio1/
# mv squirrelmail-1.4.2/ webmail
# chown nobody:nobody webmail/ -R
# cd webmail/
Configurando:

A configuração do Squirrelmail pode ser feita de duas formas:
  1. Por um script de configuração "configure".
  2. Editando diretamente o arquivo "webmail/config/config.php"

Irei mostrar a configuração do arquivo "config.php", pois a utilização do script de configuração é bastante fácil.

Como estamos utilizando o MySQL, nada mais cômodo como guardar as configuração dos usuários e seus livros de endereços em tabelas SQL. O Squirrelmail permite essa facilidade, sendo assim, vamos criar as tabelas e as permissões de acesso a elas.

Crie um arquivo para a criação das tabelas com o seguinte conteúdo:

#================ squirrelmail.db ============

#
# Cria o banco do Webmail
#


CREATE DATABASE webmail;
use webmail;

#
# Tabela de preferência dos usuários 'userprefs'
#


CREATE TABLE userprefs (
   user varchar(128) NOT NULL default '',
   prefkey varchar(64) NOT NULL default '',
   prefval blob NOT NULL,
   PRIMARY KEY  (user,prefkey)
) TYPE=MyISAM;

#
# Tabela do livro de endereço dos usuários 'address'
#


CREATE TABLE address (
   owner varchar(128) NOT NULL default '',
   nickname varchar(16) NOT NULL default '',
   firstname varchar(128) NOT NULL default '',
   lastname varchar(128) NOT NULL default '',
   email varchar(128) NOT NULL default '',
   label varchar(255) default NULL,
   PRIMARY KEY  (owner,nickname),
   KEY firstname (firstname,lastname)
) TYPE=MyISAM;

#
# Cria o usuário "squirreluser" e da permissão de
# acesso ao banco "webmail"
#


USE mysql
INSERT INTO user (Host, User, Password)
VALUES ('localhost ou %','squirreluser', password('xxxxx'));

INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv)
VALUES ('localhost ou %', 'webmail', 'squirreluser', 'Y', 'Y', 'Y', 'Y');

FLUSH PRIVILEGES;
 

Crie o banco e as tabelas:

# mysql -pxxxxx < squirrelmail.db

Teste se foi criado:

# mysql -pxxxxx -D webmail -e "show tables;"
 
+-------------------+
| Tables_in_webmail |
+-------------------+
| address           |
| userprefs         |
+-------------------+

Agora vamos configurar o Squirrelmail.

Dentro do diretório webmail/config/ existe um arquivo chamado "config_default.php". Esse arquivo explica para que serve cada parâmetro de configuração.

Crie um arquivo chamado "config.php" com o conteúdo do arquivo "config_default.php", exemplo:

# cp config_default.php config.php

Uma outra forma de gerar esse arquivo, é usando o script de configuração:

# ./configure

Recomendo essa última forma, pois cria um arquivo config.php mais "limpo".

Essas são as principais linhas que devem ser alteradas no arquivo "webmail/config/config.php" para a configuração do seu domínio com suporte a MySQL e Courier-IMAP:

$org_name      = "Minha Empresa";
$org_title     = "TESTE";
$provider_name     = 'Minha Empresa';
$squirrelmail_default_language = 'pt_BR';
$domain                 = 'dominio1.com.br';
$imapServerAddress      = 'localhost';
$imapPort               = 143;
$useSendmail            = false;
$smtpServerAddress      = 'localhost';
$smtpPort               = 25;
$sendmail_path          = '/usr/sbin/sendmail';
$pop_before_smtp        = false;
$imap_server_type       = 'courier';
$invert_time            = false;
$optional_delimiter     = 'detect';

$default_folder_prefix          = '';
$trash_folder                   = 'INBOX.Trash';
$sent_folder                    = 'INBOX.Sent';
$draft_folder                   = 'INBOX.Drafts'';
$default_move_to_trash          = true;
$default_move_to_sent           = true;
$default_save_as_draft          = true;
$show_prefix_option             = true;
$list_special_folders_first     = true;
$use_special_folder_color       = true;
$auto_expunge                   = true;
$default_sub_of_inbox           = true;
$show_contain_subfolders_option = true;
$default_unseen_notify          = 2;
$default_unseen_type            = 1;
$auto_create_special            = true;
$delete_folder                  = true;
$noselect_fix_enable            = true;

$default_charset          = 'iso-8859-1';
$data_dir                 = SM_PATH . 'data/';
$attachment_dir           = $data_dir;
$dir_hash_level           = 0;
$default_left_size        = '150';
$force_username_lowercase = true;
$default_use_priority     = true;
$hide_sm_attributions     = true;
$default_use_mdn          = true;
$edit_identity            = true;
$edit_name                = true;
$allow_thread_sort        = true;
$allow_server_sort        = true;
$allow_charset_search     = true;
$uid_support              = true;

$default_use_javascript_addr_book = true;
$addrbook_dsn = 'mysql://squirreluser:xxxxx@localhost/webmail';
$addrbook_table = 'address';

$prefs_dsn = 'mysql://squirreluser:xxxxx@localhost/webmail';
$prefs_table = 'userprefs';
$prefs_user_field = 'user';
$prefs_key_field = 'prefkey';
$prefs_val_field = 'prefval';

 

DICA: Quase todos os plugins do Squirrelmail vem desabilitados por default. Usando o script de configuração, escolha a opção 8 e habilite-os digitando seus números correspondentes.

Agora acesse o webmail pelo link:

http://webmail.dominio1.com.br ou http://ip_do_servidor/webmail/

Para logar no webmail você precisa fornecer seu nome completo de usuário, ou seja, usuario@dominio. Exemplo:

user: jeffi@dominio1.com.br
pass: xxxxxx

Instalando plugins:

Como eu havia falado, uma forma de você aumentar as funcionalidades do Squirrelmail é instalando novos plugins. No site, atualmente estão listados 174 plugins.

Vamos instalar um plugin útil para a mudança de senha dos usuários VIRTUAIS, chamado change_mysqlpass, para isso você precisa também de outro plugin chamado de compatibility.

Baixe-os em:

Instalando:

# tar -zxvf compatibility-1.3.tar.gz -C /www/dominio1/webmail/plugins/
# tar -zxvf chg_mysqlpass-3.2-1.2.8.tar.gz -C /www/dominio1/webmail/plugins/
# cd /www/dominio1/webmail/plugins/change_mysqlpass/
# cp config.php.sample config.php
# chown root:nobody config.php
# chmod 640 config.php
 

Edite o arquivo "config.php" e configure as seguintes variáveis:

$mysql_server = 'localhost';
$mysql_database = 'postfix';
$mysql_table = 'mailbox';
$mysql_userid_field = 'username';
$mysql_password_field ='password';
$mysql_manager_id = 'postfixadmin';
$mysql_manager_pw = 'xxxxxx';

$mysql_saslcrypt = 0;
$mysql_unixcrypt = 0;
$mysql_MD5crypt = 1;

$use_ssl_for_password_change = 0;

$mysql_password_force = 1;
$mysql_password_change_field = 'passwd_expire';
$mysql_password_change_field_delimiter = '"';
$mysql_password_change_yes_value = 'Y';
$mysql_password_change_no_value = 'N';
 
 
# cd /www/dominio1/webmail/
# ./configure

Escolha a opção 8, habilite os dois plugins (compatibility, change_mysqlpass) e faça um reload no seu browser.

Todo o usuário criado, ao se logar pela primeira vez no webmail, receberá um pedido de mudança de senha. Isso é causado pelo valor "Y" no campo "passwd_expire" da tabela "mailbox".

DICA: Caso ocorra algum erro, pode ser devido a variável "$use_ssl_for_password_change = 1;". Se o seu servidor não estiver com o suporte SSL ativo, altere para 0 para resolver o problema.

Plugins recomendados:

  • msg_flags: ícones para as mensagens.
  • smallcal: pequeno calendário na barra lateral.
  • newuser_wiz: ajuda o usuário a configurar alguns dados iniciais.
  • vlogin: completa o login do usuário com o seu domínio "@dominio.com.br".

AGRADECIMENTOS !!!

  • Bom galera, depois de quase 2 semanas trabalhando em cima deste howto, acho que mereço um bom descanso não acham ? :)
     
  • Agradeço a paciência e a compreensão de todos.
     
  • Críticas, Elogios e Sugestões serão de grande valia para a melhoria do Tutorial.
     
  • Gostaria de agradecer e muito as pessoas que puderam contribuir e me ajudar de forma direta e indireta neste pequeno trabalho, e que puderam fazer deste tutorial uma realidade, onde poucas pessoas conseguiam obter sucesso através de outros tutoriais ditribuídos pela internet devido á falta de documentação para essa maravilhosa distribuição chamada Slackware:
     
  • Agradecimentos Especiais:
             
    Nome:   Nickname Rede IRC Canais
             
    Gleydson Soares - gsoares freenode.org #nerdgroup
    Michael - NoComments brasnet.org #linuxajuda

    Tutorial criado por Jeffierson - jeffi

    Usuário da rede brasnet e freenode de IRC, canais frequentados:

    #linuxajuda  - irc.brasnet.org

    Email: jeffi@uol.com.br | freebsd@uol.com.br

     

                Espero ter ajudado, Boa Sorte !!!