Procmail

Från Unix.se, den fria unixresursen.

Procmail är ett program som tar emot e-post från en MTA (Mail Transport Agent), t.ex. sendmail, postfix eller dylik, och sedan, baserat på en eller flera regler, filtrerar denna så att den hamnar i förbestämda brevlådor. Procmail skrevs ursprungligen av Stephen van den Berg, men tas numera hand om av Philip Guenther.

En vanlig konfiguration är att låta fetchmail ladda ner e-posten från en icke-lokal server (t.ex. ens ISP:s POP-server) och sedan skicka den vidare med exempelvis postfix, som i sin tur skickar den till rätt användare på systemet. Därefter filtreras posten med procmail, och läggs till i användarens brevlådor. Användarna kan sedan läsa den i lämplig klient.

Innehåll

Varför använda Procmail?

Om du använder grafiska epostklienter som KMail eller Sylpheed finns det ingen egentlig anledning att använda Procmail, då dessa ofta har avancerade filtreringsregler inbyggda. Om du däremot fjärransluter till datorn med SSH eller helt enkelt föredrar textlägesprogram kan Procmail och en textlägesklient som Mutt vara en bra kombination.

En annan mycket stor fördel är att du kan använda procmail i anslutning i postfix för att scanna inkommande e-mail om du kör en egen mailserver. På så sätt kan virusscanning och spamskydd ske direkt när du tar emot meddelanden.

Installation och konfiguration

För att komma igång (hämta hem filen från Procmails hemsida (http://www.procmail.org) och kompilera på vanligt vis) behöver du, till att börja med, en väldigt enkel fil i din $HOME som heter och ser ut som följande:

$ cat .forward
| /usr/bin/procmail

Den här filen ser till att all post som hämtas åt dig pipe:as till procmail. (/usr/bin/procmail ska vara den fulla sökvägen till procmail-binären, och kan vara annorlunda på ditt system.)

Nu har du gjort hälften av alla konfigurationsfiler som behövs för att procmail ska fungera! Men det är nästa konfigurationsfil, ~/.procmailrc, som innehåller alla regler för hur posten ska filtreras, och är även den som är aningen jobbigare att sätta upp.

Starta upp din favoriteditor och öppna ~/.procmailrc. I början av filen bör du ställa in några variabler att peka på din mail-låda och annat. Här är ett exempel på hur det kan se ut:

$ head -3 .procmailrc
MAILDIR=$HOME/Mail             # den här måste existera
DEFAULT=$MAILDIR/IN.received   # valbart
LOGFILE=$MAILDIR/procmail.log  # rekommenderat

DEFAULT beskriver var e-post som inte matchar någon regel ska hamna; man kan säga att det är din "inbox". MAILDIR är, som du säkert har klurat ut vid det här laget, sökvägen till katalogen där alla brevlådor ligger. LOGFILE är En Bra Sak - det är nästan alltid trevligt att föra logfiler.

Procmail använder sig av reguljära uttryck (eng. "regular expressions") som är ett mycket kraftfullt sätt att matcha strängar. I ditt skal kan du matcha alla filer vars namn börjar på bokstaven "a" och slutar med ändelsen ".txt" med "a*.txt". Med ett reguljärt uttryck skulle detta se ut så här: "^a.*.txt$".

Fillåsning

I Unix och andra operativsystem med multitasking-möjligheter kan flera processer köra samtidigt. Det innebär att flera epostmeddelanden kan komma att tas hand om samtidigt. Därför kan du, om två procmail-processer försöker skriva varsitt meddelande till samma fil, stöta på stora problem. I värsta fall kan du inte läsa din epost efteråt.

Av just den här anledningen kan det vara bra att känna till något som kallas fillåsning (eng. "file locking")!

Använd fillåsning när du ska skicka meddelanden till en fil. Det är förstås dock inte nödvändigt att använda fillåsning vid skickning av meddelanden till /dev/null. Dessutom kanske du inte har rättigheter att låsa enheter (eng. "devices"). Vidare ska du inte använda fillåsning när du vidarebefordrar ett meddelande till en annan address, eller när du pipe:ar meddelandet till ett program. Om du någonstans skriver till en fil måste denna dock såklart låsas. Annars uppstår samma problem som när du skriver direkt till en fil med procmail.

Exempelkonfigurationer

Det finns inget bättre sätt att lära sig procmail än att studera exempel.

# Exempel 1
:0: # skriv till en fil och låt
# procmail ta hand om fillåsningen automatiskt
* ^From kalle@persson.se
IN.kalle_persson

Regeln i exempel 1 är troligen den du kommer använda mest om du, likt mig, får epost från många epostlistor. Regeln säger helt enkelt till procmail att leta efter "kalle@persson.se" i ämnesraden. Om brevet i fråga matchar regeln skickas det till IN.kalle_persson (som för övrigt bara är en textfil i mailbox-format).

# Exempel 2
:0 # skicka mailet vidare- ingen låsning behövs
* ^To:.*malte@unix.se
! malte@annansida.com

Exempel 2 innehåller inte heller något särskilt avancerat; meddelanden som matchar "malte@unix.se" någonstans i To-raden skickas vidare till maltes andra epostadress som är malte@annandoman.com.

# Exempel 3
:0:IN.censurerat.lock # IN.censuerat.lock är låsfilens namn
* ^Subject:.*fsck|.*pfft|.*fna
| $HOME/bin/ta_bort_svordomar.pl >>IN.censurerat

I exempel 3 används ett externt Perl-program, ta_bort_svordomar.pl, som (är det tänkt i alla fall) tar bort alla svordomar från brevet. Som du ser måste filen i fråga först låsas; det gör man genom att ange :0:IN.censurerat.lock i början av filen. Detta är nödvändigt eftersom man petar i IN.censurerat-brevlådan och inte kan vara säker på att något annat händer med filen just när den ska skrivas till. Du märkte kanske också att konditionssatsen innehåller "|" för att avskilja strängar som ska letas efter. På det här sättet är det möjligt att se om orden "fsck" eller "pfft" eller "fna" finns någonstans i ämnesraden.

# Exempel 4 
:0 # /dev/null behöver ingen låsning
* ^Subject:.*reklam
/dev/null

Eftersom exempel 4 helt enkelt anger /dev/null som brevlåda behöver du inte (och kan antagligen inte heller) använda låsning.

# Exempel 5
:0 # Använd inte fillåsning
* ^From.*anders@unix.se
* ^Subject:.*programmering
{
:0c
! kuba@unix.se 
:0:
IN.programmeringsfrågor
}

Det sista exemplet, nummer 5, är troligen det enda lite mer avancerade. Först och främst har klamrar använts för att visa att de båda operationerna hör till samma villkor. Och det är två villkor! Som du ser går detta utmärkt. Det andra nya här är bokstaven "c" som har lagts till efter ":0". Detta innebär att procmail inte ska ta bort brevet från servern än eftersom det tror att vi inte vill göra något mer med det. Den sista metoden ska däremot ta bort brevet från servern eftersom vi inte vill göra något annat med det.

Med hjälp av dessa exempel borde du nu kunna sätta ihop en egen .procmailrc utan större svårigheter. För vidare läsning rekommenderas manualsidorna för procmailex(5) och procmail(1).

Se även


Externa Länkar

Personliga verktyg