Integrando TMDA + POSTFIX + MYSQL + MAILDROP Esse how to foi feito com o intuito de implementar o TMDA http://www.tmda.net/ (Tagged Message Delivery Agent) em um ambiente já em produção rodando postfix com suporte a dominios virtuais, realizando a consulta de usuarios no mysql e utilizando o maildrop para entregar os e-mails nas caixas postais (Maildir). |->Maildir Postfix->Maildrop->< |->TMDA->Maildir Nesse esquema o maildrop recebe os e-mails do postfix e de acordo com nossa configuracao o maildrop vai entregar direto no Maildir ou entao fara um pipe para o tmda-filter. PATHS utilizados no exemplo: Maildir = /home/vmail/dominio.com.br/hamilton/Maildir Maildrop = /usr/local/bin/maildrop #Instalacao do TMDA cd /usr/local/src wget http://tmda.net/releases/stable/tmda-1.0.3.tgz tar xvfz tmda-1.0.3.tgz mv tmda-1.0.3 /usr/local/tmda cd /usr/local/tmda ./compileall #Modificacoes no Postfix main.cf: recipient_delimiter = + #Apesar do site aconselhar utilizar o delimiter como "-" #preferi utilizar o "+" por questoes de funcionamento #do sistema de gestao de e-mails da empresa #No master.cf nao foi necessario realizar nenhum alteracao, mas #caso o seu esteja diferente, a unica parte relevante seria #a parte do maildrop: maildrop unix - n n - - pipe flags=DRhu user=maildrop argv=/usr/bin/env SENDER=${sender} RECIPIENT=${recipient} EXTENSION=${extension} /usr/local/bin/maildrop -w 90 -d ${user}@${nexthop} ${extension} ${recipient} ${user} ${nexthop} #O proximo passo eh fazer com que o maildrop verique se o usuario #tem as configuracoes necessarias para rodar o TMDA, ou se o #TMDA nao esta configurado para aquela conta, entregando o #email direto na Mailbox. #Para isso vamos criar o arquivo /etc/maildroprc # /etc/maildroprc #Definindo variaveis e parametros recebidos pelo maildrop LOGNAME=tolower("$LOGNAME") EXTENSION="$1" RECIPIENT=tolower("$2") USER=tolower("$3") HOST=tolower("$4") HOME="/home/vmail/$HOST/$USER" SENDER="$5" DEFAULT="/home/vmail/$HOST/$USER/." DEST="Maildir" #Arquivo de log, util para debug logfile "/home/vmail/$HOST/mailfilter.log" #Verificacoes de delimitaor,sender e estrutura de pastas if ( "$EXTENSION" ne "" ) { DELIMITER="+" } if (!$SENDER) { SENDER = "<>" } `test -e /home/vmail/$HOST` if ( $RETURNCODE != 0 ) { `mkdir /home/vmail/$HOST` } `test -e /home/vmail/$HOST/$USER` if ( $RETURNCODE != 0 ) { `maildirmake /home/vmail/$HOST/$USER` `chmod -R 0700 /home/vmail/$HOST` } `test -f /home/vmail/$HOST/.mailfilters/$LOGNAME` if ( $RETURNCODE == 0 ) { include "/home/vmail/$HOST/.mailfilters/$LOGNAME" } if ( $RETURNCODE != 0 ) { to "/home/vmail/$HOST/$USER/$DEST"; } if ( $RECIPIENT eq $SENDER ) { if ( $COPYTOSELF ne "Y" ) { log "Dumping message to /dev/null/ because SENDER and RECIPIENT match" to "/dev/null" } } #Caso em que o e-mail vai para o TMDA if ( $TMDA eq "Y" ) { to "| /usr/local/tmda/bin/tmda-filter" } #Caso nao va par ao TMDA, vai par ao Mailbox to "/home/vmail/$HOST/$USER/$DEST"; #Fim do arquivo # O proximo passo é criar alguns arquivos de controle que # que serao utilizados pelo maildrop. Esses arquivos e o script # acima foram criados pois o servidor estava em producao, fazendo # esse tipo de controle nao corremos o risco de usuarios ficarem # sem e-mails caso ocorra algum problema com o TMDA. #Criando pasta mailfilters e arquivo de controle mkdir /home/vmail/dominio.com.br/.mailfilters vi /home/vmail/dominio.com.br/hamilton@dominio.com.br # Conteudo do arquivo /home/vmail/dominio.com.br/hamilton@dominio.com.br COPYTOSELF="Y" TMDA="Y" import SENDER import RECIPIENT import EXTENSION # Como podem ver, para cada dominio existira uma pasta .mailfilters # cotendo arquivos no estilo "nome@dominiovirtual.com.br" assim fica # facil fazer o controle do TMDA por usuario. # Nesse sistema utilizo o usuario maildrop, em muitos sistemas custuma-se # usar outros usuarios como "vmail" etc, verifique sua situacao. # Acertando permissoes chown -R maildrop:maildrop /home/vmail/dominio.com.br/.mailfilters chmod -R 600 /home/vmail/dominio.com.br/.mailfilters #Agora vamos comecar a criar as estruturas de pastas do TMDA: #Crie as seguintes pastas: /home/vmail/dominio.com.br/hamilton/.tmda #logs /home/vmail/dominio.com.br/hamilton/.tmda/logs # Lista de pessoas que confirmaram enviou, ou balcklist /home/vmail/dominio.com.br/hamilton/.tmda/lists # filtros /home/vmail/dominio.com.br/hamilton/.tmda/filters # E-mails pendentes /home/vmail/dominio.com.br/hamilton/.tmda/pending # Templates ( msg que o sistema usa automaticamente ) /home/vmail/dominio.com.br/hamilton/.tmda/templates # Controle de respostas /home/vmail/dominio.com.br/hamilton/.tmda/response #Um dos grandes problemas que enfrentei com o TMDA eh que a maioria #da documentacao e para Qmail que utiliza (pelo que me lembre) #um usuario no /etc/passwd para cada dominio virtual que voce tem na maquina. #Porem nesse esquema as coisas sao um pouco diferentes, nao existe #usuario que referencie os dominios virtuais. #Para comecar, vamos gerar a chave ( que deve ser unica ) para #cada caixa postal. cd /home/vmail/dominio.com.br/hamilton/.tmda #Rode o programa tmda-keygen , e coloque a chave que ele gera no arquivo #crypt_key e depois de um chmod 600 no arquivo crypt_key /usr/local/tmda/bin/tmda-keygen #Agora iremos ao arquivo de configuracao, no proprio TMDA existe #uma serie de exemplos de arquivos de configuracao, so que eles #usam uma serie de variaveis tipo "os.path.expanduser" ou "os.environ" #essas coisas meio doidonas de programacao, que seriam ate uteis #se usassemos usuarios do sistema, tipo Qmail. Nao usei nada disso #meu arquivo de configuracao ficou +- assim: #vi config: PRIMARY_ADDRESS_MATCH = 2 MAIL_TRANSFER_AGENT = "postfix" RECIPIENT_DELIMITER = "+" ACTION_INCOMING = "confirm" ACTION_OUTGOING = "dated[=timeout_interval]" TERSE_SUMMARY_HEADERS = ["from_name", "from_address", "subject", "date"] CONFIRM_APPEND = "/home/vmail/dominio.com.br/hamilton/.tmda/lists/whitelist_confirmed" PENDING_RELEASE_APPEND = "/home/vmail/dominio.com.br/hamilton/.tmda/lists/whitelist_confirmed" LOGFILE_DEBUG = "/home/vmail/dominio.com.br/hamilton/.tmda/logs/debug" LOGFILE_INCOMING = "/home/vmail/dominio.com.br/hamilton/.tmda/logs/incoming" LOGFILE_OUTGOING = "/home/vmail/dominio.com.br/hamilton/.tmda/logs/outgoing" TEMPLATE_DIR = "/home/vmail/dominio.com.br/hamilton/.tmda/templates" PENDING_DIR = "/home/vmail/dominio.com.br/hamilton/.tmda/pending" CRYPT_KEY_FILE ="/home/vmail/dominio.com.br/hamilton/.tmda/crypt_key" RESPONSE_DIR ="/home/vmail/dominio.com.br/hamilton/.tmda/response" FILTER_INCOMING = "/home/vmail/dominio.com.br/hamilton/.tmda/filters/incoming" FILTER_OUTGOING = "/home/vmail/dominio.com.br/hamilton/.tmda/filters/outgoing" MAIL_TRANSPORT ="sendmail" DELIVERY = "/home/vmail/dominio.com.br/hamilton/Maildir/" #Todas essas variaveis podem ser consultadas em #http://tmda.rtin.bz/config-vars.html, certifique que voce ira #utilizar todas as funcoes mecionadas no arquivo e que cada arquivo #indicado na configuracao seja criado. #Criando filtros para e-mails: vi filters/incoming #Conteudo do arquivo: #Liberando from vazio from <> ok from mailerdaemon@* ok from postmaster@* ok from root@* ok #Liberando quem ja confirmou from-file /home/vmail/seven.com.br/hamilton/.tmda/lists/whitelist_confirmed ok #Liberando dominios confiaveis from *seven.com.br ok from *inet.com.br ok from *bhlink.com.br ok from *@i2.com.br ok from *@registro.br ok from *@pm.org ok from *@lacnic.net ok #Aceitando listas to *@yahoogrupos.com.br ok #Dropando: from *@spmmaer.com.br drop #Fim do arquivo. #Existem varios exemplos de templates e filtros no site do TMDA, #caso alguem precise de algum arquivo meu basta entrar em contato #por hamilton@seven.com.br.