Gestire la coda di Postfix
Postfix è uno tra i più diffusi mail server utilizzati.
In questo articolo ci concentriamo su come gestire una coda di posta, cioè di cosa succede nel momento in cui cerchiamo di inviare un messaggio.
Postfix ha cinque diverse code di invio, di seguito elencate, e per ogni coda viene dedicata una specifica cartella sul server.
Tutti i messaggi che gestisce Postfix rimarranno nel server in una di queste code, fino a quando il messaggio non verrà eliminato dal server:
- maildrop
- incoming
- active
- deferred
- hold
- corrupt
Le cartelle dedicate a queste code sono localizzate sotto la directory "/var/spool/postfix/" e nello specifico sono
- /var/spool/postfix/maildrop
- /var/spool/postfix/incoming
- /var/spool/postfix/active
- /var/spool/postfix/deferred
- /var/spool/postfix/hold
- /var/spool/postfix/corrupt
Vediamo in breve il significato di ognuna di queste code.
Ipotizziamo di inviare una newsletter a 10.000 utenti, quindi stiamo lanciando 10.000 email
La coda MAILDROP
Prima di procedere all'invio viene verificato, per ogni messaggio, la correttezza della formattazione e la presenza di errori. In questa fase i messaggi sono salvati in questa coda / cartella.
La coda INCOMING
Superata la fate di controllo di formattazione, i messaggi vengono parcheggiati in questa coda / cartella, nell'attesa che la coda ACTIVE (quella che effettivamente invia i messaggi) si liberi.
La coda ACTIVE
Nella coda ATTIVA sono presenti i messaggi pronti per l'invio, quindi in procinto di essere spediti. E' la fase più delicata, e questa cartella ha dimensioni ridotte rispetto alle altre. Ecco perchè esiste la coda INCOMING: i messaggi sono parcheggiati li fino a quando la coda ACTIVE si libera!
La coda DEFERRED
Qui vengono parcheggiati i messaggi di cui è stato tentato l'invio, ma è fallito, ad esempio perchè il server di destinazione ha respinto la ricezione.
Nella configurazione di Postfix possiamo definire il tempo che dovrà intercorrere tra l'inserimento in questa coda e il reinserimento nella coda ATTIVA.
Ecco un esempio di log di Postix di invio fallito, e quindi inserito nella coda DIFFERITA: in questo caso il server di destinazione, per la sua policy, ha respinto la ricezione perchè gli abbiamo un numero eccessivo di email in un certo intervallo di tempo !
7F70E147A1 8067 Thu Feb 13 20:06:24 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
luca@libero.it
La coda HOLD
Presenta i messaggi che abbiamo volutamente "congelato", cioè il cui invio è stato momentaneamente sospeso, ad esempio perchè prima di inviarli vogliamo apportare modifiche alla configurazione di Postfix.
Rimarranno in questa coda fino a quando non li rimettermo nella coda attiva.
La coda CORRUPT
In questa coda / cartella finiscono i messaggi che, dopo la verifica, risultano essere danneggiati, presentano errori al loro interno, e non possono quindi essere spediti.
Dopo questa panoramica sui tipi di code di POSTFIX, vediamo come verificare o gestire una coda.
Visualizzare la coda di Postfix
Per visualizzare la lista di messaggi in coda, utilizziamo questo comando
postqueue -p
O in alternativa
mailq
O ancora
sendmail -bp
Sono tutti comandi equivalenti
Il risultato è la lista di tutti i messaggi accodati, simile a questa, dove ogni messaggio presenta alcune righe con varie informazioni tra cui un identificativo univoco (ad esempio "A77B31473D")
.............
A77B31473D 8050 Thu Feb 13 20:05:14 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
andrea@libero.it
AC43A14B65 7989 Thu Feb 13 20:07:51 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
pippo@libero.it
A0C2C14BF5 7998 Thu Feb 13 20:08:15 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
mario@libero.it
7F70E147A1 8067 Thu Feb 13 20:06:24 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
luca@libero.it
7805514757 8044 Thu Feb 13 20:05:35 sender@miosito.it
(delivery temporarily suspended: host smtp-in.libero.it[213.209.1.129] refused to talk to me: 451 smtp-27.iol.local smtp-27.iol.local too many invalid recipients [smtp-27.iol.local; LIB_660])
giulio@libero.com
.............
L'identificativo univoco è fondamentale per la gestione della coda
Visualizzare il contenuto di un messaggio in coda
Grazie all'identificativo univoco possiamo aprire il contenuto di un messaggio, includi gli headers, come segue
postcat -q {ID CODA}
dove al posto di {ID CODA} mettete l'identificativo univoco del messaggio, ad esempio
postcat -q A77B31473D
Visualizzare il numero di messaggi accodati
Per conoscere il numero di email accodate, o attendiamo per il comando "postqueue -p" venga ultimato. Al fondo infatti è presente il numero di messaggi accodati.
Oppure, più rapidamente, utilizziamo
postqueue -p | grep -c "^[A-Z0-9]"
Statistica sui messaggi accodati per dominio
Un comdando che utilizzo molto, per avere una vista globale dei messaggi accodati, raggruppati per dominio è il seguente
qshape
Abbiamo con "deferred" ci informa di tutti i messaggi con coda differita, per dominio. E' uno dei miei comandi preferiti!
qshape deferred
Il risultato sarà ad esempio
T 5 10 20 40 80 160 320 640 1280 1280+
TOTAL 280 0 0 0 0 0 0 0 0 0 280
libero.it 252 0 0 0 0 0 0 0 0 0 252
gmail.com 7 0 0 0 0 0 0 0 0 0 7
icloud.com 7 0 0 0 0 0 0 0 0 0 7
alice.it 1 0 0 0 0 0 0 0 0 0 1
liero.it 1 0 0 0 0 0 0 0 0 0 1
gmailc.om 1 0 0 0 0 0 0 0 0 0 1
interno.it 1 0 0 0 0 0 0 0 0 0 1
luibero.it 1 0 0 0 0 0 0 0 0 0 1
fideuram.it 1 0 0 0 0 0 0 0 0 0 1
outlool.com 1 0 0 0 0 0 0 0 0 0 1
patheon.com 1 0 0 0 0 0 0 0 0 0 1
spinvest.com 1 0 0 0 0 0 0 0 0 0 1
Rilanciare una coda
Per rilanciare una coda differita, senza attendere i tempi previsti dalla configurazione di Postifix utilizziamo
postqueue -f
Oppure in alternativa
postfix flush
Cancellare una coda
Per cancellare tutti i messaggi in coda utilizziamo
postsuper -d ALL
Per cancellare solo i messaggi differiti utilizziamo
postsuper -d ALL deferred
Per cancellare uno specifico messaggio, utilizziamo il suo identificativo, ad esempio
postsuper -d A77B31473D
Cancellare tutti i messaggi la cui coda contiene una specifica stringa
Se ad esempio volessimo cancellare dalla coda tutti i messaggi il cui invio è stato differito per "delivery temporarily suspended", possiamo utilizziare una combinazione di comandi come questa
postqueue -p | grep -v '^\-' | awk '/^$/{print ""}{printf $0" "}' | grep 'delivery temporarily suspended' | awk '{gsub(/!|\*/, "", $1); print $1}' | postsuper -d -
Sospendere l'invio dei messaggi (coda HOLD)
Se volessimo temporaneamente sospendere l'invio dei messaggi, perchp ad esempio dobbiamo apportare una modifica alla configurazione di Postfix, possiamo spostarli nella coda HOLD, in questo modo
postsuper -h ALL
I messaggi non verranno cancellati, ma tolti dalla coda attiva, in attesa di essere rilanciati.
Per rimetterli nella coda attiva utilizziamo
postsuper -H ALL
Per sospendere l'invio della coda DEFERRED:
postsuper -h ALL deferred
e per riaccordarli
postsuper -H ALL deferred
E per ultimo, se vogliamo congelare l'invio dei messaggi destinati ad uno specifico dominio, ad esempio "libero.it"
postqueue -p | grep -v '^\-' | awk '/^$/{print ""}{printf $0" "}' | grep '@libero.it' | awk '{gsub(/!|\*/, "", $1); print $1}' | postsuper -h -
Rimandiamo ad altri articoli, altri esempi di gestione della coda.