Mailfiltrering med procmail

Intro

Procmail är ett system för att behandla inkommande mail innan de når din mailklient. Poängen är att du kan göra en sortering på en rad olika vilkor och sedan behandla mailen på en rad olika sätt. Det som krävs är att systemet procmail är installerat på ditt unixsystem, och att du skapar en fil, sen är du igång. Procmail används ofta till att bekämpa spam, eller skicka in vissa mail till rätt mailfolder redan innan du läst dem. Fördelen med att behandla mailen innan de når din mailklient är att du kan göra på samma sätt, oavsett vilket mailprogram du använder.

Installera procmail

För att ta reda på om du har procmail på ditt system kör du fäljande kommando:

procmail -v

Om du har procmail på systemet ser du det med den gång, annars får du ett felmedeelande. Saknar du procmail på systemet har du fyra val:

Tyvärr är det inte möjligt för mig att gå igenom hur man installerar procmail här så jag låter bli det.

Sätta igång

För att använda procmail behöver du en fil som heter ~.procmailrc. Skapa den med din favorittexteditor, sen är ditt system igång. "rc" i .procmailrc betyder att filen laddas in i datorsysteemet i samma ögonblick du sparar den. Du behöver alltså inte starta om datorn eller vänta en stund eller nått innan systemet uppdaterar dina förändringar.

Nästa steg är att lägga till lite text i textfilen. Det första du behöver veta är att det finns två sorters information i din configfil. Den ena sortens är allmän information om procmail. Den andra delen är regler för hur mail skall hanteras. Av tekniska skäl lägger man informationen i två delar, där den första sorten hamnar överst. Nu skall jag gå igenom min .procmailfil, det är det enklaste sättet att fatta hur man gör.

#Filles atempt to get rid of some spam.

##
#Globals
##

Inga överaskningar här. Allt som börjar med # är kommentarer som ignoreras av procmail, du kan skriva vad som helst här. Rubriken "Globals" talar om att här kommer ett block med allmäna (globala) regler för procmail
#Shell enviornment
SHELL=/bin/bash
Det första du vill tala om för procmail är vilket skal du sitter i. Vet du inte det skriver du
echo $SHELL
i din terminal, så får du reda på det.
#Mail Directory. Yeah.
MAILDIR=$HOME/Maildir
Därefter behöver procmail veta vilket maildirectory du har. Detta för att veta var dina mail hamnar. I mitt fall heter det ~/Maildir. Du får fråga din sysadmin om du inte vet själv eller har tillgång till informationen.

Observera också att jag skrev '$HOME' och inte '~'. '$HOME' är det samma som '/home/kalle' eller vad din användare heter. Av tekniska skäl så skriver du alltid så när du anger sökvägar i .procmailrc. Det finns nån god anledning till det som jag inte kommer ihåg just nu.

#Procmaildir
PMDIR=$HOME/.procmail
Du vill eventuellt ha en katalog avsedd just för procmail. Då skapar du den med 'mkdir' och lägger till denna rad. Det är inte så viktigt vad du kallar variabeln, bara du är konsekvent med att använda samma namn hela tiden sen. Behöver du inte en speciell katalog för ditt procmailsystem kan du hoppa över detta steget.
#Logfile. Shift to alt 1 when debugging stuff
#LOGFILE=$PMDIR/pmlog
LOGFILE=/dev/null
Nu skapar vi en loggfil. Saker som händer loggas och vill du läsa det så får du spara loggarna någon stanns. Här finns två rader som börjar på LOGFILE, detta kräver en viss förklaring:
Jag har två olika alternativ jag växlar mellan. När jag vill spara loggarna kommenterar jag bort raden 'LOGFILE=/dev/null' och tar bort '#'-tecknet från raden '#LOGFILE=$PMDIR/pmlog'. Då sparas loggarna i en fil som heter ~.procmail/pmlog. Här ser man även ett skäl till att använda en katalog för procmail, samt hur du använder variabeln du skapade för ändamålet.

Om jag inte vill spara mina loggar skickar jag dem i stället till /dev/null. /dev/null kan man säga är en fil som finns på alla UNIX-system, och alltid är tom, hur mycket man än skriver till den. Genom att skica data dit raderas de. Och då jag inte vill spara mina loggar så skriver jag dem lämpligen dit.

Anledningen till att spara loggar är huvudsakligen om man gör en ändring i sin .procmailrc och vill veta hur det fungerade.

#A blank line between every message in the log file
LOG="
"
Den här raden är nog ganska självförklarande.
# Set VERBOSE to yes when debugging; VERBOSE default is no
## VERBOSE=yes
Den här raden används bara om jag vill slå på verbose-mode, och det vill jag inte. Men när jag vill det tar jag bort "rutan". Och med detta är vi klara med den tråkiga delen. Nå ska vi börja radera spam.
##
#Recipes
##

"Recipes" kallar man de instruktioner som tar hand om dina mail. Därför markerar jag att den avdelningen har börjat nu med dessa rader.

Filtrering i procmail sker i serie. Det innebär att varje mail jämförs med de olika recipesen en i taget. När en träff sker behandlas mailet i enlighet med instruktionen. Därefter lämnas mailet åt sitt öde och kontrolleras inte mot de övriga filtren. Därför behöver du tänka så att du placerar dem i rätt ordning. Varje recipe utför exakt en åtgärd per mail, men det går att gå runt det.

# Put everything to *@fukt.bth.se in the junk basket
:0:
* ^(To).*@fukt.bth.se
/dev/null

Här kommer min första regel. Låt mig börja med att förklara vad jag vill:
På datorföreningen fukt i vilken jag är medlem fick vi en ny domän. Den gamla fungerar fortfarande, så jag får mail till både den gamla och den nya. (Det som ändrats är att 'bth' bytts ut mot 'bsnet'). Nu har jag fått alla att sluta skicka mail till 'bth' och istället mailar de mig via 'bsnet'. Det är bara spammare som inte fattat ändringen. Genom att slänga alla mail till adresser som har något med 'fukt.bth.se' i sig slipper jag alltså en massa spam.

':0:' är ett obligatoriskt intro till varje recipe. Tecknena gör något men jag behöver inte veta vad just nu, så jag har inte skrivit upp det. Men börja varje recipe på det sättet, såvida du inte vet att du skall göra annorlunda.

'* ^(To).*@fukt.bth.se' är den första delen i regeln. Du börjar med en stjärna (*) vilket betyder att detta är vilkoret. Det som följer nu är vad procmail skall leta efter. '^(To).' betyder helt enkelt "leta i mottagaradressen". Slutligen kommer '*@fukt.bth.se' vilket betyder "alla adresser som slutar på @fukt.bth.se". Nu vet procmail att den skall leta efter alla mail till mig som är adresserade till något som slutar med '@fukt.bth.se'.

'/dev/null' är receptets åtgärd. I det här fallet mycket enkel: "Spara mailet i filen /dev/null". Ett annat sätt att säga "släng skiten".

#Discard mails with certain words in Subject

:0:
* ^Subject:.*(cialis)
#/dev/null
$PMDIR/junk
Nu går jag vidare och slänger mail som innehåller vissa utvalda ord. Spam som slinker igenom (för att de är adresserade till rätt adress) kan ju också slängas. I det här fallet sorterar jag på raden som börjar på 'Subject:' och innehåller ordet 'cialis' eftersom det förekommer ibland i spam jag får.

Egentligen vill jag slänga de mailen (/dev/null) men i stället skickar jag dem till en katalog i min PMDIR som heter 'junk'. De mailen kontrollerar jag, och när jag kommit fram till att min spamregel fungerar ändrar jag om till att slänga mailen i /dev/null i stället.

Lära sig mer

Detta är en introduktion till hur man filtrerar mail med procmail. Det var aldrig tänkt att bli en komplett dokumentation, utan ett prov på vad du kan göra. En bra länk att följa till en bättre dokumentation (som mer utförligt förklarar en del saker jag gjort här, och ger fler tips och ideer) är den som går till denna HOWTO.

Upp en nivå