Debian server beheer

Procmail: mail filteren en doorsturen

Procmail is een handige manier om je mail te filteren en door te sturen. Met procmail kun je ook genadeloos je mail weggooien. Zorg dus dat je een backup van je mail maakt en/of test zorgvuldig je .procmailrc voor je 'live' gaat. Het is aan te raden na iedere aanpassing van .procmailrc opnieuw te testen.

Procmail installeren

Procmail installeer je met apt-get:

sudo apt-get install procmail

Vervolgens bewerk je het bestand /etc/procmailrc. Dit bestand bevat de default instellingen voor alle gebruikers:

nano /etc/procmailrc

Je kunt in procmailrc net zo veel of weinig instellingen zetten als je wilt, maar dit is de basis:

DROPPRIVS=YES ORGMAIL=$HOME/Maildir MAILDIR=$ORGMAIL DEFAULT=${HOME}/Maildir/new LOGFILE=${HOME}/procmail.log VERBOSE=off

DROPPRIVS zorgt er voor dat procmail verder werkt met de rechten van de gebruiker waarvoor de mail ontvangen wordt. ORGMAIL geeft aan waar de mail opgeslagen moet worden waarbij $HOME de thuismap is van de gebruiker waarvoor de mail binnenkomt. DEFAULT geeft aan waar nieuwe mail naar toe moet. LOGFILE is de locatie van het logbestand. De mappen moeten wel bestaan en overeenkomen met wat je elders instelt.

Met de optie VERBOSE=on schrijft procmail heel veel informatie naar de log en wordt die bijna onleesbaar. Mocht je grote problemen met procmail hebben dan kan het handig zijn tijdelijk "on" te gebruiken maar voor dagelijks gebruik is "off" veel handiger.

Zolang de gebruiker geen eigen instellingen maakt met een .procmailrc (zie hieronder) gelden de instellingen uit /etc/procmailrc.

.procmailrc

Om te beginnen moet je een eigen .procmailrc maken:

nano /home/[gebruikersnaam]/.procmailrc

Met een .procmailrc kan elke gebruiker eigen instellingen maken die voorrang krijgen boven de instellingen in /etc/procmail.

'Recipes'

Een setje regels in je .procmailrc wordt een 'recipe' of recept genoemd. Een recept begint altijd met :0. Daarna komt er een regel die begint met * en een voorwaarde aangeeft. Tenslotte volgen er één of meer acties op je mail.

Om te zoeken gebruikt procmail zogenaamde regular expressions. Kijk hier voor meer informatie en voorbeelden.

Blacklist

Als eerste voorbeeld een eenvoudige 'blacklist':

# deze meneer en mevrouw vind ik niet aardig :0 * ^From.*(onaardige.man@gmail.com|nare.vrouw@hotmail.com) /dev/null

Zoals je ziet gebruik je het # teken om commentaar in te voegen. De voorwaarde is hier "* ^From" en dat betekent "zoek een regel in de mail die begint met From. Vervolgens komt ".*" en dit betekent "gevolgd door een willekeurig aantal (*) willekeurige tekens (.)". Het derde deel is "onaardige.man@gmail.com|nare.vrouw@hotmail.com" en dat betekent "gevolgd door onaardige.man@gmail.com of nare.vrouw@hotmail.com". Je kunt hier dus meerdere adressen toevoegen gescheiden door |. Je kunt hier ook met wildcards werken, bijvoorbeeld ".*@domein.com" betekent "alle e-mailadressen die eindigen op @domein.com". Tenslotte volgt de actie en dat is in dit voorbeeld /dev/null. In linux is dat de grote, permanente vuilnisbak waar nooit meer iets uitkomt.

Als je iets minder zeker bent van je zaak ik het ook mogelijk om een reservekopie van een mail te maken:

:0 * ^From.*(ongewenste.persoon@gmail.com) { LOG="ongewenste persoon" :0 | gzip >> archief.gz }

Nieuw in dit voorbeeld het gebruik van { en }. Daarmee vertel je procmail dat er op deze voorwaarde merdere acties volgen. De eerste actie is een tekst aan het logfile toevoegen. Middels de tweede actie wordt de mail gezipt en toegevoegd aan archief.gz.

Whitelist

Als je gaat blacklisten of filteren is het verstandig ook een whiltelist te maken van e-mailadressen die altijd doorgelaten worden, ongeacht wat er in de berichten staat:

:0 * ^From.*(aardige.man@gmail.com|leuke.mevrouw@hotmail.com) { LOG="whitelist" :0 # stop in mijn mailbox ${MAILDIR}/new }

Het meeste van wat hier gebeurt herken je al. Zoeken op bepaalde afzenders, een regel toevoegen aan de logfile en tenslotte de mail bezorgen in de map 'new'. Je kunt je whilelist ook in een apart bestand opslaan, dat houdt je .procmailrc wat overzichtelijker. Maak een bestand met gewenste ontvangers, elke op een eigen regel en noem dat white.list. Belangrijk: let op dat er geen lege regels in je bestand staan, ook niet aan het eind. Een lege regel wordt gezien als een match met elk willekeurig e-mailadres. Het recept wordt dan:

:0 * ? formail -x"From" -x"From:" -x"Sender:" -x"Reply-To:" -x"Return-Path:" -x"To:" | egrep -is -f ${HOME}white.list ${MAILDIR}/new

Voor de helderheid heb ik hier de logfile e.d. even weggelaten.

Filteren op onderwerp

Op dezelfde manier kun je uiteraard ook filteren op onderwerp:

:0 * ^Subject.*(gokken|en en andere|onzin) { LOG="Ongewenste onderwerpen: " :0 | gzip >> archief.gz }

Hier ze je de onderwerpen die je niet wenst gescheiden door |. Een waarschuwing, zet niet per ongeluk || (dus twee balkjes) want dan wordt al je mail weggegooid.

Zoeken in de hele mail

Uiteraard kun je ook zoeken in de hele mail. Daarvoor gebruik je:

:0 * (ongewenst|ongewenster| meest ongewenst) /dev/null

Alle mail met de gezochte teksten er in wordt weggegooid.

En nog veel meer...

Procmail kan nog veel meer dan ik hier beschrijf. Zie bijvoorbeeld deze tips: