POSTFIX-2 + DOMÍNIOS VIRTUAIS + MYSQL + SASL + POSTFIXADMIN ... Autor: Marco A. S. Máximo Email: marco.maximo@pwo.com.br Data: 10.12.2003 Versão 2.0 NOTA ========= Essa é uma atualização do primeiro tutorial ( POSTFIX + COURIER-IMAP + MYSQL + QUOTA + SASL ). 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 Linux, 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 utiliza-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. O QUE É NOVO ============= - POSTFIXADMIN, um ambiente completo para gerenciar as contas virtuais através do servidor WEB. - Atualização dos pacotes * Postfix * Courier-IMAP * SASL * PAM_MYSQL - Utilização do Maildrop para controle de COTAS ao invés da aplicação do PATCH no Postfix. No antigo ambiente, devido a configuração, o PROCMAIL e o MAILDROP não funcionavam corretament. - Aviso ao usuário, por parte do MAILDROP, caso o seu espaço em disco ultrapasse os 90% de utilização. - 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. - AMAVIS_NG + SpamAssassin - Nessa nova versão, fiz uma mudança RADICAL nos campos e nomes das tabelas do MySQL para adequá-los ao POSTFIXADMIN, nesse caso, quem possui um ambiente montado na versão antiga do tutorial, também explicarei como fazer a migração. Levando em consideração, a facilidade de administração proporcionado pelo POSTFIXADMIN, acho que compensa o esforço. - Correção de alguns erros de ortografia do primeiro tutorial. :-) - Um Webmail (squirrelmail) com suporte a MySQL, Courier-IMAP e Domínios Virtuais. - Nesse ambiente foi utilizado o Mandrake 9.1 ao invés do Conectiva. Só que esse tutorial pode ser portado para qualquer distribuição, bastando apenas suprir as dependências através dos pacotes de sua distribuição. Mostrarei como fazer a instalação dos programas utilizando duas formas, através dos RPMS do Mandrake ou das FONTES. Em alguns casos, só consegui configurar usando uma das opções. O PROBLEMA =============== O meu problema começou quando me chamaram para trabalhar com servidores de e-mail 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, um outro motivo da escolha, foi devido a sua facilidade ( Más 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 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 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" 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 e-mail, 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 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 :-) A SOLUÇÃO ============= A solução baseia-se em: - 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". - Substituição de contas MBOX (patrão do Postfix) por contas Maildir (igual ao Qmail). Isso traz vantagem na segurança e no desempenho. APLICATIVOS UTILIZADOS ======================= CheckInstall: http://asic-linux.com.mx/~izto/checkinstall/index.php MySQL: http://www.mysql.com/downloads/ Courier IMAP: http://twtelecom.dl.sourceforge.net/sourceforge/courier/ Maildrop: http://www.flounder.net/~mrsam/maildrop/ Postfix: http://www.postfix.org/ Mailm: http://homepage.ntlworld.com/edmund.grimley-evans/mailm/ Cyrus-SASL http://asg.web.cmu.edu/cyrus/ PAM-MySQL http://sourceforge.net/projects/pam-mysql/ PostixAdmin http://high5.net/postfixadmin/ ClamAV http://clamav.elektrapro.com Amavis_NEW http://www.ijs.si/software/amavisd/ Vacation http://high5.net/postfixadmin/ Squirrelmail http://www.squirrelmail.org/ INSTALAÇÃO DO MANDRAKE 9.1 ========================== Não vou entrar em detalhes na instalação do Mandrake, apenas para facilitar a compatibilidade com o tutorial, vou sugerir a seleção dos seguintes itens/pacotes durante a instalação. DICA: Para maiores detalhes da instalação do Mandrake, recomendo a seguinte URL: http://www.fasb.edu.br/softlivre/ 1.Tela de Inicialização. a. Tecle Enter 2.Escolhendo sua Língua 3.Licença da Distribuição 4.Classe de Instalação 5.Configurando seu Mouse 6.Configurando seu Teclado 7.Nível de Segurança a. Padrão 8.Selecionando os Pontos de Montagem a. Particionamento Manual Estratégia de Particionamento: Nesse ambiente a partição mais utilizada é a das caixas postais, no meu caso /Postfix. Crie no mínimo 3 partições: /swap (250MB) /postfix (caixas postais) / ( raiz ) Caso pretenda utilizar um Webmail, é recomendável você criar um partição /var. 9.Escolhendo Pacotes para Instalar Na seleção de Pacotes, marque: * Estação de Internet * Computador de Rede * Configuração * Desenvolvimento * LSB * Web/FTP * Mail *Seleção individual de pacotes Na próxima tela selecione: - DESENVOLVIMENTO - Outros - dev86 - dev86-devel -SERVIDOR - Web/FTP * php-mysql - Banco de Dados * MySQL - Servidor de Rede * Openssh-Server Fique a vontade para selecionar outro aplicativos conforme a sua necessidade. ANTES DE COMEÇAR ====================== - Crie o diretório /source , pois esse diretório será usado para compilar os fontes. Isso não influencia em NADA a instalação, apenas só tenho preguiça de digitar /usr/local/src :-) - Toda instalação será executada como ROOT, apenas a compilação do COURIER-IMAP que será feita por um usuário normal. - Aonde aparecer os caracteres "xxxxx", troque pela sua senha correspondente. - Crie o grupo e usuário para o MAILDROP [root]:~ # groupadd -g 108 maildrop [root]:~ # useradd -r -d /var/spool/mail -g 108 -u 108 -s /bin/false -M maildrop - Se você estiver usando o Mandrake, essa distribuição também conta com o gerenciador de pacotes ao estilo APT-GET chamado de URPMI. Caso você não queira ficar colocando e tirando CD's ou procurando na Internet por pacotes e dependências que irão aparecer durante o processo de compilação de alguns programas, recomento você atualizar a sua lista de mirror do banco de dados do URPMI. Faça o seguinte: Remova as fontes dos CD's de instalação: [root]:~ # urpmi.removemedia cdrom1 [root]:~ # urpmi.removemedia cdrom2 [root]:~ # urpmi.removemedia cdrom3 Adicione uma nova fonte: [root]:~ # urpmi.addmedia main ftp://mirrors.secsup.org/pub/linux/mandrake/Mandrake/9.1/i586/Mandrake/RPMS with ../base/hdlist.cz [root]:~ # urpmi.addmedia contrib ftp://mirrors.secsup.org/pub/linux/mandrake/Mandrake/9.1/contrib/RPMS with ../../i586/Mandrake/base/hdlist2.cz Dica: Se você usa proxy em sua rede, configure o URPMI com as variáveis Ex: [root]:~ # urpmi.addmedia --proxy : --proxy-user : contrib ftp://mirrors.secsup.org/pub/linux/mandrake/Mandrake/9.1/contrib/RPMS with ../../i586/Mandrake/base/hdlist2.cz Caso você tenha exportado as variáveis de Proxy, simplesmente: [root]:~ # urpmi.addmedia --wget contrib ftp://mirrors.secsup.org/pub/linux/mandrake/Mandrake/9.1/contrib/RPMS with ../../i586/Mandrake/base/hdlist2.cz Agora, para você instalar os pacotes, basta digitar "urpmi nome_do_pacote" que o URPMI baixa os pacotes e supre as dependências automaticamente. Caso você queira adicionar novas fontes ou de outros mirrors, acesse o site: http://plf.zarb.org/~nanardon/index.php DICA: Você pode obter mais informação sobre o URPMI, através do ótimo tutorial escrito pelo Gustavo Sverzut Barbieri em: http://www.linuxdicas.com.br/modules.php?name=Sections&op=viewarticle&artid=189 INSTALAÇÃO DOS PACOTES ========================= Instalando o CHECKINSTALL ========================== http://asic-linux.com.mx/~izto/checkinstall/index.php O Checkinstall é um programa muito útil para quem gosta de compilar programas a partir do código fonte. Através dele, é possível gerar um binário, do fonte compilado, para a sua distribuição e gerencia-los pelo seu gerenciador de pacotes. Se você compilou o Postfix, por exemplo, pode-se gerar um pacote para: RPM (RedHat, Mandrake, Conectiva etc...) DEB (Debian) TGZ (Slackware) Com isso, você pode gerencia-los facilmente, coisa que não acontece com o SOURCE. No nosso caso, vamos usa-lo com a sintaxe -R de RPM. Consulte o --help para informações para outras distribuições. Instalando ----------- ### RPMS [root]:~ # urpmi checkinstall ou ### SOURCE [root]:~ # tar -zxvf checkinstall-1.5.3.tgz -C /source [root]:~ # cd /source/checkinstall [root]:/source/checkinstall# make [root]:/source/checkinstall# make install Para testar se o programa esta OK... [root]:/source/checkinstall# checkinstall -R ********************************************************************** Done. The new package has been installed and saved to /usr/src/RPM/RPMS/i386/checkinstall-1.5.3-1.i386.rpm You can remove it from your system anytime using: rpm -e checkinstall-1.5.3-1 ********************************************************************** Nesse caso, ele gravou o pacote criado no diretório /usr/src/RPM/RPMS/i386/ . Esse será o diretório que todos o RPM serão gravados quando forem criados. Mova-os para algum lugar que deseje. ==================== INSTALANDO O MYSQL ==================== Estou utilizando o MySQL que vem junto com a distribuição, caso não esteja utilizando o Mandrake, instale os pacotes correspondentes a sua distribuição. Foram instalados os seguintes pacotes: MySQL-common-4.0.11a-5mdk MySQL-4.0.11a-5mdk MySQL-client-4.0.11a-5mdk No Mandrake, execute o comando "mysql_install_db" para cria o bando de dados: [root]:~ # mysql_install_db Depois da tabela mysql criada inicio o serviço: [root]:~ # service mysql start Iniciando o servidor MySQL [ OK ] Por default a senha do ROOT para acesso ao MySQL esta em branco. Vamos alterá-la para uma nova e desabilitar alguns itens para aumentar a segurança do bando de dados. obs: Tecle Enter quando for perguntado sobre o password do ROOT, pois esta em branco. Depois responda as perguntas conforme a sua preferência (normalmente YES para todas). [root]:~ # mysql_secure_installation All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! DICA: Por padrão no Mandrake, o log do MySQL esta desabilitado. Esse recurso é muito útil para identificar alguns erros durante a instalação de aplicativos que fazem acesso ao banco. Para resolver esse problema, crie o arquivo /etc/my.cnf com o seguinte conteúdo: [root]:~ # > /etc/my.cnf #=============== INICIO /etc/my.cnf ================= [mysql.server] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock [mysqladmin] socket=/var/lib/mysql/mysql.sock [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock language=/usr/share/mysql/portuguese/ log=/var/lib/mysql/mysqld.log [mysql] socket=/var/lib/mysql/mysql.sock #=============== FIM do /etc/my.cnf ================= Crie o arquivo de log e mude a permissão: [root]:~ # touch /var/lib/mysql/mysqld.log [root]:~ # chown mysql:mysql /var/lib/mysql/mysqld.log Reinicie o MySQL e teste: [root]:~ # service mysql restart Parando o servidor MySQL (pid 1353) [ OK ] Iniciando o servidor MySQL [ OK ] [root]:~ # tail /var/lib/mysql/mysqld.log Time Id Command Argument /usr/sbin/mysqld, Version: 4.0.11a-gamma-log, started with: Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock Beleza! Vamos agora criar as tabelas para o POSTFIX. Crie um arquivo com o nome "postfix_mysq.db" com o seguinte conteúdo: ATENÇÃO: - Substitua, no primeiro bloco, o valor "senha_do_postfix" pela senha do usuário do postfix. - Substitua, caso queira, o diretório aonde ficaram as caixas postais dos usuários, no último bloco no campo home. No meu caso estou usando o diretório "/postfix/ [root]:~ # > postfix_mysq.db # ===================== INICIO DO postfix_mysq.db ================= # # Postfix / MySQL # # Cria o usuário e senha do Postfix e Maildrop para # acesso ao banco # USE mysql INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('xxxxx')); INSERT INTO user (Host, User, Password) VALUES ('localhost','maildrop',password('xxxxx')); INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y'); INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','maildrop','Y'); FLUSH PRIVILEGES; # # Cria o banco postfix # CREATE DATABASE postfix; # # Cria a estrutura da tabela alias # USE postfix; CREATE TABLE alias ( address varchar(255) NOT NULL default '', goto text NOT NULL, domain varchar(255) NOT NULL default '', 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', PRIMARY KEY (address) ) TYPE=MyISAM COMMENT='Virtual Aliases - mysql_virtual_alias_maps'; # # Cria a estrutura da tabela domain # USE postfix; CREATE TABLE domain ( domain varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', 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', PRIMARY KEY (domain) ) TYPE=MyISAM COMMENT='Virtual Domains - mysql_virtual_domains_maps'; # # Cria a estrutura da tabela mailbox # USE postfix; CREATE TABLE mailbox ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', name varchar(255) NOT NULL default '', home char(255) default '/postfix/', maildir varchar(255) NOT NULL default '', quota varchar(255) NOT NULL default '10000000S', domain varchar(255) NOT NULL default '', 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', PRIMARY KEY (username) ) TYPE=MyISAM COMMENT='Virtual Mailboxes - mysql_virtual_mailbox_maps'; # # Cria o usuário de administração do PostfixAdmin # USE mysql INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('xxxxx')); INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'postfix', 'postfixadmin', 'Y', 'Y', 'Y', 'Y'); FLUSH PRIVILEGES; # # Cria a tabela de administração do PostfixAdmin # USE postfix; CREATE TABLE admin ( username varchar(255) NOT NULL default '', password varchar(255) NOT NULL default '', domain varchar(255) NOT NULL default '', 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', PRIMARY KEY (username) ) TYPE=MyISAM COMMENT='Virtual Admins - Store Virtual Domain Admins'; # ===================== FIM DO postfix_mysq.db ================= Depois do arquivo criado, execute o comando: [root]:~ # mysql -psenha_do_root < postfix_mysq.db O banco e as tabelas bem como o usuário do postfix serão criados. Vamos testar o acesso do usuário postfix: [root]:~ # 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 14 to server version: 4.0.11a-gamma 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 é aonde serão criados os redirecionamento (ALIAS). address: É o endereço do novo redirecionamento (ALIAS) goto: É o destinatário(os) do redirecionamento. exemplo: +--------------------------+------------------------------------------------+ | address | goto | +--------------------------+------------------------------------------------+ |postmaster@dominio.com.br | marco@dominio.com.br | +--------------------------+------------------------------------------------+ |postmaster@dominio2.com.br| marco@dominio2.com.br, marcelo@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 | | /postfix/ | | | 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, aonde serão criados os usuários e suas configurações como senha, diretório, cota de disco etc.. - username: É o login do usuário. Ex: marco.maximo@dominio.com.br - password: É a senha do usuário, você pode usar dois tipos de senhas: crypt() ou clear text. Esse último é interesante 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 e usado o /home, mas no meu caso usarei o diretório /postfix/. 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. Um outro motivo, é o programa MSEC que vem no Mandrake. Ele constantemente faz uma checagem nas permissões dos diretórios contido seu banco de dados, conforme o nível de segurança escolhido e muitas vezes, tive a permissão do diretório /HOME alterada para o original pelo programa. Uma opção para resolver esse problema é desabilitar o MSEC mas, segurança nunca é demais. :-) - maildir: É o Maildir do usuário, aonde os email serão armazenados. - quota: É a cota 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 cota 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 esta 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 Courier-IMAP. =========================== INSTALANDO O COURIER-IMAP =========================== http://twtelecom.dl.sourceforge.net/sourceforge/courier/ Como iremos utilizar o Postfix com suporte a 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. Instalando ------------ ### RPMS Instale os pacotes: [root]:~ # urpmi maildirmake++ [root]:~ # urpmi courier-imap [root]:~ # urpmi courier-imap-mysql [root]:~ # urpmi courier-imap-pop ### SOURCE Dependência ----------- libgdbm2-devel-1.8.0-19mdk.i586.rpm libmysql12-devel-4.0.11a-5mdk.i586.rpm libopenssl0.9.7-devel-0.9.7a-1mdk.i586.rpm pam-devel-0.75-30mdk.i586.rpm libfam0-devel-2.6.9-5mdk.i586.rpm Faça o download do pacote em: http://umn.dl.sourceforge.net/sourceforge/courier/courier-imap-2.2.0.tar.bz2 [root]:~ # tar -jxvf courier-imap-2.2.0.tar.bz2 -C /source/ 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": [root]:~ # chown marco:marco /source/courier-imap-2.2.0/ -R [root]:~ # cd /source/courier-imap-2.1.2/ [root]:/source/courier-imap-2.2.0 # su marco [marco]:/source/courier-imap-2.2.0 $ [marco]:/source/courier-imap-2.2.0 $ ./configure --prefix=/usr --sysconfdir=/etc/courier/ --libexecdir=/usr/lib/courier [marco]:/source/courier-imap-2.2.0 $ make [marco]:/source/courier-imap-2.2.0 $ exit exit [root]:/source/courier-imap-2.2.0 # checkinstall -R ********************************************************************** Done. The new package has been installed and saved to /usr/src/RPM/RPMS/i386/courier-imap-2.2.0-1.i386.rpm You can remove it from your system anytime using: rpm -e courier-imap-2.2.0-1 ********************************************************************** Configurando --------------- [root]:~ # cd /etc/courier [root]:/etc/courier # cp imapd.dist imapd [root]:/etc/courier # cp imapd-ssl.dist imapd-ssl [root]:/etc/courier # cp pop3d.dist pop3d [root]:/etc/courier # cp pop3d-ssl.dist pop3d-ssl [root]:/etc/courier # cp authmysqlrc.dist authmysqlrc [root]:/etc/courier # cp authdaemonrc.dist authdaemonrc [root]:/etc/courier # cp quotawarnmsg.example quotawarnmsg [root]:/etc/courier # mkdir dist [root]:/etc/courier # mv *.dist dist/ 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 interesante 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. Edite o /etc/courier/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: [root]:~ # vim /etc/courier/authmysqlrc ================================================= MYSQL_SERVER localhost MYSQL_USERNAME postfix MYSQL_PASSWORD xxxxx MYSQL_SOCKET /var/lib/mysql/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 EX: MYSQL_MAILDIR_FIELD maildir MYSQL_QUOTA_FIELD quota Isso causa erro para o Maildrop. MYSQL_QUOTA_FIELD quota Inicie o serviço RPMS [root]:~ # service courier-imap start Starting Courier-IMAP server: imap generating-SSL-certificate... imap-ssl pop3 generating-SSL-certificate... pop3-ssl SOURCE ------------------------------------------------------------------------- [root]:~ # cd /etc/init.d/ [root]:/etc/init.d # ln -s /usr/lib/courier/imapd.rc imapd [root]:/etc/init.d # ln -s /usr/lib/courier/pop3d.rc pop3d Coloque as seguintes linhas no arquivo /etc/rc.d/rc.local para que os serviços IMAP e POP3 sejam iniciados automaticamente durante a inicialização da máquina. #INICIA o IMAP e POP /etc/init.d/imapd start /etc/init.d/pop3d start Achei cômodo, criar 2 links simbólicos para eles dentro do diretórios aonde estão os meus scripts de inicialização. Para inicia-los a partir desse diretório é só digitar: [root]:/etc/init.d # ./imapd start [root]:/etc/init.d # ./pop3d start -------------------------------------------------------------------------- Teste se os serviços IMAP e POP iniciaram sem problema, vamos rodar os seguintes comandos: [root]:~ # ps ax /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/couriertcpd -address=0 -stderrlogger /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/authlib/authdaemond.mysql start /usr/lib/courier/courierlogger imapd /usr/lib/courier/couriertcpd -address=0 -stderrlogger /usr/lib/courier/courierlogger pop3d Deve aparecer algo como isso. As linhas indicam que os serviços imap e pop3 subiram usando a autenticação pelo MySQL. Vamos checar se as portas dos serviços estão abertas e respondendo: [root]:~ # netstat -a|less tcp 0 0 *:mysql *:* OUÇA tcp 0 0 *:pop3 *:* OUÇA tcp 0 0 *:imap *:* OUÇA Teste do IMAP --------------- [root]:~ # 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 logout * BYE Courier-IMAP server shutting down 0 OK LOGOUT completed Connection closed by foreign host. Teste do POP3 ---------------- [root]:~ # telnet 0 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 ======================== http://www.flounder.net/~mrsam/maildrop/ O Maildrop será responsável pela entrega propriamente dita da mensagem à sua respectiva caixa postal. Ele também fará o controle da cota de disco. Com o Maildrop você também poderá implementar algumas regras de filtragem ## SOURCE ------------------------------------------------------------------------------- Baixe e instale o pacote: http://umn.dl.sourceforge.net/sourceforge/courier/maildrop-1.6.3.tar.bz2 Instalando ------------- [root]:~ # tar -jxvf maildrop-1.6.3.tar.bz2 -C /source/ [root]:~ # cd /source/maildrop-1.6.3/ [root]:/source/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 [root]:/source/maildrop-1.6.3 # make [root]:/source/maildrop-1.6.3 # checkinstall -R [root]:/source/maildrop-1.6.3 # mkdir /etc/maildrop [root]:/source/maildrop-1.6.3 # cp maildropmysql.config /etc/ [root]:/source/maildrop-1.6.3 # cp maildir/quotawarnmsg /etc/maildrop/ ------------------------------------------------------------------------------- Crie o diretório para as caixas postais e mude as permissões para o Maildrop: [root]:~ # mkdir /postfix [root]:~ # chown maildrop:apache /postfix/ [root]:~ # chmod 770 /postfix/ Configurando o MAILDROP ------------------------- Configure o Maildrop para acessar o MySQL. Edite o arquivo /etc/maildropmysql.conf [root]:~ # vim /etc/maildropmysql.conf # ============ INICIO DO maildropmysql.conf ========== hostname localhost port 3306 socket /var/lib/mysql/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 "" # ============ FIM DO maildropmysql.conf ========== 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 ========================== http://www.postfix.org/ Vamos instalar o Postfix com suporte a Maildir+SASL+MySQL, na maioria das distribuições isso não vem habilitado por padrão sendo necessário uma nova compilação. O Postfix também não tem suporte a cota de disco com o formato Maildir, sendo necessário, em alguns casos, a instalação de uma Patch para tal. No nosso caso, como já explicado, a cota será administrada pelo MAILDROP, sendo assim, não será necessário a instalação de nenhum PATCH. Baixe o Postfix de: ftp://ftp.matrix.com.br/pub/postfix/official/postfix-2.0.16.tar.gz Dependências --------------- Instale as dependência para a compilação do Postfix: [root]:~ # urpmi libdbtcl3.3 [root]:~ # urpmi libdb3.3-devel [root]:~ # urpmi libmysql12-devel [root]:~ # urpmi libpcre0-devel [root]:~ # urpmi libsasl2-devel Instalando -------------- [root]:~ # tar -zxvf postfix-2.0.16.tar.gz -C /source/ [root]:~ # cd /source/postfix-2.0.16/ [root]:/source/postfix-2.0.16 # make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=/usr/lib/libmysqlclient.so -lm -L/usr/lib -R/usr/lib -lsasl2' [root]:/source/postfix-2.0.16 # make [root]:/source/postfix-2.0.16 # make upgrade Verifique se o suporte ao MySQL foi habilitado: [root]:/source/postfix-2.0.16 # 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 = xxxxxx hosts = localhost dbname = postfix table = domain select_field = transport where_field = domain mysql_virtual_mailbox_limit_maps.cf ------------------------------------ user = postfix password = xxxxx dbname = postfix table = mailbox select_field = quota where_field = username hosts = localhost OBS: Não esqueça de configurar as linhas "user,password" conforme a sua configuração. MASTER.CF ------------ [root]:~ # vim /etc/postfix/master.cf OBS: Nesse ambiente, não irei utilizar o Postfix com a opção de CHROOT, sendo assim, edite o /etc/postfix/master.cf e troque TODOS os "y" por "n" na coluna "chroot" Ex: ---------------------------------------------------------------------- #service type private unpriv chroot wakeup maxproc command + args smtp inet n - n - - smtpd virtual unix - n n - - virtual pickup fifo n - n 60 1 pickup ---------------------------------------------------------------------- Configure o suporte ao Maildrop: ---------------------------------------------------------------------- maildrop unix - n n - - pipe flags=DRhu user=maildrop argv=/usr/bin/maildrop -w 90 -d ${recipient} ---------------------------------------------------------------------- OBS: - A configuração da segunda linha, deve ter pelo menos 2 espaços no começo da linha, conforme o exemplo. - O parâmetro "-w 90", representa a porcentagem de utilização da caixa postal pode chegar até ser avisado pelo sistema. A mensagem de aviso é enviado pelo MAILDROP com o conteúdo do arquivo "/etc/maildrop/quotawarnmsg" MAIN.CF --------- [root]:~ # vim /etc/postfix/main.cf Faça o backup do arquivo original e crei o /etc/postfix/main.cf com o seguinte conteúdo: #================== INÍCIO DO MAIN.CF ======================== #======== CONFIGURAÇÕES =============== queue_directory = /var/spool/postfix/ program_directory=/usr/sbin command_directory = /usr/sbin daemon_directory = /usr/lib/postfix mail_owner = postfix default_privs=nobody default_transport=smtp alias_maps=hash:/etc/postfix/aliases alias_database=hash:/etc/postfix/aliases readme_directory = no sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = postdrop manpage_directory = /usr/local/man newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq smtpd_banner=$myhostname ESMTP MEU DOMINIO disable_vrfy_command=yes home_mailbox=Maildir/ # ========== NOME DO DOMÍNIO =========== myhostname=postfix.dominio.com.br mydomain=local.com.br myorigin= $mydomain mydestination= $mydomain, $transport_maps #=====REDES p/ Relay====== # 192.168.0.0/24=MINHA REDE # mynetworks=127.0.0.0/8 192.168.0.0/24 #======== MYSQL ============== virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_base = /postfix virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_uid_maps = static:108 virtual_gid_maps = static:108 transport_maps = mysql:/etc/postfix/mysql_transport_maps.cf #======= Quota ============ virtual_mailbox_limit_inbox = no virtual_mailbox_limit_maps= mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf virtual_mailbox_limit_override = yes virtual_maildir_extended = yes virtual_create_maildirsize = yes virtual_mailbox_limit = 100000000 virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later. virtual_overquota_bounce = yes #====== SASL ================ #smtpd_sasl_auth_enable = yes #smtpd_sasl_security_options = noanonymous #broken_sasl_auth_clients = yes #smtpd_recipient_restrictions = # permit_sasl_authenticated, # permit_mynetworks, # check_relay_domains # =======MAILDROP ========== fallback_transport = /usr/bin/maildrop maildrop_destination_recipient_limit = 1 unknown_local_recipient_reject_code = 450 #================== FIM DO MAIN.CF ======================== OBS: - Essa é a configuração básica desse arquivo, fique a vontade para incluir novas implementação. - Note que as linhas referentes ao SASL estão comentadas, elas só seram úteis durante a sua configuração. - O parametro "maildrop_destination_recipient_limit" faz com que o MAILDROP entregue os email para mais de um destinatário, caso contrario, apenas um irá receber a mensagem. Configuração finais --------------------- [root]:~ # rm -rf /var/spool/postfix/etc [root]:~ # rm /usr/lib/sendmail [root]:~ # ln -s /usr/sbin/sendmail /usr/lib/sendmail Agora é hora de testar se o Postfix esta se comunicando com o MySQL. [root]:~ # service postfix restart Precisamos criar um domínio e um usuário para teste. Vamos fazer, primeiramente na "mão", fazendo passo para você visualizar todo o procedimento de criação de um usuário virtual. Logue-se como ROOT no MySQL e faça: [root]:~ # mysql -D postfix -pxxxxx mysql> Criando o Dominio VIRTUAL e LOCAL ----------------------------------- mysql> INSERT INTO domain( domain, description, transport, active) VALUES ( 'dominio1.com.br' , 'Dominio de Teste' , 'maildrop' , '1'); Query OK, 1 row affected (0.01 sec) mysql> mysql> INSERT INTO domain( domain, description, transport, active) VALUES ( 'local.com.br' , 'Dominio LOCAL da Máquina' , 'local' , '1'); Query OK, 1 row affected (0.00 sec) mysql> mysql> SELECT domain,description,transport,active FROM domain; +-----------------+--------------------------+-----------+--------+ | domain | description | transport | active | +-----------------+--------------------------+-----------+--------+ | dominio1.com.br | Dominio de Teste | maildrop | 1 | | local.com.br | Dominio LOCAL da Máquina | local | 1 | +-----------------+--------------------------+-----------+--------+ Criando o Usuário ------------------- ATENÇÃO: Não esqueça de escolher uma senha em "encrypt('xxxxx')" mysql> INSERT INTO mailbox( username, password, name, home, maildir, quota, domain) VALUES ( 'marco.maximo@dominio1.com.br' , encrypt('xxxxx') , 'Marco Maximo' , '/postfix/' , 'dominio1.com.br/marco.maximo/Maildir/' , '10000000S' , 'dominio1.com.br'); Query OK, 1 row affected (0.05 sec) mysql> mysql> SELECT username,name,home,maildir,quota,domain FROM mailbox; +-----------------------------+--------------+--------+---------------------------------------+-----------+-----------------+ | username | name | home | maildir | quota | domain | +-----------------------------+--------------+--------+---------------------------------------+-----------+-----------------+ | marco.maximo@dominio.com.br | Marco Maximo | /postfix/ | dominio1.com.br/marco.maximo/Maildir/ | 10000000S | dominio1.com.br | +-----------------------------+--------------+--------+---------------------------------------+-----------+-----------------+ mysql> exit Bye Criando o HOME do usuário -------------------------- [root]:~ # mkdir -p /postfix/dominio1.com.br/marco.maximo [root]:~ # maildirmake++ /postfix/dominio1.com.br/marco.maximo/Maildir ou [root]:~ # maildirmake /postfix/dominio1.com.br/marco.maximo/Maildir [root]:~ # chown maildrop:apache /postfix/ -R [root]:~ # chmod 770 /postfix/ -R TESTE MAILDROP --------- Teste se o MAILDROP consegue enviar o email para a caixa postal do usuários [root]:~ # cat /etc/lilo.conf |maildrop-mysql -d marco.maximo@dominio1.com.br ***** LOG DO MYSQL ****** 031105 15:19:27 62 Connect maildrop@localhost on 62 Init DB postfix 62 Query SELECT username, uid, gid, home, maildir, quota FROM mailbox WHERE username = "marco.maximo@dominio1.com.br" "" 62 Quit ************************* [root]:~ # ls /postfix/dominio1.com.br/marco.maximo/Maildir/new/ 1068052088.M222683P4357V0000000000000302I00013C90_0.marco,S=621 Beleza, funcionou. TESTE POSTFIX --------------- Usuário LOCAL --------------- [root]:~ # echo "Funcionou..." | mail -s "TESTE do POSTFIX" marco@local.com.br ******************** LOG DO MYSQL ******************* 031111 14:23:52 170 Query select goto from alias where address = 'marco@local.com.br' 170 Query select goto from alias where address = 'marco' 170 Query select goto from alias where address = '@local.com.br' ****************************************************** ******************** LOG DO POSTFIX ******************* Nov 11 14:24:39 marco postfix/pickup[21819]: F285215721: uid=0 from= Nov 11 14:24:39 marco postfix/cleanup[21880]: F285215721: message-id=<20031111162439.F285215721@postfix.dominio.com.br> Nov 11 14:24:39 marco postfix/nqmgr[21820]: F285215721: from=, size=327, nrcpt=1 (queue active) Nov 11 14:24:40 marco postfix/local[21884]: F285215721: to=, orig_to=, relay=local, delay=1, status=sent (maildir) ******************************************************** [root]:~ # ls /home/marco/Maildir/new/ 1068567812.V302I15701.marco.local.com.br Beleza, funcionou.... Usuário VIRTUAL ---------------- [root]:~ # echo "Funcionou..." | mail -s "TESTE do POSTFIX" marco.maximo@dominio1.com.br ******************** LOG DO MYSQL ******************* 031107 14:28:00 23 Connect postfix@localhost on postfix 23 Query select goto from alias where address = 'marco.maximo@dominio1.com.br' 23 Query select goto from alias where address = '@dominio1.com.br' 24 Connect maildrop@localhost on 24 Init DB postfix 24 Query SELECT username, uid, gid, home, maildir, quota FROM mailbox WHERE username = "marco.maximo@dominio1.com.br" "" 24 Quit **************************************************** ******************** LOG DO POSTFIX ******************* Nov 7 14:28:00 teste postfix/pickup[20191]: 82EE0143AD: uid=0 from= Nov 7 14:28:00 teste postfix/cleanup[20226]: 82EE0143AD: message-id=<20031107162800.82EE0143AD@postfix.dominio.com.br> Nov 7 14:28:00 teste postfix/nqmgr[20192]: 82EE0143AD: from=, size=817, nrcpt=1 (queue active) Nov 7 14:28:00 teste postfix/pipe[20228]: 82EE0143AD: to=, relay=maildrop, delay=0, status=sent (dominio1.com.br) ************************************************ [root]:~ # ls /postfix/dominio1.com.br/marco.maximo/Maildir/new/ 1068222707.M754502P20250V0000000000000302I000135EA_0.teste,S=342 Opa, acho que foi: [root]:~ # cat /postfix/dominio1.com.br/marco.maximo/Maildir/new/1068222707.M754502P20250V0000000000000302I000135EA_0.teste\,S\=342 ------------------------------------------------------------- Received: by postfix.dominio.com.br (Postfix, from userid 0) id AE1ED143AD; Fri, 7 Nov 2003 14:31:47 -0200 (BRST) To: marco.maximo@dominio1.com.br Subject: TESTE do POSTFIX Message-Id: <20031107163147.AE1ED143AD@postfix.dominio.com.br> Date: Fri, 7 Nov 2003 14:31:47 -0200 (BRST) From: root@local.com.br,.local.com.br (root) Funcionou... ------------------------------------------------------------- É, foi!!!!! :-) Teste de Autenticação do IMAP ------------------------------ [root]:~ # telnet 0 143 Trying 0.0.0.0... Connected to 0 (0.0.0.0). Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE STARTTLS] Courier-IMAP ready. Copyright 1998-2003 Double Precision, Inc. See COPYING for distribution information. 0 login marco.maximo@dominio1.com.br xxxxxx 0 OK LOGIN Ok. 0 select inbox * FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent) * OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited * 1 EXISTS * 1 RECENT * OK [UIDVALIDITY 1068222985] Ok 0 OK [READ-WRITE] Ok 0 logout * BYE Courier-IMAP server shutting down 0 OK LOGOUT completed Connection closed by foreign host. Beleza, funcionou.!!!! Teste de Autenticação do POP3 ------------------------------ [root]:~ # telnet 0 110 Trying 0.0.0.0... Connected to 0 (0.0.0.0). Escape character is '^]'. +OK Hello there. user marco.maximo@dominio1.com.br +OK Password required. pass xxxxx +OK logged in. list +OK POP3 clients that break here, they violate STD53. 1 351 . quit +OK Bye-bye. Connection closed by foreign host. Beleza, funcionou.!!!! DICA: Em caso de erro de autenticação, sempre dê uma olhada nos logs do MySQL e veja se foi feito e como foi feito o SELECT do courier. Isso pode ser útil para identificar erros no arquivo de configuração do courier. Um outro problema pode ser no MySQL, ou o serviço não esta funcionando ou o usuário não tem permissão de acesso ao banco de dados. ================= COTA DE DISCO ================= Quem vai ser responsável pelo controle de cota de disco nesse ambiente é o Maildrop. Os valores de cotas serão cadastrados no banco de dados, sendo independente para cada usuário. O Maildrop irá ler os tabelas do MySQL e conforme o valor especificado, ele ira fazer o controle de tal cota. Quando você enviou um email para marco.maximo@dominio1.com.br, o Maildrop criou o arquivo "maildirsize" dentro do ~/MAILDIR/ do usuário ex: [root]:~ # ls /postfix/dominio1.com.br/marco.maximo/Maildir courierimapuiddb cur/ maildirsize new/ tmp/ [root]:~ # cat /postfix/dominio1.com.br/marco.maximo/Maildir/maildirsize 10000000S 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 cota esta funcionado: Primeiro vamos alterar o valor da cota do usuário para um valor menor, 1MB é o suficiente. Execute no shell: [root]:~ # mysql -D postfix -pxxxx -e "SELECT username,quota FROM mailbox WHERE username='marco.maximo@dominio1.com.br';" +------------------------------+-----------+ | username | quota | +------------------------------+-----------+ | marco.maximo@dominio1.com.br | 10000000S | +------------------------------+-----------+ A cota esta em 10MB, vamos altera-la para 1MB [root]:~ # mysql -D postfix -pxxxxx -e "UPDATE mailbox SET quota='1000000S' WHERE username='marco.maximo@dominio1.com.br';" [root]:~ # mysql -D postfix -pxxxxx -e "SELECT username,quota FROM mailbox WHERE username='marco.maximo@dominio1.com.br';" +------------------------------+----------+ | username | quota | +------------------------------+----------+ | marco.maximo@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: http://rano.org/mailm/mailm-0.3.tar.gz [root]:~ # ls -lh /tmp/arquivo.tar -rw-r--r-- 1 root root 381K Nov 7 15:06 /tmp/arquivo.tar [root]:~ # mailm -t marco.maximo@dominio1.com.br -ad /tmp/arquivo.tar [root]:~ # mailm -t marco.maximo@dominio1.com.br -ad /tmp/arquivo.tar ******************** LOG DO POSTFIX ******************* Nov 7 15:08:13 teste postfix/pipe[20706]: 0CA0A14ECF: to=, 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 SASL ======================= http://asg.web.cmu.edu/cyrus/ 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 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 aonde estiver pode enviar email pelo seu servidor, sem que você precise liberar o "Relay" para todo mundo. Nessa versão do tutorial, configurei o SASL para autenticação de usuários LOCAIS (do sistema) e VIRTUAIS (MySQL). Instalando o SASL ------------------- Nessa configuração, irei basear-me nos pacotes RPM. O Mandrake já vem com o Cyrus-SASL compilado, sendo que a instalação é muito simples. Passei 2 dias tentando fazer o SASL 2, instalado a partir do código fonte funcionar com o POSTFIX+MYSQL, mas sem sucesso. Não descobri porque, mas se alguém conseguiu por favor entre em contato :-). Dependências -------------- # RPMS [root]:~ # urpmi cyrus-sasl [root]:~ # urpmi libsasl2-plug-login [root]:~ # urpmi libsasl2-plug-plain [root]:~ # urpmi pam-devel [root]:~ # urpmi sharutils [root]:~ # urpmi metamail Instalando o PAM-MYSQL ---------------------- http://sourceforge.net/projects/pam-mysql/ Para permitir a autenticação SASL usando o MySQL, vamos usar o módulo "pam_mysql". Baixe-o em: http://sourceforge.net/projects/pam-mysql/ Preparando para compilar: [root]:~ # tar -zxvf pam_mysql-0.5.tar.gz -C /source/ [root]:~ # cd /source/pam_mysql/ [root]:/source/pam_mysql # make [root]:/source/pam_mysql # cp pam_mysql.so /lib/security/ Crie os seguintes arquivos com o respectivo conteúdo: /usr/lib/sasl2/smtpd.conf #smtpd.conf #----------- pwcheck_method: saslauthd /etc/pam.d/smtp #smtp #----------------------------------------------------------------- #%PAM-1.0 auth sufficient /lib/security/pam_unix_auth.so try_first_pass auth optional /lib/security/pam_mysql.so user="postfix" \ passwd="xxxxx" \ host="localhost" \ db="postfix" \ table="mailbox" \ usercolumn="username" \ passwdcolumn="password" \ crypt=1 # account sufficient /lib/security/pam_unix_acct.so account required /lib/security/pam_mysql.so user="postfix" \ passwd="xxxxxx" \ host="localhost" \ db="postfix" \ table="mailbox" \ usercolumn="username" \ passwdcolumn="password" \ crypt=1 #----------------------------------------------------------------- Habilitando o SASL no Postfix ------------------------------- Descomente as seguintes linhas no arquivo /etc/postfix/main.cf: #====== 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 Reinicie o Postfix [root]:~ # service postfix restart Desligando postfix: [ OK ] Iniciando postfix: [ OK ] Inicie o serviço de autenticação do SASL [root]:~ # service saslauthd start Iniciando saslauthd: [ OK ] [root]:~ # ps ax 30844 ? S 0:00 saslauthd -a pam -T 30845 ? S 0:00 saslauthd -a pam -T 30846 ? S 0:00 saslauthd -a pam -T 30853 ? S 0:00 saslauthd -a pam -T 30854 ? S 0:00 saslauthd -a pam -T TESTES -------- Para testar a autenticação SASL, é necessário a criação de uma senha para teste. Execute o seguinte comando: Usuário VIRTUAL: [root]:~ # printf 'marco.maximo@dominio1.com.br\0marco.maximo@dominio1.com.br\0xxxxx' | mmencode bWFyY28ubWF4aW1vQGRvbWluaW8xLmNvbS5icgBtYXJjby5tYXhpbW9AZG9taW5pbzEuY29t LmJyAHJkcm1heC0zNTA= Usuário LOCAL: [root]:~ # printf 'marco\0marco\0xxxxx' | mmencode bWFyY28AbWFyY28AcmRybWF4 OBS: Esse comando ira gerar uma senha criptografada, e senha deve ser fornecida toda na mesma linha durante o teste. Agora faça: Usuário VIRTUAL [root]:~ # telnet 0 25 Trying 0.0.0.0... Connected to 0 (0.0.0.0). Escape character is '^]'. 220 postfix.dominio.com.br ESMTP MEU DOMINIO ehlo postfix 250-postfix.dominio.com.br 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-XVERP 250 8BITMIME (na mesma linha faça:) AUTH PLAIN bWFyY28ubWF4aW1vQGRvbWluaW8xLmNvbS5icgBtYXJjby5tYXhpbW9AZG9taW5pbzEuY29tLmJyAHJkcm1heC0zNTA= 235 Authentication successful quit 221 Bye ******************** LOG DO MYSQL ******************* 031110 14:38:37 7 Connect postfix@localhost on postfix 7 Init DB postfix 7 Query SELECT password FROM mailbox WHERE username='marco.maximo@dominio1.com.br' 7 Quit ****************************************************** Usuário LOCAL [root]:~ # telnet 0 25 Trying 0.0.0.0... Connected to 0 (0.0.0.0). Escape character is '^]'. 220 postfix.dominio.com.br ESMTP MEU DOMINIO ehlo postfix 250-postfix.dominio.com.br 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-XVERP 250 8BITMIME (na mesma linha faça:) AUTH PLAIN bWFyY28AbWFyY28AcmRybWF4 235 Authentication successful quit 221 Bye DICA: - Caso ocorra algum erro após você conectar via telnet na porta 25, é provável que tenha ocorrido algum na compilação do Postfix. Para recompilar o Postfix, você deve antes rodar o comando "make clean". - Dê uma olhado no /var/log/messages em caso de erro. Funcionou! Agora quando você for enviar e-mail, habilite a opção de autenticação no seu cliente de e-mail. =========================== Instalando o POSTFIXADMIN =========================== http://high5.net/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 as 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. - Desabilite 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 COTA de disco - Mudança na forma de apresentação da DATA de alteração da conta, para um formato BR Dependências --------------- Apache PHP [root]:~ # urpmi php-mysql [root]:~ # urpmi php-ini ATENÇÃO: Caso você não esteja utilizando o Mandrake, 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 minha versão com essas alterações, baixe-o nesse link: http://smaximo.minidns.net/~marco/postfixadmin-MODIFICADO.tar.bz2 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. [root]:~ # tar -jxvf postfixadmin-ALTERADO.tar.bz2 -C /var/www/html/ Copie os scrips para um outro diretório e mude as permissões. [root]:~ # mv /var/www/html/postfixadmin/*.sh /var/www/ [root]:~ # chmod 700 /var/www/*.sh [root]:~ # chown apache:apache /var/www/html/postfixadmin/ -R [root]:~ # cd /var/www/html/postfixadmin/ 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 apache ALL=NOPASSWD:/var/www/adduser.sh apache ALL=NOPASSWD:/var/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 pagina de administração de domínio do PostfixAdmin, no meu caso usarei o usuário "admin". [root]:~ # cd /var/www/html/postfixadmin/admin/ [root]:/var/www/html/postfixadmin/admin # htpasswd .htpasswd admin New password: Re-type new password: Updating password for user admin Inicie o servidor apache [root]:~ # service httpd start Starting httpd2: [ OK ] Agora pelo BROWSER acesso o endereço http://ip_do_servidor/postfixadmin/admin Ele ira lhe pedir o usuário 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://ip_do_servidor/postfixadmin/ colocando a 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. ===================== Anti-Vírus ClamAV ===================== http://clamav.elektrapro.com Download: http://aleron.dl.sourceforge.net/sourceforge/clamav/clamav-0.65.tar.gz Dependências -------------- [root]:~ # urpmi libbzip2_1-devel Instalação ------------ [root]:~ # tar -zxvf clamav-0.65.tar.gz -C /source/ [root]:~ # cd /source/clamav-0.65/ [root]:/source/clamav-0.65 # adduser -s /bin/false -c "Amavis User" -d /var/amavis amavis obs: O ClamAV deve usar o mesmo usuário do Amavis. [root]:/source/clamav-0.65 # ./configure \ --prefix=/usr/ \ --sysconfdir=/etc/clamav [root]:/source/clamav-0.65 # make [root]:/source/clamav-0.65 # checkinstall -R [root]:/source/clamav-0.65 # mkdir /var/run/clamav/ [root]:/source/clamav-0.65 # mkdir /var/amavis/clamd [root]:/source/clamav-0.65 # chown -R amavis:amavis /var/amavis [root]:/source/clamav-0.65 # chown amavis:amavis /var/run/clamav [root]:/source/clamav-0.65 # mkdir /var/lib/clamav Configuração -------------- Edite o arquivo "/etc/clamav/clamav.conf" e configure conforme o exemplo: #------------------------------------------- #Example LogFile /var/amavis/clamd/clamd.log LogFileMaxSize 2M LogTime LogVerbose PidFile /var/run/clamav/clamd.pid DataDirectory /usr/share/clamav LocalSocket /var/amavis/clamd/clamav.socket #TCPSocket 3310 #TCPAddr 127.0.0.1 MaxDirectoryRecursion 15 User amavis ScanArchive ArchiveMaxFileSize 10M ArchiveMaxRecursion 5 ArchiveMaxFiles 1000 ClamukoScanOnOpen ClamukoScanOnClose ClamukoScanOnExec ClamukoIncludePath /home ClamukoMaxFileSize 1M ClamukoScanArchive #------------------------------------------- Crie o arquivo de inicialização do Clamav em /etc/init.d/ #=============== clamd ====================== #! /bin/sh # # chkconfig: 345 87 07 # description: clamd Start/Stop the clamav daemon. # # processname: clamd # config: /etc/clamav/clamav.conf # pidfile: /var/run/clamav/clamd.pid # Source function library. . /etc/rc.d/init.d/functions # See how we were called. case "$1" in start) gprintf "Starting %s: " "clamd" daemon clamd echo touch /var/lock/subsys/clamd ;; stop) gprintf "Stopping %s: " "clamd" echo "QUIT\r" | telnet 127.0.0.1 3310 sleep 5 kill `cat /var/run/clamav/clamd.pid` sleep 2 echo rm -f /var/lock/subsys/clamd ;; *) gprintf "Usage: %s {start|stop}\n" "clamd" exit 1 esac exit 0 #=============== FIM ====================== [root]:~ # chmod 744 /etc/init.d/clamd [root]:~ # cd /etc/init.d/ [root]:/etc/init.d # chkconfig --add clamd [root]:/etc/init.d # service clamd start Iniciando clamd: [ OK ] Atualizando o banco de dados dos vírus: --------------------------------------- [root]:~ # clamscan ----------- SCAN SUMMARY ----------- Known viruses: 10146 Scanned directories: 1 Scanned files: 18 Infected files: 0 Data scanned: 0.09 MB I/O buffer size: 131072 bytes Time: 0.470 sec (0 m 0 s) [root]:~ # freshclam ClamAV update process started at Fri Nov 14 11:25:08 2003 SECURITY WARNING: NO SUPPORT FOR DIGITAL SIGNATURES Connecting via 192.168.0.1:3128 Reading CVD header (main.cvd): OK main.cvd is up to date (version: 4, sigs: 9816, f-level: 1, builder: tomek) Connecting via 192.168.0.1:3128 Reading CVD header (daily.cvd): OK Downloading daily.cvd [*] daily.cvd updated (version: 18, sigs: 330, f-level: 1, builder: diego) Database updated (10146 signatures) from database.clamav.net (192.168.0.1). Crie o arquivo de atualização diária: [root]:~ # echo '#!/bin/bash' >/etc/cron.daily/virusupdate [root]:~ # echo '/usr/bin/freshclam --quiet' >> /etc/cron.daily/virusupdate [root]:~ # chmod a+xr /etc/cron.daily/virusupdate [root]:~ # cat /etc/cron.daily/virusupdate #!/bin/bash /usr/bin/freshclam --quiet ============================ Instalação do Amavis_NEW ============================ http://www.ijs.si/software/amavisd/ http://www.ijs.si/software/amavisd/INSTALL O Amavis_NEW, é uma versão do Amavis que possui além de um virus scanners um Anti-SPAM utilizando o conhecido SpamAssassin. Dependências: --------------- [root]:~ # urpmi ncftp [root]:~ # urpmi lha [root]:~ # urpmi lzop unrar: ftp://194.199.20.114/linux/contrib/libc6/i386/unrar-3.2.3-2.9.i386.rpm zoo: ftp://216.254.0.38/linux/contrib/libc6/i386/zoo-2.10-11.9.i386.rpm unzoo: ftp://fr.rpmfind.net/linux/PLD/current/dists/ra/updates/general/i386/unzoo-4.4-2.i386.rpm arc: ftp://216.254.0.38/linux/contrib/libc6/i386/arc-5.21e-6.i386.rpm nomarch ftp://216.254.0.38/linux/Mandrake/9.2/contrib/i586/nomarch-1.3-1mdk.i586.rpm unarj: ftp://194.199.20.114/linux/contrib/libc6/i386/unarj-2.65-3.9.i386.rpm arj: ftp://216.254.0.38/linux/contrib/libc6/i386/arj-3.10-0.1.i386.rpm freeze: ftp://194.199.20.114/linux/contrib/libc6/i386/freeze-2.5.0-7.i386.rpm compress: ftp://ftp.warwick.ac.uk/pub/compression/compress-4.0.1.tar.gz Instalando dependências do Perl com o Perl-CPAN Iniciando a shell CPAN ------------------------ [root]:~ # perl -MCPAN -e shell Are you ready for manual configuration? [yes] CPAN build and cache directory? [/root/.cpan] Cache size for build directory (in MB)? [10] 30 Perform cache scanning (atstart or never)? [atstart] Cache metadata (yes/no)? [yes] Your terminal expects ISO-8859-1 (yes/no)? [yes] Policy on building prerequisites (follow, ask or ignore)? [ask] Where is your gzip program? [/bin/gzip] Where is your tar program? [/bin/tar] Where is your unzip program? [/usr/bin/unzip] Where is your make program? [/usr/bin/make] Where is your lynx program? [/usr/bin/lynx] Where is your wget program? [/usr/bin/wget] Where is your ncftpget program? [/usr/bin/ncftpget] Where is your ftp program? [/usr/bin/ftp] What is your favorite pager program? [/usr/bin/less] What is your favorite shell? [/bin/bash] Your choice: [] Your choice: [] Your choice: [] Timeout for inactivity during Makefile.PL? [0] Parameters for the 'make' command? [] Parameters for the 'make install' command? [] Timeout for inactivity during Makefile.PL? [0] Your ftp_proxy? Your http_proxy? Your no_proxy? Your proxy user id? Your proxy password? (1) Africa (2) Asia (3) Central America (4) Europe (5) North America (6) Oceania (7) South America Select your continent (or several nearby continents) [] 7 (1) Argentina (2) Brazil (3) Chile Select your country (or several nearby countries) [] 2 (1) ftp://cpan.hostsul.com.br/unZOO (2) ftp://cpan.pop-mg.com.br/pub/CPAN/ (3) ftp://ftp.matrix.com.br/pub/perl/CPAN/ Select as many URLs as you like, put them on one line, separated by blanks [] 3 Enter another URL or RETURN to quit: [] [wait://ls6.informatik.uni-dortmund.de:1404] cpan> Instalando ----------- cpan> install File::MMagic cpan> install Config::IniFiles cpan> install Convert::TNEF cpan> install Convert::UUlib cpan> install Compress::Zlib cpan> install Archive::Tar cpan> install Archive::Zip cpan> install Unix::Syslog cpan> install MIME::Base64 cpan> install Net::Server cpan> install Net::SMTP Should all FTP connections be passive (y|n) ? [no] no cpan> install Digest::MD5 cpan> install Time::HiRes cpan> install Mail::SpamAssassin cpan> exit Instalando ------------- http://www.ijs.si/software/amavisd/amavisd-new-20030616-p6.tar.gz Crie o usuário para o Amavis caso ele ainda não existe. [root]:~ # adduser -s /bin/false -c "Amavis User" -d /var/amavis amavis [root]:~ # tar -zxvf amavisd-new-20030616-p6.tar.gz -C /source/ [root]:~ # cd /source/amavisd-new-20030616/ [root]:/source/amavisd-new-20030616 # mkdir -p /var/amavis/clamd [root]:/source/amavisd-new-20030616 # chown -R amavis:amavis /var/amavis [root]:/source/amavisd-new-20030616 # chmod -R 750 /var/amavis/ [root]:/source/amavisd-new-20030616 # cp amavisd /usr/local/sbin/ [root]:/source/amavisd-new-20030616 # ln -s /usr/local/sbin/amavisd /usr/sbin/amavisd [root]:/source/amavisd-new-20030616 # cp amavisd.conf /etc/ [root]:/source/amavisd-new-20030616 # mkdir /var/virusmails [root]:/source/amavisd-new-20030616 # chown amavis:amavis /var/virusmails [root]:/source/amavisd-new-20030616 # cp amavisd_init.sh /etc/init.d/amavisd [root]:/source/amavisd-new-20030616 # chmod 744 /etc/init.d/amavisd [root]:/source/amavisd-new-20030616 # cd /etc/init.d/ [root]:/etc/init.d # chkconfig --add amavisd Edite o arquivo /etc/amavisd.conf e altere as seguintes linhas: #============================================================================= $MYHOME = '/var/amavis'; # (default is '/var/amavis') $mydomain = 'local.com.br'; # (no useful default) $daemon_user = 'amavis'; # (no default; customary: vscan or amavis) $daemon_group = 'amavis'; # (no default; customary: vscan or amavis) $QUARANTINEDIR = '/var/virusmails'; $log_level = 0; #Por default o SpamAssassin, rejeit todo o email identificado como SPAM. #O problema é que isso pode gerar erros de Falso Negativo. Nesse caso ele pode rejeitar emails válidos. #Eu gosto de utilizar a opção aonde os email localizados como SPAM, recebem uma marcação no subjet tipo ***SPAM*** $final_virus_destiny = D_BOUNCE; # (defaults to D_BOUNCE) $final_banned_destiny = D_BOUNCE; # (defaults to D_BOUNCE) $final_spam_destiny = D_PASS; # (defaults to D_REJECT) $final_bad_header_destiny = D_PASS; # (defaults to D_PASS), D_BOUNCE suggested $sa_spam_subject_tag = '***SPAM***' # Coloque aqui, o email do administrador ou crie um ALIAS para esse email, que recebera os aviso dos emails localizados pelo Amavis. $virus_admin = "virusalert\@$mydomain"; #Descomente todos as indicações de outros anti-vírus e deixe apenas o do ClamAV ou de algum outro que você esteja usando. Também edite a linha referênte ao clamav e inclua "/var/amavis/clamd/clamav.socket" Ex: # ### http://clamav.elektrapro.com/ ['Clam Antivirus-clamd', \&ask_daemon, ["CONTSCAN {}\n", '/var/amavis/clamd/clamav.socket'], qr/\bOK$/, qr/\bFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ], # NOTE: run clamd under the same user as amavisd, # match the socket name in clamav.conf to the socket name in this entry # # ['KasperskyLab AntiViral Toolkit Pro (AVP)', ['avp','kavscanner'], # '-* -P -B -Y -O- {}', [0,3,8], [2,4], # any use for -A -K ? # qr/infected: (.+)/, # sub {chdir('/opt/AVP') or die "Can't chdir to AVP: $!"}, # sub {chdir($TEMPBASE) or die "Can't chdir back to $TEMPBASE $!"}, # ], #============================================================================ Testes --------- Verifique a inicialização e certifique-se se existe algum erro na configuração do amavis com: [root]:~ # amavisd debug Em outro terminal, teste se ele esta respondendo pela porta: [root]:~ # telnet 127.0.0.1 10024 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. 220 [127.0.0.1] ESMTP amavisd-new service ready =================== Saída do Log ================= Nov 14 16:58:34 marco.local.com.br amavisd[25899]: Net::Server: 2003/11/14-16:58:34 CONNECT TCP Peer: "127.0.0.1:32954" Local: "127.0.0.1:10024" Nov 14 16:58:34 marco.local.com.br amavisd[25899]: lookup_ip_acl: key="127.0.0.1" matches "127.0.0.1", result=1 Nov 14 16:58:34 marco.local.com.br amavisd[25899]: prolong_timer after new request - timer reset: remaining time = 300 s Nov 14 16:58:34 marco.local.com.br amavisd[25899]: SMTP> 220 [127.0.0.1] ESMTP amavisd-new service ready =================================================== Iniciando o serviço: [root]:~ # service amavisd start Starting amavisd: [ OK ] Configuração do Postfix ------------------------- No final /postfix/etc/master adicione: # AMAVIS-NEW+SpamAssassin smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=yes 127.0.0.1:10025 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o mynetworks=127.0.0.0/8 No final /postfix/etc/main.cf adicione: #===== AMAVIS ============== content_filter = smtp-amavis:[127.0.0.1]:10024 Reinicie o Postfix e teste [root]:/etc/init.d # telnet 127.0.0.1 10025 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. 220 postfix ESMTP MEU DOMINIO quit 221 Bye Connection closed by foreign host. Vá para o diretório de teste do Amavis, e como usuário COMUM, envie alguns exemplos de email com vírus e com spam: [root]:~ # cd /source/amavisd-new-20030616/test-messages/ [root]:/source/amavisd-new-20030616/test-messages # su marco [marco]:/source/amavisd-new-20030616/test-messages $ Email c/ Virus: ------------------ [marco]:/source/amavisd-new-20030616/test-messages $ sendmail -i marco.maximo@dominio1.com.br < sample-virus-simple.txt ================== SAÍDA DO LOG ================================ Nov 26 15:15:41 marco postfix/pickup[7706]: 211D818167: uid=500 from= Nov 26 15:15:41 marco postfix/cleanup[7369]: 211D818167: message-id=<20031126171541.211D818167@postfix> Nov 26 15:15:41 marco postfix/nqmgr[3486]: 211D818167: from=, size=2662, nrcpt=1 (queue active) Nov 26 15:15:41 marco postfix/smtpd[7982]: connect from localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/smtpd[7982]: 8CDC918170: client=localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/cleanup[7339]: 8CDC918170: message-id= Nov 26 15:15:41 marco postfix/nqmgr[3486]: 8CDC918170: from=, size=1659, nrcpt=1 (queue active) Nov 26 15:15:41 marco postfix/smtpd[7982]: disconnect from localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/smtpd[7311]: connect from localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/pipe[7859]: 8CDC918170: to=, relay=maildrop, delay=0, status=sent (dominio1.com.br) Nov 26 15:15:41 marco postfix/smtpd[7311]: A655D18170: client=localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/cleanup[7369]: A655D18170: message-id= Nov 26 15:15:41 marco postfix/nqmgr[3486]: A655D18170: from=<>, size=2980, nrcpt=1 (queue active) Nov 26 15:15:41 marco postfix/smtpd[7311]: disconnect from localhost.localdomain[127.0.0.1] Nov 26 15:15:41 marco postfix/local[7751]: A655D18170: to=, relay=local, delay=0, status=sent (maildir) Nov 26 15:15:41 marco amavis[7926]: (07926-03) INFECTED (Eicar-Test-Signature), -> , quarantine virus-20031126-151541-07926-03, Message-ID: <20031126171541.211D818167@postfix>, Hits: - Nov 26 15:15:41 marco postfix/smtp[7634]: 211D818167: to=, relay=127.0.0.1[127.0.0.1], delay=0, status=sent (250 2.5.0 Ok, id=07926-03, BOUNCE) ======================================================================= Se todo correu sem problema, o usuário "marco" enviou um email para o usuário "marco.maximo@dominio1.com.br". O Amavis interceptou a mensagem e enviou para o ClamAV após ter sido registrado como uma "mensagem infectada" ( Nov 14 17:43:42 marco amavis[26311]: (26311-07) INFECTED (Eicar-Test-Signature)). O Amavis colocou o email em quarentena e enviou 2 email. - Um aviso ao remetente, no caso, o usuário "marco". - Um outro para o administrador do sistema ($virus_admin = ) Essa é apenas uma configuração básica para que o amavis possa funcionar, você pode explorar outras configurações mais avançadas. ============================= Instalando o Mail VACATION ============================= http://high5.net/postfixadmin/ 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. Dependência ------------- [root]:~ # urpmi perl-DBI [root]:~ # urpmi procmail perl DBD::mysql Instalando dependências do Perl com o Perl-CPAN [root]:~ # perl -MCPAN -e shell 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, ex: [root]:~ # cd ~/.cpan/build/DBD-mysql-2.9003/ [root]:~/.cpan/build/DBD-mysql-2.9003 # make install Instalação ------------- Faça o download do programa em: http://high5.net/postfixadmin/download.php?file=vacation-2.2.tgz [root]:~ # tar -zxvf vacation-2.2.tgz -C /source/ [root]:~ # cd /source/vacation/ 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: [root]:/source/vacation # mysql -pxxxxx < vacation_mysql.cf Crie um usuário no sistema para receber os email 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). [root]:/source/vacation # adduser vacation [root]:/source/vacation # cp dot.forward /home/vacation/.forward [root]:/source/vacation # cp dot.procmailrc /home/vacation/.procmailrc [root]:/source/vacation # cp vacation.pl /home/vacation/ [root]:/source/vacation # chown vacation:vacation /home/vacation -R Configuração --------------- Edite o arquivo "/home/vacation/.forward" e indique o caminho correto do procmail. No Mandrake /usr/bin/procmail. [root]:/source/vacation # 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, eu usei os mesmos dados do usuário do postfixadmin. $db_name = "postfix"; $db_user = "postfixadmin"; $db_pass = "xxxxx"; $sendmail = "/usr/sbin/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 postfix tem acessa o banco: [root]:~ # 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 pagina 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. [marco]:~ $ echo "TESTE" | mail -s "VACATION" marco.maximo@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 ======================= http://www.squirrelmail.org/ 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 Webmail 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 PHP [root]:~ # urpmi php-pear Instalando ------------ No site existe versões em RPM, mas aconselho a utilizar as versão SOURCE devido a sua facilidade de personalização. Faça o download em: http://unc.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.2.tar.bz2 [root]:~ # tar -jxvf squirrelmail-1.4.2.tar.bz2 -C /var/www/html/ [root]:~ # cd /var/www/html/ [root]:/var/www/html # mv squirrelmail-1.4.2/ webmail [root]:/var/www/html # chown apache:apache webmail/ -R [root]:/var/www/html # cd webmail/ Configurando -------------- A configuração do Squirrelmail, pode ser feita de duas formas: - Por um script de configuração "configure" - 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ário 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','squirreluser',password('xxxxx')); INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv) VALUES ('localhost', 'webmail', 'squirreluser', 'Y', 'Y', 'Y', 'Y'); FLUSH PRIVILEGES; #================ squirrelmail.db ====================== Crie o banco e as tabelas: [root]:~ # mysql -pxxxxx < squirrelmail.db Teste se foi criado: [root]:~ # 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", ex: [root]:/var/www/html/webmail/config # cp config_default.php config.php Uma outra forma de gerar esse arquivo, é usando o script de configuração: [root]:/var/www/html/webmail # ./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. #============ webmail/config/config.php ==================== $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 os seu número correspondente. Agora acesse o webmail pelo link: http://ip_do_servidor/webmail/ Para logar no webmail você precisa fornecer seu nome completo de usuário, ou seja, usuario@dominio. Ex: user: marco.maximo@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: http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fcompatibility-1.2.tar.gz http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_mysqlpass-3.2-1.2.8.tar.gz Instalando ------------ [root]:~ # tar -zxvf compatibility-1.2.tar.gz -C /var/www/html/webmail/plugins/ [root]:~ # tar -zxvf change_mysqlpass-3.2-1.2.8.tar.gz -C /var/www/html/webmail/plugins/ [root]:~ # cd /var/www/html/webmail/plugins/change_mysqlpass/ [root]:/var/www/html/webmail/plugins/change_mysqlpass # cp config.php.sample config.php [root]:/var/www/html/webmail/plugins/change_mysqlpass # chown root:apache config.php [root]:/var/www/html/webmail/plugins/change_mysqlpass # chmod 640 config.php Edite o arquivo "config.php" e configure as seguintes variáveis: #============== config.php ============ $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 = 1; $mysql_MD5crypt = 0; $use_ssl_for_password_change = 1; $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'; #============== config.php ============ [root]:~ # cd /var/www/html/webmail/ [root]:/var/www/html/webmail # ./configure Escolha a opção 8 e 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, recebera 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;" . Caso o seu servidor não esteja com o suporte SSL ativo. Altere para 0 para resolver o problema. Plugins Recomendados --------------------- msg_flags : Icones para as mensagens smallcal : Pequeno calendário na barra lateral newuser_wiz : Ajuda o usuário configurar alguns dados iniciais vlogin : Completa o login do usuário com o seu dominio "@dominio.com.br" ======================================== Migrando as Tabelas do Antigo Ambiente ======================================== Se você montou seu ambiente utilizando o antigo tutorial, você terá notado que eu mudei o nome da tabela e dos seus campos. Essas alterações foram necessárias devido a necessidade de adequação ao PostfixAdmin. Você pode tomar dois caminhos: - Adequar o PostfixAdmin ao seu ambiente e suas tabelas do MySQL - Migra os conteúdo do banco para as novas tabelas do PostfixAdmin. Se você optou pela primeira opção, parabéns você conhece bastante PHP e possui um bom tempo livre :-) Caso tenha optado pela segunda opção, vou explicar como fazer essa manobra com "pouco" trauma. obs: Esse solução que fiz talvez não seja a mais elegante, mas pelo menos funcionou. Prova de que os fins justificam os meios :-) PREPARANDO O ARQUIVO ====================== Crie um backup da antiga tabela no diretório /root/tmp/: [root]:~ # mysqldump -B mail --tables virtual_users -psenha > /root/tmp/backup_mail.cf Edite o arquivo gerado, com o editor VI (Se você não conhece o VI, acho uma boa hora para aprender), e apague as linhas parecidas com: ========================================================================= # MySQL dump 8.16 # # Host: localhost Database: mail #-------------------------------------------------------- # Server version 3.23.46-log # # Table structure for table 'virtual_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 '502', gid int(10) unsigned default '503', 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', disk_usage int(10) unsigned default NULL, quota char(128) default '10000000S', htaccess tinyint(4) default '0', PRIMARY KEY (id), KEY unique_id (unique_id) ) TYPE=MyISAM; # # Dumping data for table 'virtual_users' # ================================================================== Deixe só os dados da tabela Ex: INSERT INTO virtual_users VALUES (494,'sandra.hirose@seu_dominio.com.br','ad6UWax8vrpqg',108,108,'/home/','seu_dominio.com.br/sandra.hirose/Maildir/','2002-11-28','03:09:58','seu_dominio.com.br','SANDRA ETSUKO HIROSE',1,0,'10000000S',0); ATENÇÃO: Retire todas as linha vazias do COMEÇO e do FINAL do arquivo. Com o VI aberto, no modo de comando (sinhal de dois-pontos) execute o seguinte comando: : %s/INSERT INTO virtual_users VALUES (//g : %s/);//g Com isso você vai deixar a linha parecida com isso: 494,'sandra.hirose@seu_dominio.com.br','ad6UWax8vrpqg',108,108,'/home/','seu_dominio.com.br/sandra.hirose/Maildir/','2002-11-28','03:09:58','seu_dominio.com.br','SANDRA ETSUKO HIROSE',1,0,'10000000S',0 Agora crie o script em PHP com o seguinte conteúdo: #=================add_mysql.php ============= #!/usr/bin/php -q #================================================================ Edite as seguintes variáveis conforme a sua configuração: $host = "localhost"; $user = "root"; $senha = "senha"; $name_db = "postfix"; Cruze os dedos e execute o script :-) [root]:~/tmp # chmod +x add_mysql.php [root]:~/tmp # ./add_mysql.php Teste se foi tudo ok... [root]:~ # mysql -D postfix -u root -psenha -e "select * from mailbox;" Se ocorreu tudo certo, vai aparecer um monte de coisas na tela. Agora, temos de terminar o serviço. Para a migração ser perfeita, temos que corrigir mais 3 campos da tabela, são ele: QUOTA UID GID A QUOTA diferente da antiga tabela, agora precisa ter um "S" no final de cada valor. Isso é necessário para que o MAILDROP crie o arquivo $HOME/Maildir/maildirsize de cada usuário caso não exista. Esse arquivo controla a sua COTA conforme especificado no MySQL. Os valores do campos UID e GUI devem ser o mesmo do usuário MAILDROP. Conecte-se no MySQL e execute: [root]:~ # mysql -D postfix -u root -psenha mysql> mysql> select quota from mailbox where username='marco.maximo@dominio1.com.br'; +------------+ | quota | +------------+ | 30000000 | +------------+ Alterando a COTA mysql> update mailbox set quota=concat(quota,'S'); Query OK, 384 rows affected (0.01 sec) Linhas que combinaram: 384 - Alteradas: 384 - Avisos: 0 mysql> select quota from mailbox where username='marco.maximo@dominio1.com.br'; +-------------+ | quota | +-------------+ | 30000000S | +-------------+ mysql> select uid,gid from mailbox where username='marco.maximo@dominio1.com.br'; +------+------+ | uid | gid | +------+------+ | 502 | 503 | +------+------+ Alterando o UID e GID mysql> update mailbox set uid=108,gid=108 where uid=502 and gid=503; Query OK, 384 rows affected (0.02 sec) Linhas que combinaram: 384 - Alteradas: 384 - Avisos: 0 mysql> select uid,gid from mailbox where username='marco.maximo@dominio1.com.br'; +------+------+ | uid | gid | +------+------+ | 108 | 108 | +------+------+ Beleza, banco migrado com sucesso. Espero :-) ========================== Migrando a tabela ALIASES ========================== Você como eu, talvez possua muitos redirecionamentos de email (ALIASES), sendo assim você pode seguir o seguinte roteiro para migrar de forma menos traumática e trabalhosa os seu dados. Crei o arquivo de backup [root]:~ # mysqldump -B mail --tables aliases -psenha > /root/tmp/backup_alias.cf Edite o arquivo gerado, com o VI, e apague as linhas parecidas com: ========================================================================= # MySQL dump 8.16 # # Host: localhost Database: mail #-------------------------------------------------------- # Server version 3.23.46-log # # Table structure for table 'aliases' # CREATE TABLE aliases ( alias varchar(255) NOT NULL default '', rcpt varchar(255) default NULL, date_add date default NULL, time_add time default NULL, PRIMARY KEY (alias) ) TYPE=MyISAM; # # Dumping data for table 'aliases' # ================================================================== Deixe só os dados da tabela Ex: INSERT INTO aliases VALUES ('suporte@dominio1.com.br','silva@dominio1.com.br','2003-03-31','00:00:00'); ATENÇÃO: Retire todas as linha vazias do COMEÇO e do FINAL do arquivo. Com o VI aberto, no modo de comando (sinal dois-pontos) execute o seguinte comando: : %s/INSERT INTO aliases VALUES (//g : %s/);//g Sáia do VI e execute o seguinte comando: [root]:~/tmp # cat backup_alias.cf |cut -d\' -f2|cut -d@ -f2 >dominios.log Edite o arquivo criado e execute o seguinte comando: : %s/^/'/g : %s/$/'/g Salve e saia, agora faça: [root]:~/tmp # paste -d, backup_alias.cf dominios.log > saida.txt Agora crie o script em PHP com o seguinte conteúdo: #================= add_alias_mysql.php ============= #!/usr/bin/php -q De permissão de execução e execute o script. Boa sorte. Fontes: Postfix: http://www.postfix.org/ http://kirb.insanegenius.net/postfix.html http://groups.google.com/groups?q=mysql+group:mailing.postfix.users&hl=pt&lr=&ie=UTF-8&selm=a8f1ks%242651%241%40FreeBSD.csie.NCTU.edu.tw&rnum=1 http://high5.net/howto/ Postfix Book autor Richard Blum editora: sams Courier: http://inter7.com/courierimap/ SASL: http://postfix.state-of-mind.de/patrick.koetter/smtpauth/ http://www.thecabal.org/~devin/postfix/smtp-auth.txt PostfixAdmin: http://high5.net/howto/