Configurare Procmail per filtrare le mailing list

In questo secondo articolo che illustra come configurare la posta elettronica sui propri sistemi, vedremo come gesitre le mailing list in modo molto flessibile, servendosi di opzioni usate raramente in procmail.

Una delle nostre esigenze è quella di creare dei filtri automatici che identifichino le mailing list e creino automaticamente delle cartelle separate.

Procmail è un filtro di posta che può essere usato per smistare le proprie email. Nasce nel 1990, in una università tedesca. Benché non sia amichevolissimo (va configurato con palettate di espressioni regolari) è stabile, molto ben integrato sotto Unix e capache di gestire la concorrenza.

La documentazione è frammentaria, anche se ci sono parecchi “HOWTO” e FAQ sparse per la rete. Il seguente progetto documenta alcune delle peculiarità di procmail, e vi darà utili consigli per cimentarvi nel suo uso.  Vediamo sinteticamente come procedere

  1. Per prima cosa, configurate la variabile LOGFILE che si usa per il log di procmail: questo vi consentirà di capire come ragiona procmail. Inoltre esiste uno script molto utile chiamato mailstat per estrarre statistiche sulle attività di procmail. Fa comodo monitarare procmail i primi tempi…
  2. Ponete particolare attenzione nel configurare l’ambiente di procmail: per es nel nostro sistema mancava nella variabile PATH la directory /bin, e molti comandi (inclusi ls, sed ecc) non venivano rilevati!
  3. Preparate una serie di email di test, per tutte le mailing list che volete processare. Noi vi suggeriamo le seguenti casistiche di mailing list provenienti da
    1. Mailman
    2. Yahoo Groups (ex eGroups)
    3. Google Groups
    4. MailChimp/MailUp e altri sistemai di email mass marketing.
  4. Come regola finale, utilizzatene una che vi consenta di avere una “rete di salvataggio”, per monitorare i messaggi persi o non correttamente trattati:
    :0 c
    backup                                                                          
    
    :0 ic
    | cd backup && rm -f dummy $(ls -t msg.* | sed -e 1,16d)

    Affinché funzioni si deve creare una cartella “backup” dentro la cartella che userte per memorizzare le email. Questo sistema memorizza in copia le ultime 16 email.

  5. Iniziate dal seguente script, che è stato sviluppato da noi
    LOGFILE=$HOME/procmail.log
    
    :0
    * ^(List-Id).*[<]\/[-a-zA-Z0-9]+
    {
      LISTNAME=${MATCH}
      :0
      * LISTNAME??^\/.*
      ml/${MATCH}
    }

    Tale script funziona bene con tutte le mailing list che definiscono un header List-Id significativo.

MailChimp

MailChimp è un software per gestire campagne e mailing list che non valorizza il List-Id. MailChimp identifica le sue campagne con header del tipo

X-Mailer: MailChimp Mailer - **CID756190e2c71198e72dc5**
X-Campaign: mailchimpa9e529017549b362edb553165.756190e2c7
X-campaignid: mailchimpa9e529017549b362edb553165.756190e2c7

List-Unsubscribe: <http://piddi.us1.list-manage.com/unsubscribe?u=a9e529017549b362edb553165&id=1800221b60&e=1198e72dc5&c=756190e2c7>

In mancanza di altre informazioni, possiamo creare una regola che si serva del campo List-Unsubscribe correttamenta identificato (in rosso), oppure dell’id esadecimale della lista (in blu). Per filtrare il campo indicato in rosso nell’esempio provate con:

# MailChimp
:0
* ^X-Campaign:.*mailchimp.*
* ^List-Unsubscribe: [<]http://\/[a-zA-Z]+
{
  LISTNAME=${MATCH}
  :0
  * LISTNAME??^\/.*
  ml/${MATCH}-mailchimp
}

Note Finali

Mailup, identifica le liste pubblicitarie in modo numerico. Vi suggeriamo di creare delle regole ad hoc per questo tipo di messaggi, altrimenti le regole viste sopra vi creeranno cartelle numeriche per le varie mailing list.

Infine, è importante avere anche statistiche di esecuzione. Segue un esempio di statistiche con mailstat:

mailstat -k procmail.log

Procmail è in grado anche di adattare il contenuto del messaggio ad esigenze di archiviazione spinte. Avete esigenze particolari? Per esempio volete rimuovere dal Soggetto della email il nome della mailing list, per… risparmiare spazio? Ecco un esempio tratto da Sial.org

:0
* members@example\.net
{
:0Wf
* ^Subject:[ ]+(Re:[ ]+)?\[Example-Members\] \/.+
|formail -I"Subject: $MATCH"

:0
lists/example-members
}