Postifix: recapitare un messaggio ad un indirizzo email alternativo, in una coda di invio
Ci siamo accorti, dopo l'invio di una newsletter e quindi con una coda ("queue") già creata, che l'indirizzo email di uno dei destinatari è errato?
Interveniamo subito seguendo questi step!
1: Individuiamo il messaggio incriminato
La email che vogliamo individuare è la seguente: pippo@libero.it
La vogliamo modificare in pluto@libero.it
Possiamo visualizzare la coda di Postfix con il seguente comando:
postqueue -p
il risultato sarà la lista dei messaggi accodati, simil questa:
.............
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
.............
Ogni messaggio accodato, come possiamo vedere, presenta più righe, ed è identificato da un codice identificativo univoco: dobbiamo estrarre il codice del messaggio inviato a "pippo@libero.it".
In presenza di pochi messaggi, il problema non sussiste, lo possiamo individuare subito, ma in presenza di centinaia o migliaia di messaggi?
Per questo scopo utilizziamo il comando "postqueue -p" combinato con "grep" in questo modo
postqueue -p | grep 'pippo@libero.it' -B 2
"postqueue -p" estrae la coda completa dei nostri invii
"grep" filtra la coda
Così facendo otteniamo la seguente riga.
AC43A14B65 7989 Thu Feb 13 20:07:51 sender@miosito.it
Quello che ci interessa è l'identificato del messaggio accodato, cioè "AC43A14B65".
2: Congeliamo l'invio del messaggio
Modifichiamo lo stato di invio di questo messaggio che è, ad esempio, in stato "attivo" (in attesa di invio) o "deferred" (se l'invio è stato differito perchè nel frattemp Postfix non è stato in grado di recapitare perchè, ad esempio, il server di destinazione ha respinto la ricezione), nello stato "hold".
I messaggi in stato "hold" non vengono spediti, e neppure cancellati: l'invio viene semplicemente sospeso.
Per fare questo utilizziamo il comando "postsuper -h" seguito dall'indentificativo dell'invio
postsuper -h AC43A14B65
3: Estraggo il contenuto del messaggio
A questo punto, sospeso l'invio del messaggio, andiamo ad estraree il contenuto dello stesso, salvandolo in un file temporaneo con un nome a nostra scelta, ad esempio "invio.eml" ("eml" è l'estensione comune dei file email, apribile ad esempio con un client di posta come Thunberbird).
Utilizziamo il comando "postcat" per leggere il contenuto del messaggio, e salvarlo nel file temporaneo.
postcat -qbh AC43A14B65 > /tmp/invio.eml
4: Modifichiamo il destinario del messaggio
Adesso che abbiamo la nostre email "fisicamente" salvata, andiamo a reinviarla modificando il destinario, da "pippo@libero.it" a "pluto@libero.it"
sendmail -f sender@miosito.it pluto@libero.it < /tmp/m.eml
"sendmail" invia la email dal mittente "sender@miosito.it", che è il mittente originario (e non abbiamo bisogno di modificarlo), al nuovo destinario "pluto@libero.it"
Così facendo abbiamo inviato la email al nuovo indirizzo!
5: Cancelliamo il "vecchio" messaggio
Infine, non dimentichiamoci del messaggio messo in stato "hold"... resterà li all'infinito se non la cancelliamo.
Cancelliamolo, visto che adesso non ci serve più, con il comando "postuser -d" seguito dall'identificato dell'invio.
postsuper -d AC43A14B65
Bene, il nostro lavoro è così ultimato.