Páginas

segunda-feira, 1 de abril de 2013

Controlando Filas de Email no Postfix

objetivo

Aqui vamos ver alguns métodos para controlar as filas de e-mail do MTA Postfix.

filas

As filas que esta MTA usa para o processamento de mensagens são:
incoming
active
deferred
corrupt
hold
Quem faz o gerenciamento da fila é o QMGR (http://www.postfix.org/qmgr.8.html)
Agora vamos entender a finalidade de cada fila.

tipos

incoming

Esta é a fila de e-mails que estâo entrando a partir da rede, repassados pelo maildrop.

active

Esta é a fila de e-mails que foram abertos pelo gerenciador da fila para entregas. Essa fila tem um numero limite para entrada de mensagens.

deferred

Esta é a fila de mensagens que não conseguiram ser entregues na primeira tentativa. O gerenciador da fila vai seguir as configurações do main.cf para novas tentativas de entregas. Por padrão ele vai dobrando o tempo de entrega a cada tentativa.

corrupt

Os arquivos das filas que não conseguem ser lidos ou que estão danificados são movidos para esta fila para uma inspeção.

hold

Mensagens que são colocadas em espera pelo administrador vão para esta fila até que alguém especifique que ela deva ser liberdada.

diretorios e arquivos

Elas ficam no diretório /var/spool/postfix/
root@mail-pri:/etc/postfix# ls /var/spool/postfix/ -la
total 2156
drwxr-xr-x  19 root    root        4096 Dec 13  2006 .
drwxr-xr-x  12 root    root        4096 May 27 08:58 ..
drwx------   2 postfix root      405504 May 28 08:45 active
drwx------   2 postfix root        4096 May 28 08:45 bounce
drwx------   2 postfix root        4096 Mar 26  2006 corrupt
drwx------  18 postfix root        4096 Apr  3  2006 defer
drwx------  18 postfix root        4096 Apr  3  2006 deferred
drwxr-xr-x   2 root    root        4096 May 27 10:37 etc
drwx------   2 postfix root        4096 May 27 10:13 flush
drwx------   2 postfix root        4096 Mar 26  2006 hold
drwx------   2 postfix root     1691648 May 28 08:45 incoming
drwxr-xr-x   2 root    root        4096 May 27 10:37 lib
drwx-wx--T   2 postfix postdrop   36864 May 28 08:45 maildrop
drwxr-xr-x   2 postfix root        4096 May 20 11:37 pid
drwx------   2 postfix root        4096 May 27 10:37 private
drwx--s---   2 postfix postdrop    4096 May 27 10:37 public
drwx------   2 postfix root        4096 Mar 26  2006 saved
drwx------   2 postfix root        4096 Apr  5  2007 trace
drwxr-xr-x   3 root    root        4096 Mar 26  2006 usr
veja o conteúdo do diretório deferred
root@mail-pri:/etc/postfix# ls /var/spool/postfix/deferred/
0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
veja o conteúdo dos sub-diretórios em deferred
root@mail-pri:/etc/postfix# ls -la /var/spool/postfix/deferred/0/
total 216
drwx------   2 postfix postfix  12288 May 28 08:15 .
drwx------  18 postfix root      4096 Apr  3  2006 ..
-rwx------   1 postfix postfix   7648 May 28 08:48 021CF81FC
-rwx------   1 postfix postfix 119423 May 28  2008 05AE380DC
-rwx------   1 postfix postfix  30256 May 28  2008 05FA581C3
-rwx------   1 postfix postfix   5002 May 28  2008 097EE80AD
-rwx------   1 postfix postfix   4578 May 28  2008 0CBB081B8
-rwx------   1 postfix postfix  18921 May 28 08:48 0FB458081
verificando o tipo de arquivo
root@mail-pri:/etc/postfix# file /var/spool/postfix/deferred/0/021CF81FC
/var/spool/postfix/deferred/0/021CF81FC: data

controlando a filas

usando postqueue

Vamos aprender a gerenciar a fila com o postqueue (http://www.postfix.org/postqueue.1.html)

postqueue -p

para verificar como está sua fila use o comando
postqueue -p

postqueue -f

para dar um flush na fila e enviar mensagens que estão aguardando (deferred) use o comando
postqueue -f

postqueue -i

para iniciar a entrega imediata de uma mensagem na fila deferred
postqueue -i message_id
postqueue -i F2AF0111029
como obter o message id?
posqueue -p|grep endereco@dominio.com.br
'''F2AF0111029'''     5514 Wed May 28 07:58:02  nome@dominio

postqueue -s

para iniciar a entrega imediata de mensagens na fila para um domínio especifico
postqueue -s mda.gov.br

usando o postsuper

Vamos aprender a gerenciar a fila com o postsuper (http://www.postfix.org/postsuper.1.html)

postsuper -h

Colocando mensagem em HOLD (espera).
postsuper -h queue_id

postsuper -H

Libera mensagem colocada em HOLD
postsuper -H queue_id

postsuper -d

remove mensagem das filas
postsuper -d queue_id
remove todas as mensagens da fila
postsuper -d ALL

postsuper -p

Faz um purge na nos arquivos temporarios da fila que podem ser sobras de um crash no sistema ou no postfix.
postsuper -p

postsuper -s

Verifica a estrutura das filas e repara a fila caso exista algum problema.
postsuper -s

postsuper -r

Recoloca a mensagem na fila, geralmente usamos quando queremos pegar uma mensagem e enviar imediatamente.
postqueue -r queue_id
Se você quiser fazer isto com várias mensagens, coloque-as em um arquivo, uma em baixo da outra e faça o seguinte
cat queueid_list.txt | postqueue -r -

visualizano filas

qshape

O Qshape é uma ferramenta de análise estatística do postfix, vamos aprender a usá-lo.

visualizando fila active

qshape active
qshape active|head

visualizando fila deferred

qshape deferred
qshape deferred|head

visualizando fila incoming

qshape incoming
qshape incoming|head

visualizando fila hold

qshape hold
qshape hold|head
tem vários outras formas de usar o qshape mas a documentação dele é bem clara ;)

exemplo de saída do qshape

# qshape incoming active
                                      T  5  10 20 40 80 160 320 640 1280 1280+
                               TOTAL 655 60 111  0 43  0   7   6 120  150   158
                    mopar.ops.gov.br 151 40 111  0  0  0   0   0   0    0     0
                          ops.gov.br 109  0   0  0  0  0   0   0   0   50    59
                   correioweb.com.br  55  0   0  0  0  0   0   0  55    0     0
                         ops.gov.br  35  0   0  0  0  0   0   0   0   14    21
                          uai.com.br  31  0   0  0  4  0   0   0  27    0     0
               serv-ops-2.ops.gov.br  20 20   0  0  0  0   0   0   0    0     0
                          uol.com.br  19  0   0  0 19  0   0   0   0    0     0
                     acritica.com.br  14  0   0  0  1  0   0   6   4    0     3
                   redesat-to.com.br  10  0   0  0  1  0   1   0   4    0     4
                     alterosa.com.br   7  0   0  0  1  0   0   0   6    0     0
                         hotamil.com   6  0   0  0  1  0   0   0   2    0     3
                          ibahia.com   5  0   0  0  0  0   0   0   1    2     2
                consultor.ops.gov.br   5  0   0  0  0  0   0   0   0    2     3
                       inatel.com.br   4  0   0  0  0  0   0   0   2    0     2
                  estagio.ops.gov.br   4  0   0  0  0  0   0   0   0    1     3
                          ojc.com.br   3  0   0  0  0  0   0   0   2    0     1
                          umc.com.br   3  0   0  0  0  0   0   0   0    0     3
                         oesp.com.br   3  0   0  0  0  0   0   0   1    0     2
                       tvcaju.com.br   3  0   0  0  0  0   1   0   0    0     2

usando shellscript

bash + find

vamos criar um arquivo chamado contafilas
# vim /etc/postfix/contafilas
coloque o conteúdo abaixo
contafilas
  #!/bin/sh
 
# autor: gutocarvalho (guto@gutocarvalho.net)
# data de criacao: 2008-05-28
# baseado nos scripts do queuegraph
 
# uso: ./contafilas
 
# variaveis
 
while true;do
clear
qdir=`/usr/sbin/postconf -h queue_directory` 
 
incoming=`/usr/bin/find $qdir/incoming -type f -print | wc -l | awk '{print $1}'`
maildrop=`/usr/bin/find $qdir/maildrop -type f -print | wc -l | awk '{print $1}'`
active=`/usr/bin/find $qdir/active -type f -print | wc -l | awk '{print $1}'`
deferred=`/usr/bin/find $qdir/deferred -type f -print | wc -l | awk '{print $1}'`
hold=`/usr/bin/find $qdir/hold -type f -print | wc -l | awk '{print $1}'`
corrupt=`/usr/bin/find $qdir/corrupt -type f -print | wc -l | awk '{print $1}'`
 
# imprimindo informacoes
 
echo "Contandor de filas Postfix por Guto Carvalho <gutocarvalho@gmailcom>"
echo -e "\nE-mails chegando (incoming queue): $incoming"
echo "E-mails sendo processados (maildrop): $maildrop"
echo "E-mails na fila para entrega (active queue): $active"
echo "E-mails que nao foram entregues (deferred queue): $deferred"
echo -e "E-mails com problemas (corrupt queue): $corrupt\n"
sleep 1
done
o script original do queuegraph soma incoming + active + maildrop para falar a quantidade de e-mails ativos, deixando apenas a variável active, eu preferi modificar, mas se quiser usar como era originalmente, apague a variável 'incoming' e 'maildrop' e deixe apenas a variável active como abaixo:
active=`/usr/bin/find $qdir/active $qdir/maildrop $qdir/incoming -type f -print | wc -l | awk '{print $1}'`
agora ajuste as permissões
# chmod 700 contafilas
para usar
# ./contafilas
saída do comando
E-mails chegando: '1'
E-mails sendo processados: '''0'''
E-mails na fila para entrega local: '''2'''
E-mails que nao conseguiram ser entregues local/remoto: '''156'''
E-mails com problemas: '''0'''
pronto ;)

bash + qshape

Este script vai usar o qshape para contar as filas INCOMING, ACTIVE, DEFFERD e HOLD
vamos criar o arquivos
# vim contafilas-qshape
coloque o conteúdo do arquivos
contafilas-qshape.sh
  #!/bin/bash
 
  # getmailq.sh - written by Valec 2006. Steal and share.
  #Get postfix queue lengths
 
  #Place in /usr/local/bin/
  #exec .1.3.6.1.4.1.2021.53.101.0 mailq /usr/local/bin/getmailq.sh 
 
  QUEUES="incoming active deferred hold corrupt"
 
  for i in $QUEUES; do
          COUNT=`qshape $i | grep TOTAL | awk '{print $2}'`
          printf "$i:$COUNT "
  done
 
ajustando permissões
chmod 700 contafilas-qshape.sh
rodando o script
# ./contafilas-qshape.sh
saída do comando
incoming:0
active:2
deferred:187
hold:0
corrupt:0
pronto ;)

delivery status reports

Aproveitando o ensejo vamos falar sobre os estados das mesagens, é importante saber que o gerenciador de fila QMGR mantem um arquivo com o mesmo nome da fila em outros diretórios com informações sobre o estado daquela mensagem.
Os estados são:
bounce
defer
trace
Vamos agora entender o que cada estado significa.

bounce

Informação sobre os motivos da mensagem ter recebido um bounce (mensagem de erro).
Estas informações são gerenciadas pelo BOUNCE DAEMON.

defer

Informação sobre os motivos da mensagem estar com o envio atrasado.
Estas informações são gerenciadas pelo DEFER DAEMON.

trace

Informação sobre requisições com o comando sendmail -v ou sendmail -bv do MTA postfix.
Estas informações são gerenciadas pelo TRACE DAEMON.
;)

referências

2 comentários:

  1. òtima essa piblicação, meus parabens, após googlear muito, o seu post até agora sanou 100% as minhas duvidas, meus parabens pelo artigo

    ResponderExcluir
    Respostas
    1. ok.... Valeu Eduardo..... fico contente em poder ter te ajudado...... Grande Abraço.

      Excluir