Startsida för Proton

Sieve-filter (avancerade anpassade filter)

Lästid
40 min
Kategori
Ta emot och läsa e-postmeddelanden

Proton Mail erbjuder användare olika sätt att automatiskt filtrera e-postmeddelanden genom att tilldela etiketter eller sortera dem i mappar. Allmänt sett finns det tre metoder:

  1. Lägga till avsändare i blockeringslistan och tillåtna listor så att de alltid eller aldrig hamnar i skräppostmappen;
  2. Skapa ett anpassat filter med hjälp av Proton Mails interaktiva gränssnitt;
  3. [Mest avancerat] Skapa ett anpassat filter i Sieve.

Av dessa metoder erbjuder skapandet av ett anpassat filter i Sieve den största mångsidigheten, men det är också mer komplicerat att använda. Av denna anledning betraktar vi Sieve som en avancerad funktion för användare med viss teknisk erfarenhet. För de flesta användare är det interaktiva gränssnittet lämpligt för att bygga de anpassade filter du behöver.

Innehållsförteckning

Vad är Sieve?

Sieve är ett programmeringsspråk som används för att filtrera e-postmeddelanden. Du kan skapa filter i Sieve genom att skriva enkla regler. Till exempel, ”Ge alla meddelanden från Kyle den gröna etiketten”. Att kombinera dessa regler kan skapa ett sofistikerat filtreringssystem.

Du kan skriva Sieve-regler från grunden, låna dem från exempel som de i den här artikeln eller använda mjukvara som gör det enklare.

Faktum är att vi redan erbjuder dig ett sätt att skapa Sieve-filter med hjälp av det interaktiva gränssnittet, vilket använder din indata för att generera Sieve-filter. Ett annat bra sätt att lära sig Sieve är att skapa filter med det interaktiva gränssnittet och redigera filtren i Sieve, eftersom det interaktiva gränssnittet självt använder en delmängd av Sieve.

Jämför till exempel följande filter som skapats med det interaktiva gränssnittet…


… med koden för samma filter som visas i Sieve-redigeraren:

Den här artikeln kommer att introducera dig till Sieve och förklara hur du skriver dina egna Sieve-filter. Om du behöver mer information om hur du använder Sieve finns det många andra handledningar online som kan hjälpa dig. Om du har frågor om Sieve i Proton Mail som inte besvaras på den här sidan kan du alltid kontakta vårt supportteam här.

Komma igång

För att börja skapa Sieve-filter loggar du in på mail.proton.me(nytt fönster) och går till Inställningar → Alla inställningar → Proton Mail → Filter → Lägg till Sieve-filter.

Ett Sieve-skript består av en lista med kommandon. I de flesta skript börjar det med ett require-kommando. Kommandot require läser in ett tillägg som tillhandahåller en viss funktionalitet. Till exempel behöver vi kommandot fileinto för att tilldela en etikett eller lägga ett meddelande i en mapp.

För att läsa in det här kommandot skriver vi helt enkelt:

require "fileinto";

För att läsa in flera tillägg kan du använda en lista:

require ["fileinto", "imap4flags"];

I det här fallet läser imap4flags in ett tillägg som gör att du kan markera e-post som läst. Efter kommandot require kommer du ofta att utföra några tester på det inkommande meddelandet. Detta görs genom att kombinera if och ett annat kommando som address eller header.

Slutligen, om testerna lyckas kan du tillämpa en åtgärd på ett meddelande. Anta till exempel att vi vill lägga alla e-postmeddelanden från en viss avsändare i samma mapp och markera det inkommande meddelandet som läst. Det kan skrivas så här:

require ["fileinto", "imap4flags"];
# I don't really like Spott
if address :is "from" "Spott.Tenerman@northpark.example.com"
{ 
    addflag "\\Seen";
    fileinto "enemies";
}

Observera att tecknet # indikerar en kommentar och inte tolkas som en del av Sieve-skriptet. Dessutom måste mappen eller etiketten du anger (här enemies) finnas i din miljö: du kan lära dig att skapa mappar och etiketter här. När du har angett detta filter klickar du på SPARA-knappen. Ditt filter kommer nu att köras för varje inkommande e-postmeddelande.

Naturligtvis kanske du vill lägga e-postmeddelanden från flera avsändare i samma mapp. I det här fallet kan du skicka en lista med strängar till adresskommandot (en sträng(nytt fönster) är en serie tecken, i det här fallet en e-postadress):

require ["fileinto", "imap4flags"];
# I don't really like Spott and Kyyyhel
if address :is "from" ["Spott.Tenerman@northpark.example.com", "Kyhel.Broski@northpark.example.com"]
{ 
    addflag "\\Seen";
    fileinto "enemies";
}

Observera att när du kan skicka en sträng till ett testvillkor är det vanligtvis också möjligt att skicka en lista. Det kommer då att försöka hitta en matchning genom att testa någon av strängarna i listan. Detta gäller inte för kommandon som fileinto, addflag etc.

Men Sieve är mer kraftfullt än att bara sortera om din brevlåda. Det låter dig också avvisa e-postmeddelanden med ett svarsmeddelande:

require "reject";
# Reject mails that spell my name wrong
if header :contains "subject" "Kyhel"
{
    reject "My name is not Kyhel";
}

Använda tester

Kombinera tester i Sieve

Som vi visade dig i avsnittet Komma igång, kan du utföra tester med hjälp av if-kommandot på inkommande meddelanden för att avgöra om ett e-postmeddelande ska påverkas av ett require-kommando.

Utöver if-kommandot finns det andra testkommandon som gör att du kan strukturera ditt skript på ett enkelt sätt.

Else

Kommandot else låter dig göra något när if-kommandot inte utförde sina åtgärder. Ett exempel på detta är:

require ["fileinto"];
# If the subject contains something incomprehensible, then put the mail into the kenny folder
if header :contains "subject" "mmph mmph"
{
    fileinto "Kenny";
} else { 
    fileinto "Understandable";
}

Här kommer e-postmeddelandet att flyttas till mappen Kenny om ämnet är exakt mmph mmph. I det andra fallet (det vill säga när ämnet inte är exakt mmph mmph) flyttas e-postmeddelandet till mappen Understandable.

Elsif

elsif är en sammandragning av else if. Precis som kommandot else kommer det att utföras om if-villkoret är felaktigt, men endast om elsif-villkoret är korrekt. Om elsif inte är korrekt kommer nästa elsif– eller else-block att utföras.

require ["fileinto", "imap4flags"];
# If the subject contains something incomprehensible, then put the mail into the kenny folder
if header :contains "subject" "mmph mmph"
{
    fileinto "Kenny";
# Kyhel sends me only speeches
} elsif address :is "from" "Kyhel.Broski@northpark.example.com" { 
    fileinto "Speeches";
} else { 
# otherwise the mail is important, so add a star.
    addflag "\\Flagged";
}

Observera att endast ett av blocken if, elsif eller else kommer att utföras under en enda körning.

Anyof

Ibland behöver du köra ett kommando när ett av flera tester lyckas. För detta kan du använda kommandot anyof. Detta görs genom att skriva anyof följt av en startparentes ’(’, de påståenden du vill testa separerade med kommatecken, och en slutparentes ’)’.

require ["fileinto", "imap4flags"];
# Kenny either sends from kenny@northpark.example.com or puts "mmph mmph" in the subject.
   if anyof(address :is "from" "kenny@northpark.example.com", header :contains "subject" "mmph mmph")
{
    fileinto "Kenny";
}

Detta skript placerar meddelanden som kommer från kenny@northpark.example.com eller innehåller mmph mmph i ämnesraden i mappen Kenny.

Allof

Motsvarigheten till anyof finns också: allof. Detta gör att du kan köra ett kommando endast när alla angivna villkor matchar:

require ["fileinto", "imap4flags"];
# Kenny always sends me mails with mmph mmph
if allof(address :is "from" "Kenny@northpark.example.com", header :contains "subject" "mmph mmph")
{
    fileinto "Kenny";
}


Detta skript placerar meddelanden som kommer från kenny@northpark.example.com och innehåller mmph mmph i ämnesraden i mappen Kenny.

Inte

Slutligen behöver du ibland tillämpa ett kommando om något inte matchar. Om du lägger till not framför påståendet ser det till att detta sker:

require ["fileinto", "imap4flags"];
# If a subject line does not contain real guitar put it into the young people folder
if not header :contains "subject" "real guitar"
{
    fileinto "Young people";
}

Vilket motsvarar:

require ["fileinto", "imap4flags"];
# The else part will be evaluated if the condition is not true
if header :contains "subject" "real guitar"
{
    # do nothing
} else {
    fileinto "Young people";
}

Detta placerar alla e-postmeddelanden som inte innehåller real guitar i ämnesraden i mappen Young people.

Det är naturligtvis möjligt att kombinera alla dessa tester. Du kanske till exempel vill stjärnmärka ett e-postmeddelande om det både inte är från Kenny och inte innehåller mmph mmph i ämnet:

require ["fileinto", "imap4flags"];
if not anyof (    header :contains "subject" "mmph mmph", 
    address :is "from" "Kyhel.Broski@northpark.example.com" ) { 
    addflag "\\Flagged";
}

Utföra tester på rubriker

Med kommandot address kan du utföra tester på adressrubriker, såsom rubrikerna from, to och sender. Du kan extrahera olika delar av e-postadressen genom att använda en av följande flaggor:

  • :localpart — delen före snabel-a-tecknet (@)
  • :domain — delen efter snabel-a-tecknet (@)
  • :all — hela adressen

Följande kodavsnitt förklarar hur detta kommando används:

require ["fileinto", "imap4flags"];
# Northpark people are made of paper, springfield are mostly yellow
if address :domain "from" "northpark.example.com"
{
    fileinto "PaperPeople";
} elsif address :domain "from" "springfield.example.com"{
    fileinto "YellowPeople";
}
if address :localpart "from" "chef"
{
    addflag "\\Flagged";
}

Sammanfattningsvis kommer detta skript att placera allt som skickas från domänen northpark.example.com i PaperPeople och springfield.example.com i YellowPeople.

Dessutom, oavsett vilken domän ett e-postmeddelande skickas från, om delen före @ är lika med chef (t.ex. chef@example.com), kommer meddelandet att flaggas. Ett annat intressant användningsområde är att automatiskt lagra allt som skickas till en viss adress i en mapp:

require ["fileinto", "imap4flags"];
# Put support mail in a separate organized folder
if address :localpart "to" "support"
{
    fileinto "Support";
}

Avancerat

Kommandot envelope låter dig utföra fler tester. I allmänhet hämtar testet address endast värdet från rubriken. Men i SMTP-sessionen kan man ange en annan from-adress än den som finns i rubriken.

I Proton Mails rubrikgränssnitt är envelope-from lika med rubriken return-path och envelope-to är lika med rubriken x-original-to.

Med kommandot envelope kan du hämta de faktiska to:– och from:-adresserna från kuvertet (envelope). Observera att inga andra fält än dessa två finns, så sender finns inte i detta kommando. Observera också att envelope ingår i ett tillägg och därför kräver att du först lägger till require för detta tillägg.

require ["fileinto", "imap4flags", "envelope"];
# Northpark people are made of paper, springfield are mostly purple
if envelope :domain "from" "northpark.example.com"
{
    fileinto "PaperPeople";
} elsif envelope :domain "from" "springfield.example.com"{
    fileinto "PurplePeople";
}
if envelope :localpart "from" "chef"
{
    addflag "\\Flagged";
}

Använda jämförelseoperatorer för att utvärdera två värden

När ett test utvärderar två värden är det möjligt att ange hur denna jämförelse görs med hjälp av olika flaggor som kallas jämförelseoperatorer. Tidigare har vi redan använt två jämförelseoperatorer: :is och :contains, som kontrollerar att den givna strängen är exakt lika med det specifika värdet, och tillika att det specifika värdet innehåller den givna strängen, som i följande test.

require ["fileinto", "imap4flags"];
if not anyof (
    header :contains "subject" "mmph mmph", # the subject contains mmph mmph 
    address :is "from" "Kyhel.Broski@northpark.example.com" # the recipient is exactly Kyhel.Broski@northpark.example.com
) { 
    addflag "\\Flagged";
}

Jämförelseoperatorn :matches kan också användas för att definiera ett mer specifikt format. Den jämför båda värdena från början till slut, precis som jämförelseoperatorn :is. Men i fallet med :matches kan värdet du definierade innehålla värdena ? och *. Frågetecknet matchar ett tecken, och stjärnan (kallad jokertecken) matchar noll eller flera tecken.

Med detta format kan du skapa detta test:

require ["fileinto", "imap4flags"];
if header :matches "subject" "mmph*" { 
    addflag "\\Flagged";
}

I detta exempel kommer testet att lyckas om meddelandets ämne börjar med mmph och sedan innehåller valfritt tecken eller tecken efter det. Med andra ord kommer e-postmeddelandet att flaggas när ämnet börjar med ”mmph”. ”mmph mmph” och ”mmph mmph Hello” kommer båda att matcha; ”Hello mmph” och ”Springfield sales” kommer inte att göra det.

Stjärnan kan också användas i mitten av värdet och flera gånger, enligt följande:

require ["fileinto", "imap4flags"];
if header :matches "subject" "mmph *mmph *mmph" { 
    addflag "\\Flagged";
}

Detta test matchar om ämnet börjar med ”mmph ” (med ett mellanslag), innehåller ett till ”mmph ” (med ett mellanslag) och slutar med ”mmph” (utan mellanslag). Matchande ämnen är ”mmph mmph mmph”, ”mmph mmph mmphmmph” eller ”mmph is mmph and mmph”.

Denna :matches-jämförelseoperator kan vara mycket användbar vid adressjämförelser. Som du kanske vet har Proton Mail flera domäner: protonmail.com och proton.me. Om du vill kontrollera om ett meddelande kommer från en Proton Mail-användare kan du använda detta skript:

require ["fileinto", "imap4flags"];
# Put support mail in a separate organized folder
if address :domain :matches "from" "protonmail.*"
{
    fileinto "Internal";
}

Om du av någon anledning behöver matcha exakt tecknet * eller ? kan du citera dem genom att lägga till \\ före: \\* matchar en stjärna och \\? matchar ett frågetecken.

Observera att vi även stöder regex-tillägget, som också definierar jämförelseoperatorn :regex. Denna jämförelseoperator är en mer exakt version av :matches, men är mycket komplex. För mer information, läs den officiella dokumentationen(nytt fönster).

I vissa fall (som du kommer att se i fortsättningen av denna artikel) kan du vilja jämföra numeriska värden. Paketet relational är skapat för detta ändamål. Detta paket definierar jämförelseoperatorn :value som följs av jämförelsetypen.

Det låter dig kontrollera om ett värde är större än (där jämförelsetypen är “gt”), större än eller lika med (“ge”), lika med (“eq”), mindre än eller lika med (“le”) eller mindre än (“lt”) det givna värdet.

Vid jämförelse av numeriska värden är paketet comparator-i;ascii-numeric också mycket användbart. Det talar om för skripttolken att strängens innehåll är ett tal, och inte en vanlig sträng. Det kan användas genom att lägga till :comparator “i;ascii-numeric” till testet.

Med all denna information kan vi bygga följande skript:

require ["fileinto", "relational", "comparator-i;ascii-numeric"];  
if header :value "ge" :comparator "i;ascii-numeric" "subject" "2"   
{    
 fileinto "Dummy example";
}

Detta test flyttar meddelandet till mappen Dummy example om ämnet är större än eller lika med 2. Om ämnet inte är ett tal, utan text, kommer testet att misslyckas. Som sådant ser detta exempel väldigt dumt ut, men det är avsett att användas i kombination med andra tillägg som date, vilket vi kommer att definiera senare i den här artikeln.

Jämförelse med hjälp av kontext i Sieve

Du kan också få åtkomst till information som rör ditt konto och Proton Mail-kontext i allmänhet med hjälp av tillägg. Du kan till exempel kontrollera om avsändaradressen finns i din kontaktlista.

Få åtkomst till din kontaktlista

Du kan få åtkomst till din kontaktlista med hjälp av tillägget extlists. Kombinerat med rubriktester kan du sedan kontrollera om en kontakt finns i din kontaktlista.

require ["fileinto", "extlists"];  
# Checks that the sender is in your personal address book
if header :list "from" ":addrbook:personal?label=Family"   
{    
 fileinto "Known"; 
}

Detta test flaggar ett meddelande med etiketten Known om avsändaren finns i listan :addrbook:personal?label=Family. Listan kan delas in i två delar. För det första betyder :addrbook:personal att adressen finns i din personliga adressbok. För det andra snävar label=Family in listan ytterligare genom att ange att kontakten, förutom att finnas i din adressbok, även måste tillhöra kontaktgruppen Family. Om du behöver kan du ändra denna etikett till en annan kontaktgrupp. Du kan använda :addrbook:personal?label=Work om du vill, och i så fall skulle testet endast lyckas om avsändaren finns i din adressbok och i kontaktgruppen Work.

Mer allmänt följer en lista Tag-URI-schemat(nytt fönster), och du kan lägga till extra parametrar för att begränsa dina filter. Sedan kan du använda denna lista enligt följande:

require ["fileinto", "extlists"];  
# replace :your:list:here by the list you want to use
if header :list "from" ":your:list:here"
{    
 # some actions... 
}

Vi har tillhandahållit fyra olika listor:

  • :addrbook:personal¹ kontrollerar om en adress finns i din kontaktlista. Listan accepterar parametern label som matchar en specifik kontaktgrupp. Denna parameter kan böjas i fyra underversioner:
    • :addrbook:personal?label=something matchar en kontakt som finns i kontaktgruppen ”something”;
    • :addrbook:personal?label.starts-with=something matchar en kontakt som tillhör minst en grupp som börjar med ”something”;
    • :addrbook:personal?label.ends-with=something matchar en kontakt som tillhör minst en grupp som slutar med ”something”;
    • :addrbook:personal?label.contains=something matchar en kontakt som tillhör minst en grupp som innehåller ”something”.

Du kan också få åtkomst till kryptografisk information om det matchande e-postmeddelandet:

  • :addrbook:personal?keypinning=true matchar en kontakt som har en betrodd nyckel. Om du ändrar true till false matchas en kontakt som inte har någon betrodd nyckel;
  • :addrbook:personal?encryption=true matchar en kontakt för vilken kryptering är aktiverad. Om du ändrar true till false matchas en kontakt för vilken kryptering inte är konfigurerad eller är inaktiverad;
  • :addrbook:personal?signing=true matchar en kontakt för vilken signering är aktiverad. Att ändra true till false matchar en kontakt för vilken signering är inaktiverad.
  • :addrbook:myself¹ matchar varje adress som ägs av dig själv;
  • :addrbook:organization matchar varje adress som ägs av någon i den organisation du är medlem i;
  • :incomingdefaults:inbox kontrollerar om adressen finns i din tillåtlista;
  • :incomingdefaults:spam kontrollerar om adressen finns i din blockeringslista.

I kombination med variabeltillägget (som beskrivs i nästa stycke) kommer matchningsvariablerna att ändras. Matchningsvariabeln ${0} kommer alltid att innehålla den senaste e-postadressen i den angivna listan. Om listan markerades med anmärkning 1 kommer matchningsvariabeln ${1} att innehålla visningsnamnet.

Med listorna nedan kan du till exempel skapa ett filter som tar bort alla e-postmeddelanden som tas emot från någon annan än din familj eller någon på din vitlista:

require "extlists";  
# checks that the sender is not in the contact group Family, whilelisted or yourself
if not anyof(
    header :list "from" ":addrbook:personal?label=Family", 
    header :list "from" ":incomingdefaults:inbox",
    header :list "from" ":addrbook:myself"
) {    
  discard; # permanently delete the email
}

Om det villkoret uppfylls kommer åtgärden discard att utföras. Denna åtgärd tar bort e-postmeddelandet omedelbart och permanent. Du kan också helt enkelt flytta det till papperskorgen med en fileinto -åtgärd i stället för discard: fileinto \”trash\”;.

Skapa variabler

Ett annat användbart verktyg vid hantering av kontext är definitionen av en variabel. En variabel är en tillfällig lagringsplats där du kan placera text och märka den med ett namn. Senare kan du återanvända detta innehåll genom att anropa det med dess namn. Du skulle till exempel kunna ha följande skript:

require ["reject", "variables"];
# First check who is the sender
if allof(
    address :is "from" "Kenny@northpark.example.com", 
    header :contains "subject" "mmph mmph"
) {
    # It's from Kenny!
    # Create the variable message containing 'mmph mmph'
    set "message" "mmph mmph";
} else {
    # Create the variable message containing 'Sorry, I don't want emails today!'
    set "message" "Sorry, I don't want emails today!";
}
# Then, reject the message
reject "${message}";

Syftet med detta skript är att avvisa ett e-postmeddelande med ett anpassat meddelande. Om det ursprungliga e-postmeddelandet är från kenny och dess ämne är ”mmph mmph”, skapas variabeln ”message”, som innehåller mmph mmph. I annat fall fylls meddelandet i med ”Sorry, I don’t want emails today!”. Sedan, i det sista steget, återanvänder vi denna variabel i kommandot reject.

Sieve definierar inte variabler inbyggt, så de definieras i tillägget variables, vilket måste krävas i början av ditt skript. Det finns två sätt att definiera en variabel.

  • Explicit skapande av en variabel:

Åtgärden set tillhandahålls för att skapa en variabel.

require "variables";
# Create a variable called "labelname" and containing the string "Work".
set "labelname" "Work";

Den första strängen är namnet på din variabel och den andra är värdet på din variabel. Så det föregående exemplet skapar en variabel som heter labelname och som innehåller Work.

När en variabel väl har definierats kan du anropa den genom att lägga till följande format i en sträng: ${name}, där name är namnet på din variabel. När den körs kommer den att ersättas av variabelns värde. (Om du inte har definierat variabeln kommer den att ersättas med en tom sträng.) Sålunda, i följande skript:

require "variables";
require "fileinto";
# Create a variable called "labelname" and containing the string "Work".
set "labelname" "Work";
# Move the email in "${foldername}/${labelname}" which becomes after variable resolution "/Work";
fileinto "${foldername}/${labelname}";

Din e-post kommer att taggas med etiketten /Work. Eftersom vi redan har definierat variabeln labelname ersätts den således med Work. Men foldername är inte definierad, så den tas helt enkelt bort.

  • Implicit tilldelning av en variabel:

Det mest intressanta användningsområdet för variabler är när man använder ett :matches-test. Låt oss ta följande exempel, där e-postavsändaren är test@proton.me:

require "variables";
require "fileinto";
# do a matches test 
if header :matches "from" "*@*" {
    # The first * matches "test", the second "protonmail".  
    # Thus, the first matching variable contains "test"
    fileinto "${1}";
}

När det används med variabeltillägget sparas resultatet av en match-operation i variablerna. Flera variabler tilldelas ett numeriskt namn. Först kommer variabeln 0 att innehålla hela matchningen (i vårt exempel blir det hela adressen: test@proton.me). Därefter tilldelas den första matchningsgruppen till variabeln 1 (i vårt exempel blir det test), den andra matchningsgruppen tilldelas den andra variabeln (proton.me), och så vidare fram till den sista matchningsgruppen.

I vårt exempel körs kommandot fileinto. Platsen definieras som ${1} vilket känns igen som en variabel och därmed ersätts med dess värde, som beräknats ovan: test.

Observera att det också är möjligt att tilldela variabler i ett :regex-test, genom att använda matchningsgrupper för reguljära uttryck.

Omvandla variabler

En trevlig möjlighet är omvandling av variabler. För det kan nyckelordet set användas med en kombination av flaggor som kan användas för att ändra värdet innan det tilldelas variabeln.

  • :lower ändrar en variabels värde till gemener;
  • :upper ändrar en variabels värde till versaler;
  • :lowerfirst ändrar första bokstaven i variabelns värde till gemen;
  • :upperfirst ändrar första bokstaven i variabelns värde till versal;
  • :quotewildcard sätter citattecken runt alla jokertecken i strängen, så att de kan användas bokstavligen i en matchningssats;
  • :length returnerar värdets längd.

Observera att du också kan återanvända en definierad variabel i en annan set-åtgärd. Låt oss förbättra våra tidigare exempel:

require "variables";
require "fileinto";
# Set labelname to WORK, and modify it to lowercase with the first letter in upper case 
set :lower :upperfirst "labelname" "WORK";
set :lower :upperfirst "foldername" "geneva";
# Create a variable that is a combination of foldername and labelname
set "location" "${foldername}/${labelname}";
fileinto "${location}";

Steg för steg skapar filtret tre variabler. Det första kommandot set skapar variabeln labelname. Variabelns innehåll är Work. Det ursprungliga värdet WORK omvandlas faktiskt med hjälp av både flaggorna :lower och :upperfirst, vilket ändrar skiftläget till work och sedan till Work.

Det andra set-kommandot skapar en andra variabel som heter foldername och som innehåller strängen Geneva. Flaggorna :lower och :upperfirst användes faktiskt.

Slutligen skapas variabeln location. Värdet “${foldername}/${labelname}” innehåller två variabler: foldername och labelname. Så Sieve-tolken kommer att ersätta dessa variabler med deras värden: Work och Geneva.

Slutligen används variabeln location som argument för kommandot fileinto. E-postmeddelandet kommer således att flyttas till mappen vars namn är värdet på variabeln location: Work/Geneva.

Jämförelseoperatorerna kan också tillämpas på matchande variabler:

require "variables";
require "fileinto";
if address :all :matches "from" "*@*" {
    set :lower :upperfirst "fileintovar" "${1}";
    fileinto "${fileintovar}";
}

Här, om e-postens avsändare är test@proton.me, kommer den att flaggas med etiketten Test.

Ett annat sätt att ändra värdet på en variabel är att använda tillägget vnd.proton.eval. Detta tillägg definierar den nya flaggan :eval, som gör det möjligt för dig att göra några enkla beräkningar:

require "variables";
require "fileinto";
require "vnd.proton.eval";
# do a match test on the sender address
if header :matches "from" "*" {
    # create a variable called length, containing the length of the first     
    # matching variable
    set :length "length" "${1}"; 
    # Create a variable called fileintovar containing the result of the expression written below
    set :eval "fileintovar" "${length} * 25 - 1 / 8+3";
    fileinto "${fileintovar}";
}

I det här exemplet, och om vi fortfarande antar att e-postmeddelandet kommer från test@proton.me, kommer e-postmeddelandet att flaggas med värdet 478. Längden på den första matchande variabeln är faktiskt 19, och resultatet av 19 * 25 – 1 / 8 + 3 avrundas uppåt till 478.

Detta kan verka oanvändbart först, men det här tillägget blir mer meningsfullt i kombination med andra åtgärder.

Jämförelse mot andra fält i Sieve

Det är också möjligt att matcha på specifika rubriker. Om du till exempel vill placera alla meddelanden som skickas till listor (ofta är de marknadsföringsmeddelanden eller nyhetsbrev), kan du göra så här:

require "fileinto";
# Filter all lists into the same folder
if exists "list-unsubscribe"
{
    fileinto "advertisements";
}

För att sortera e-postmeddelanden från sociala medier till deras egen mapp kan du skriva:

require "fileinto";
# Filter all lists into the same folder
if anyof(exists "x-facebook", exists "x-linkedin-id") {
    fileinto "social";
} elsif exists "list-unsubscribe"
{
    fileinto "advertisements";
}

Observera att vi använder:

anyof(exists "x-facebook", exists "x-linkedin-id")

i stället för:

exists ["x-facebook", "x-linkedin-id"]

Eftersom det sistnämnda kontrollerar om både x-facebook och x-linkedin-id har ställts in.

För att faktiskt se vilket värde en rubrik innehåller kan du använda testet header:

require "fileinto";
# Put all mails that have been sent without TLS/SSL into the same folder
if header :is "x-pm-transfer-encryption" "none" {
    fileinto "unencrypted";
}

Förutom åtgärden :is, som gör en exakt matchning, stöder kommandot header även :matches, som matchar med hjälp av jokertecken (t.ex. \”*@*.com\” kommer att matcha alla e-postadresser som slutar på punkt com), och kommandot :contains, som kontrollerar om rubriken innehåller en viss sträng.

För att utforma Sieve-filter kan det vara användbart att hämta rubrikerna för ett e-postmeddelande. För att göra detta i Proton Mails webbgränssnitt går du till Mer () → Visa rubriker. Ett nytt fönster öppnas som innehåller alla rubriker för e-postmeddelandet.

Filtrera efter meddelandestorlek i Sieve

Det är möjligt att hantera stora e-postmeddelanden annorlunda än små e-postmeddelanden. Du kanske till exempel vill flagga stora e-postmeddelanden så att du kan ta bort dem för att spara utrymme i brevlådan. Detta kan uppnås på följande sätt:

require ["imap4flags"];
# Flag emails that probably have large attachments (> 2 MiB)
if size :over 2M # you can also use 2097152 if you want, they are synonymous
{
    addflag "\\Flagged";
}
# Automatically mark as read really small messages. They can't have much content anyway...
if size :under 1000
{
    addflag "\\Seen";
}

Som du kan se finns det enheter tillgängliga om du vill ange stora storlekar genom att lägga till bokstaven som motsvarar den förväntade enheten direkt efter siffran. Tre enheter finns tillgängliga: K för en kibioctet (eller 1 024 byte), M för en mebioctet (eller 1 048 576 byte) och G för en gibioctet (eller 1 073 741 824 byte).

Observera att ”over” i detta fall betyder större än och ”under” betyder mindre än. Detta innebär att om ett meddelande har en storlek på exakt 1 000 byte kommer varken

size :under 1000

eller

size :over 1000

att matcha.

Observera att Sieve-filter inte har åtkomst till det faktiska innehållet och endast visar den krypterade storleken.

Utföra avancerade åtgärder på meddelanden

Du kan utföra olika reaktioner på ett meddelande i Sieve. Vi har redan presenterat åtgärderna fileinto, addflag, discard och reject i de föregående avsnitten. Här kommer vi att presentera mer avancerade åtgärder.

Semestermeddelanden och datumtester

Du kan replikera funktionen för autosvar i Sieve med hjälp av kommandot vacation. Faktum är att funktionen för autosvar i dina inställningar förlitar sig på Sieve för att göra sitt jobb. Men genom att använda semesteralternativen i ett skript har du många fler möjligheter att anpassa dina autosvar. Du kan till exempel skräddarsy specifika meddelanden beroende på villkor. Obs! Precis som med funktionen för autosvar i inställningarna är åtgärden vacation endast tillgänglig i betalda paket.

Kommandot vacation skickar ett semestersvar till alla som försöker kontakta dig. Det kopplas ofta samman med testerna currentdate eller date för att skicka svar under ett specifikt tidsintervall.

Anta att jag ska åka på semester från den 14 juli 2017 till den 14 augusti 2017, i Colorado-tid. Jag kan använda följande Sieve-kod för att ställa in ett autosvar:

require ["date", "vacation", "relational"];
if allof(currentdate :zone "US/Mountain" :value "ge" "date" "2017-07-14",
 currentdate :zone "US/Mountain" :value "le" "date" "2017-08-14")
{
    vacation "Queue you guys, I'm going on vacation.";
}

Ett av de valfria argumenten för ett vacation-kommando är argumenten :handle och :days. Som standard kommer Sieve inte att svara flera gånger till samma avsändare inom ett visst antal dagar, vilket kallas timeout. Detta förhindrar att du oavsiktligt skickar ett stort antal automatiska e-postmeddelanden.

För att styra timeouten kan du använda parametern :days. Argumentet :days används för att ange den period under vilken adresser behålls och inte besvaras, och anges alltid i dagar. Ibland har du flera vacation-kommandon i ditt Sieve-skript, och du behöver se till jag att vart och ett av dem skickar ett svar minst en gång (om regeln matchar). I så fall kan alternativet :handle användas. Argumentet till :handle är en sträng som identifierar vilken typ av svar som skickas.

För att se hur detta fungerar, anta att du är lärare. Lärare får ofta inlämningsuppgifter via e-post. Det är användbart att sortera dem i en egen mapp. Dessutom kan du avvisa alla inlämningar som kommer efter sista inlämningsdag.

I ett sådant fall kanske du vill använda handle för att se till att svar skickas när det behövs:

require ["date", "vacation", "reject", "fileinto", "relational"];
if header :contains "subject" "Homework assignment 1"
{
    # remind people not to forget the attachments
    if size :under 5000
    {
        vacation :handle "Homework assignment 1 - missing attachment" "Your message size is really low. Please make sure you didn't forget to add the homework as an attachment.";
    }
   
    # check if the student made the deadline
    if  currentdate :zone "US/Mountain" :value "le" "date" "2017-06-12"
    {
        fileinto "Homework Assignment 1";
    } else {
        reject "Too late, you missed the deadline.";
    }
}
if header :contains "subject" "Homework assignment 2"
{
    # remind people not to forget the attachments
    if size :under 5000
    {
        vacation :handle "Homework assignment 2 - missing attachment" "Your message size is really low. Please make sure you didn't forget to add the homework as an attachment.";
    }
   
    # check if the student made the deadline
    if  currentdate :zone "US/Mountain" :value "le" "date" "2017-06-12"
    {
        fileinto "Homework Assignment 2";
    } else {
        reject "Too late, you missed the deadline.";
    }
}

Här är alla argument som är tillåtna för semestersvaret, listade i den ordning som argumenten ska skickas:

  • :days är antalet dagar som autosvaret ska avstå från att skicka ett svar till samma avsändare efter att ha skickat ett semestermeddelande
  • :subject är ett prefix (som standard auto) som autosvaret ska använda för att svara till avsändaren. Till exempel kommer ”Homework Assignment 2” att få ett svar med ”late: Homework Assignment 2” om :subject “late” skickas med.
  • :mime indikerar att den första raden i svaret använder ett specifikt format. Detta gör det möjligt för avsändaren att svara med HTML-meddelanden. För att till exempel skriva ett HTML-svar skickar du med argumentet :mime och skriver Content-Type : text/html på den första raden i svaret.
  • :handle är en sträng som identifierar vilken typ av svar som skickas.

Observera att parametern :zone i currentdate är en valfri parameter och kommer att använda serverns lokala tid (Genève, Schweiz, när det gäller Proton Mail) om den inte är inställd.

Zonparametern accepterar tidszonsförskjutningar, vilka är strängar i formen ”+0100” som betyder UTC+1, och faktiska tidszoner i ICANN-databasen (se https://en.wikipedia.org/wiki/List_of_tz_database_time_zones(nytt fönster)). Det sista alternativet är ofta mer användbart (även om det är icke-standardiserad Sieve) eftersom det också kodar sommartid för varje tidszon.

Du kan jämföra datum genom att använda den normala parametern :is/ :contains/ :matches. Så till exempel matchar följande Sieve-kommando alla datum i juli 2017:

currentdate :zone "US/Mountain" :matches "date" "2017-07-??"

Men i de flesta fall är parametern :value mycket mer användbar.

Den sista parametern du behöver skicka med är formatet. Formatet kodar också vilken del av datumet du vill jämföra. I det givna exemplet har vi använt datumformatet. Alla format som stöds är:

  • year, året kodat i formatet ”0000” till ”9999”
  • month, månaden kodad som ”01” till ”12”
  • day, dagen kodad som ”01” till ”31”
  • date, kodat som yyyy-mm-dd
  • hour, timmen kodad som ”00” till ”23”
  • minute, minuten kodad som ”00” till ”59”
  • second, sekunden kodad som ”00” till ”60” (60 är en skottsekund(nytt fönster), vilket endast inträffar kl. 23:59:60 närhelst forskare anser det nödvändigt)
  • time, tiden som hh:mm:ss
  • iso8601, datum och tid enligt standarden ISO8601, till exempel: 2005-08-15T15:52:01+00:00
  • std11, datum och tid enligt standarden RFC2822, till exempel: Mon, 15 Aug 2005 15:52:01 +0000
  • zone, tidszonsförskjutningen i formatet +/-zzzz, till exempel +0000 eller -1200
  • julian, antalet dagar sedan den 17 november 1858 UTC
  • weekday, veckodagen med start från söndag som 0 till lördag som 6

Slutligen är det också möjligt att hämta datumet från en rubrik istället för att använda currentdate. Detta datumkommando fungerar på samma sätt som currentdate, förutom att det kräver en extra sträng före formatsträngen: rubriknamnet. Till exempel:

date :zone "US/Mountain" :matches "received" "date" "2017-07-??"

Observera att rubrikerna inte nödvändigtvis är korrekta: en avsändare kan ändra dem efter eget gottfinnande och de är därför inte tillförlitliga.

Att tänka på:

  1. Autosvaret svarar inte på automatiskt genererade meddelanden såsom e-postlistor, e-postmeddelanden som skickats av ett annat autosvar eller meddelanden som skickats från en noreply-adress.
  2. Autosvaret kommer inte att skicka meddelanden flera gånger till samma e-postadress, utom när vacation-kommandot har ett annat :handle.

Hantera utgång

En unik funktion hos Proton Mail är möjligheten att ställa in en utgångstid för skickade meddelanden, varpå meddelandet kommer att tas bort från mottagarens brevlåda.

Du kan också använda denna funktion för att hantera dina inkommande meddelanden genom att lägga till en utgångstid:

require "vnd.proton.expire"; 
# permanently delete all incoming and outgoing emails after 10 days
expire "day" "10";

Skriptet ovan kommer att ta bort alla mottagna e-postmeddelanden efter 10 dagar. Detta är lite extremt eftersom det tillämpas på alla e-postmeddelanden. Istället bör du förmodligen använda ett villkor för att tillämpa skriptet på endast en viss uppsättning e-postmeddelanden. Till exempel skulle du kunna låta alla meddelanden från någon som inte finns i dina kontakter löpa ut:

require ["extlists", "vnd.proton.expire"];
# permanently delete after 10 days any email not from me or from someone in my address book.
if not anyof(
    header :list "from" ":addrbook:personal",
    header :list "from" ":addrbook:myself"
) {
 expire "day" "10";
}

Obs! Om den angivna utgångstiden överskrider 730 dagar kommer den automatiskt att begränsas till 730 dagar.

Begränsningar för Sieve

Det finns flera Sieve-begränsningar du bör känna till.

  • Skickade meddelanden kan inte flyttas manuellt eller med filter till Inkorg/Utkast. De kommer alltid att ligga kvar i mappen Skickat och mappar/etiketter som tillämpats av användaren eller filtret.
  • Mottagna meddelanden kan inte flyttas manuellt eller med filter till Utkast/Skickat.
  • Utkast kan inte flyttas manuellt eller med filter till Inkorg/Skickat.
  • För meddelanden i Skräppost — eller meddelanden som sorteras som skräppost vid bearbetning — skickar vi inte automatiska svar/semestersvar. Om du behöver en sådan funktion kan du överväga att lägga till en anpassad mapp — till exempel mySpam — och inaktivera aviseringar för den.
  • Begränsningar för automatiska svar/semestersvar

Att notera om stöd för reguljära uttryck

Protons implementering av Sieve följer standarden för Sieve-e-postfiltrering, som endast innehåller ett minimalt stöd för reguljära uttryck. Vissa vanliga förkortade syntaxer för reguljära uttryck, såsom \b (ordgräns), \w (ordtecken), \W (icke-ordtecken) och \d (siffra), stöds inte i Sieve. Som ett resultat kan användning av dessa förkortade tecken i filter göra att de misslyckas utan att något felmeddelande visas. Denna begränsning beror på själva Sieve-standarden, som prioriterar enkelhet och kompatibilitet mellan plattformar. För fullständiga detaljer, se utkastet till RFC för reguljära uttryck i Sieve.

Lista över åtgärder och tester som stöds

Paket

Sieve stöder följande tillägg. Du kan läsa den officiella dokumentationen för mer information.

Datum

  • Användning: date
  • Beskrivning: (nytt fönster)Erbjuder ett sätt att kontrollera datuminformation.
  • Dokumentation: https://tools.ietf.org/html/rfc5260(nytt fönster)
  • Implementering: Standardjämföraren är i;ascii-numeric och inte i;ascii-casemap. Date är faktiskt inte användbar med casemap-jämföraren.
  • Se: Semestersvar och datumtester

Kuvert

FileInto

  • Användning: fileinto
  • Beskrivning: Tillämpar en etikett på ett meddelande eller flyttar det till en mapp.
  • Dokumentation: https://tools.ietf.org/html/rfc5228#section-4.1(nytt fönster)
  • Implementering: Snedstreck indikerar mappens fullständiga sökväg och de måste maskeras om ett etikettnamn innehåller ett snedstreck. Följande alternativ stöds:
    • Work“: detta är etiketten eller mappen som heter ’Work’
    • Work/Project1“: detta är undermappen ’Project1’ som ligger i mappen ’Work’
    • Work/Project1/Docs“: detta är undermappen ’Docs’ som ligger i undermappen ’Project1’ som ligger i mappen ’Work’
    • Work/Misc\\/Others“: detta är undermappen ’Misc/Others’ som ligger i mappen ’Work’
  • Se: Komma igång

Imap4flags

Reject

Vacation

Variables

Relationell

  • Användning: relational
  • Beskrivning: Tillhandahåller relationella matchningsoperatorer.
  • Dokumentation: https://tools.ietf.org/html/rfc5231

Regex

  • Användning: regex
  • Beskrivning: Tillhandahåller regex-matchningsoperatorer.
  • Dokumentation: https://tools.ietf.org/id/draft-ietf-sieve-regex-01.html

Numerisk ASCII-jämförare

Externt lagrade listor

  • Användning: extlists
  • Beskrivning: Ger åtkomst till kontaktlistor.
  • Dokumentation: https://tools.ietf.org/html/rfc6134(nytt fönster)
  • Implementering: Följande listor stöds
    • addrbook:personal : Personlig kontaktlista. Följande sökningar stöds:
      • label[.starts-with / .ends-with / .contains]=<group: string>: åtgärd mot en kontaktgrupp;
      • keypinning=<value: true / false> definition av kontaktens offentliga nyckel;
      • encryption=<value: true / false> kontaktens standardkryptering;
      • signing=<value: true / false>  kontaktens standardsignatur.
    • :addrbook:myself Adresser som tillhör den aktuella användaren;
    • :addrbook:organization Adresser som tillhör medlemmarna i den aktuella organisationen;
    • :incomingdefaults:inbox Tillåt lista
    • :incomingdefaults:spam Blockeringslista
  • Se: Få åtkomst till din kontaktlista

Eval

  • Användning: vnd.proton.eval
  • Beskrivning: Utvärderar en enkel aritmetisk funktion angiven i en sträng.
  • Dokumentation: Omvandla variabler

Inkludera

Utgång

  • Användning: vnd.proton.expire
  • Beskrivning: Hanterar meddelandens utgång.
  • Dokumentation: Hantera utgång

Tester

Aktuellt datum

  • Användning:
currentdate [":zone" <time-zone: string>] [COMPARATOR] [MATCH-TYPE] <date-part: string> <key-list: string-list>

Datum

  • Användning:
date [":zone" <time-zone: string> / ":originalzone"] [MATCH-TYPE] <header-name: string> <date-part: string> <key-list: string-list

HasFlag

  • Användning:
hasflag [MATCH-TYPE] [COMPARATOR] <list-of-flags: string-list>
  • Beskrivning: Testar om ett visst meddelande har en viss flagga.
  • Paket: imap4flags
  • Se: Komma igång

Kuvert

  • Användning:
envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <envelope-part: string-list> <key-list: string-list>

Adress·

  • Användning:
address [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <header-list: string-list> <key-list: string-list>

Rubrik

  • Användning:
header [COMPARATOR] [MATCH-TYPE] <header-names: string-list> <key-list: string-list>

HasExpiration

  • Användning:
hasexpiration
  • Beskrivning: Testar om ett meddelande har en utgångstid inställd.
  • Paket: vnd.proton.expire

Exists

  • Användning:
exists <header-names: string-list>

Utgång

  • Användning:
expiration :comparator "i;ascii-numeric" [MATCH-TYPE] <unit: "day" / "minute" / "second"> <key-list: string-list>
  • Beskrivning: Jämför meddelandets utgångstid med de angivna nycklarna. Testet misslyckas om det körs mot ett meddelande som inte löper ut.
  • Paket: vnd.proton.expire

Storlek

  • Användning:
size <":over" / ":under"> <limit: number>

Sträng

  • Användning:
string [MATCH-TYPE] [COMPARATOR] <source: string-list> <key-list: string-list>
  • Beskrivning: Utvärderar om någon av källsträngarna matchar någon nyckel.
  • Paket: variables

Anyof

  • Användning:
anyof <tests: test-list>
  • Beskrivning: Utför ett logiskt OR på de tester som skickas till det.
  • Paket: <standard>
  • Se: Komma igång

Allof

  • Användning:
allof <tests: test-list>
  • Beskrivning: Utför ett logiskt AND på de tester som skickas till det.
  • Paket: <standard>
  • Se: Komma igång

Not

  • Användning:
not <test: test>
  • Beskrivning: Inverterar resultatet av det givna testet.
  • Paket: <standard>
  • Se: Komma igång

True

  • Användning:
true
  • Beskrivning: Matchar alltid.
  • Paket: <standard>

False

  • Användning:
false
  • Beskrivning: Matchar aldrig.
  • Paket: <standard>

Åtgärder

Require

  • Användning:
require <packages: string-list>
  • Beskrivning: Laddar ett angivet tillägg så att dess metoder eller modifieringar kan användas.
  • Paket: <standard>
  • Se: Komma igång

FileInto

  • Användning:
fileinto <folder: string>
  • Beskrivning: Flyttar meddelandet som behandlas till en viss mapp.
  • Paket: fileinto
  • Se: Komma igång

Addflag

  • Användning:
addflag <list-of-flags: string-list>
  • Beskrivning: Lägger till den angivna flaggan i meddelandet som behandlas.
  • Paket: imap4flags
  • Se: Komma igång

Removeflag

  • Användning:
removeflag <list-of-flags: string-list>
  • Beskrivning: Tar bort de angivna flaggorna från meddelandet som behandlas.
  • Paket: imap4flags

Setflag

  • Användning:
setflag <list-of-flags: string-list>
  • Beskrivning: Tar bort alla flaggor och ställer in de angivna flaggorna på meddelandet som bearbetas.
  • Paket: imap4flags

Stop

  • Användning:
stop
  • Beskrivning: Avbryter bearbetningen av alla Sieve-filter. Efterföljande Sieve-filter kommer inte att köras.
  • Paket: <standard>

Return

  • Användning:
return
  • Beskrivning: Avbryter bearbetningen av det aktuella Sieve-filtret. Efterföljande Sieve-filter kommer fortfarande att köras.
  • Paket: include

Set

  • Användning:
set [MODIFIER] <name: string> <value: string>
  • Beskrivning: Skapar nya variabler som kopplar det angivna namnet till det angivna värdet.
  • Paket: variables
  • Se: Skapa variabler

Discard

  • Användning:
discard
  • Beskrivning: Kastar meddelandet i slutet av detta Sieve-filter. Efter att det har kastats kommer inga andra Sieve-filter att köras.
  • Paket: <standard>

Keep

  • Användning:
keep
  • Beskrivning: Ångrar det senaste kasta-kommandot. Det har endast effekt om det är i samma Sieve-filter. Om inget kasta-kommando har utförts kommer detta inte att göra någonting.
  • Paket: <standard>

Reject

  • Användning:
reject <reason: string>
  • Beskrivning: Skickar ett e-postmeddelande till avsändarens SMTP-adress med en anledning och kastar detta meddelande omedelbart. Keep-kommandot kommer inte att avbryta denna åtgärd.
  • Paket: <standard>
  • Se: Kom igång, Semestersvar och datumtester

Expire

  • Användning:
expire <unit: "day" / "minute" / "second"> <value: string>
  • Beskrivning: Låter ett meddelande löpa ut efter den angivna tiden.
  • Paket: vnd.proton.expire
  • Se: Hantera utgångstid

Unexpire

  • Användning:
unexpire
  • Beskrivning: Tar bort utgångstiden för ett meddelande.
  • Paket: vnd.proton.expire

Vacation

  • Användning:
vacation [":days" number] [":subject" string] [":mime"] [":handle" string] <reason: string>
  • Beskrivning: Skickar ett automatiskt svar till avsändarens SMTP-adress med den angivna anledningen som meddelandetext.
  • Paket: vacation (kräver ett betalt konto)
  • Se: Semestersvar och datumtester

Valid External List

  • Användning:
valid_ext_list <ext-list-names: string-list>
  • Beskrivning: Testar om alla angivna externa listor stöds och är giltiga.
  • Paket: extlists