Proton domovská stránka

Sieve filtr (pokročilé vlastní filtry)

Čtení
43 minut
Kategorie
Přijímat a číst e-maily

Proton Mail nabízí uživatelům různé způsoby, jak automaticky filtrovat e-maily přiřazováním štítků nebo jejich tříděním do složek. Obecně existují tři metody:

  1. Přidání odesílatelů na Seznam blokovaných a Seznam povolených tak, aby byli vždy nebo nikdy zařazeni do složky se spamem;
  2. Vytvoření vlastního filtru pomocí interaktivního rozhraní služby Proton Mail;
  3. [Nejpokročilejší] Vytvoření vlastního filtru v Sieve.

Z těchto metod nabízí vytvoření vlastního filtru v Sieve největší všestrannost, ale jeho použití je také složitější. Z tohoto důvodu považujeme Sieve za pokročilou funkci pro uživatele s určitými technickými zkušenostmi. Pro většinu uživatelů je k vytvoření potřebných vlastních filtrů vhodné interaktivní rozhraní.

Obsah

Co je Sieve?

Sieve je programovací jazyk používaný k filtrování e-mailů. Filtry v Sieve můžete vytvářet psaním jednoduchých pravidel. Například: „Přiřadit všem zprávám od Kylea zelený štítek“. Kombinací těchto pravidel lze vytvořit propracovaný systém filtrování.

Pravidla Sieve můžete psát od začátku, vypůjčit si je z příkladů, jako jsou ty v tomto článku, nebo použít software, který Vám to usnadní.

Ve skutečnosti Vám již nabízíme způsob, jak vytvářet filtry Sieve pomocí interaktivního rozhraní, které k vygenerování filtrů Sieve využívá Vaše zadání. Dalším dobrým způsobem, jak se Sieve naučit, je vytvářet filtry pomocí interaktivního rozhraní a následně je v Sieve upravovat, protože samotné interaktivní rozhraní využívá podmnožinu Sieve.

Porovnejte například následující filtr vytvořený pomocí interaktivního rozhraní…


… s kódem stejného filtru zobrazeným v editoru Sieve:

Tento článek Vás seznámí se Sieve a vysvětlí Vám, jak psát vlastní Sieve filtry. Pokud potřebujete další informace o používání Sieve, může Vám pomoci řada dalších online návodů. Pokud máte dotazy ohledně Sieve v Proton Mailu, na které tato stránka neodpovídá, můžete se kdykoli obrátit na náš tým podpory zde.

Začínáme

Chcete-li začít vytvářet Sieve filtry, přihlaste se k mail.proton.me(nové okno) a přejděte do Nastavení → Všechna nastavení → Proton Mail → Filtry → Přidat Sieve filtr.

Skript Sieve se skládá ze seznamu příkazů. Ve většině skriptů začíná příkazem require. Příkaz require načte rozšíření, které poskytuje určitou funkci. Například pro přiřazení štítku nebo přesunutí zprávy do složky potřebujeme příkaz fileinto.

K načtení tohoto příkazu stačí napsat:

require "fileinto";

Chcete-li načíst více rozšíření, můžete použít seznam:

require ["fileinto", "imap4flags"];

V tomto případě příkaz imap4flags načte rozšíření, které umožňuje označit poštu jako přečtenou. Po příkazu require budete často provádět testy příchozí zprávy. Toho docílíte kombinací příkazu if a dalšího příkazu, jako je address nebo header.

Pokud testy uspějí, můžete nakonec na zprávu použít akci. Předpokládejme například, že chceme zařadit všechny e-maily od konkrétního odesílatele do stejné složky a označit příchozí poštu jako přečtenou. To lze zapsat takto:

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

Upozorňujeme, že znak # označuje komentář a není interpretován jako součást skriptu Sieve. Složka nebo štítek, který nastavíte (zde enemies), musí ve Vašem prostředí existovat: jak vytvářet složky a štítky se dozvíte zde. Po zadání tohoto filtru klikněte na tlačítko ULOŽIT. Váš filtr se nyní spustí pro každý příchozí e-mail.

Samozřejmě můžete chtít ukládat e-maily od více odesílatelů do stejné složky. V takovém případě můžete příkazu address předat seznam řetězců (řetězec(nové okno) je řada znaků, v tomto případě e-mailová adresa):

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";
}

Upozorňujeme, že kdykoli můžete předat řetězec do testovací podmínky, je obvykle možné předat také seznam. Poté se pokusí najít shodu vyzkoušením libovolného z řetězců v seznamu. To neplatí pro příkazy jako fileinto, addflag atd.

Sieve je však mnohem výkonnější než pouhé přeskupení Vaší e-mailové schránky. Umožňuje Vám také odmítat e-maily s odpovědní zprávou:

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

Použití testů

Kombinování testů v Sieve

Jak jsme Vám ukázali v části Začínáme, můžete u příchozích zpráv provádět testy pomocí příkazu if a určit tak, zda má být e-mail ovlivněn příkazem require.

Kromě příkazu if existují další testovací příkazy, které Vám umožní snadno strukturovat skript.

Else

Příkaz else umožňuje provést akci v případě, že příkaz if své akce nevykonal. Příkladem je:

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";
}

Zde bude e-mail přesunut do složky Kenny, pokud je předmět přesně mmph mmph. V opačném případě (tedy pokud předmět není přesně mmph mmph) bude e-mail přesunut do složky Understandable.

Elsif

elsif je sloučením slov else if. Podobně jako příkaz else se provede, pokud je podmínka if nepravdivá, ale pouze v případě, že je podmínka elsif správná. Pokud podmínka elsif správná není, provede se další blok elsif nebo else.

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";
}

Upozorňujeme, že při jednom spuštění se provede pouze jeden z bloků if, elsif nebo else.

Anyof

Někdy potřebujete provést příkaz, když uspěje jeden z několika testů. K tomu můžete použít příkaz anyof. To se provádí tak, že napíšete anyof následovaný levou závorkou „(“, příkazy, které chcete otestovat, oddělenými čárkami, a pravou závorkou „)“.

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";
}

Tento skript vloží zprávy, které pocházejí od kenny@northpark.example.com nebo obsahují v předmětu mmph mmph, do složky Kenny.

Allof

Existuje také protějšek k anyof: allof. Ten vám umožňuje provést příkaz pouze tehdy, když jsou splněny všechny uvedené podmínky:

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";
}


Tento skript vloží zprávy, které pocházejí od kenny@northpark.example.com a obsahují v předmětu mmph mmph, do složky Kenny.

Not

A nakonec, někdy potřebujete použít příkaz, pokud něco neodpovídá. Přidáním not před příkaz zajistíte, že k tomu dojde:

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";
}

Což odpovídá:

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";
}

Tímto se všechny e-maily, které v předmětu neobsahují real guitar, vloží do složky Young people.

Všechny tyto testy je samozřejmě možné kombinovat. Můžete například chtít označit e-mail hvězdičkou, pokud zároveň nepochází od Kennyho a neobsahuje v předmětu mmph mmph:

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

Provádění testů hlaviček

Pomocí příkazu address můžete provádět testy adresních hlaviček, jako jsou hlavičky from, to a sender. Pomocí jednoho z následujících příznaků můžete extrahovat různé části e-mailové adresy:

  • :localpart — část před symbolem zavináče (@)
  • :domain — část za symbolem zavináče (@)
  • :all — celá adresa

Následující ukázka vysvětluje použití tohoto příkazu:

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";
}

Stručně řečeno, tento skript vloží vše odeslané z domény northpark.example.com do složky PaperPeople a z domény springfield.example.com do složky YellowPeople.

Bez ohledu na to, z jaké domény je e-mail odeslán, platí navíc, že pokud se část před @ rovná chef (např. chef@example.com), zpráva bude označena příznakem. Dalším zajímavým využitím je automatické ukládání všeho odeslaného na jednu adresu do složky:

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

Pokročilé

Příkaz envelope vám umožňuje provádět další testy. Test address obecně získává pouze hodnotu z hlavičky. V relaci SMTP však lze zadat jinou adresu from než tu, která je uvedena v hlavičce.

V rozhraní hlaviček Proton Mail se envelope-from rovná hlavičce return-path a envelope-to se rovná hlavičce x-original-to.

Pomocí příkazu envelope můžete z obálky získat skutečné adresy to: a from:. Upozorňujeme, že kromě těchto dvou neexistují žádná jiná pole, takže sender v tomto příkazu neexistuje. Vezměte prosím na vědomí, že příkaz envelope se nachází v rozšíření, a proto je nejprve nutné toto rozšíření vyžádat pomocí příkazu require.

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";
}

Použití komparátorů k vyhodnocení dvou hodnot

Když test vyhodnocuje dvě hodnoty, je možné určit, jak se toto porovnání provede, a to pomocí různých příznaků nazývaných komparátory. Předtím jsme již použili dva komparátory: :is a :contains, které kontrolují, zda se daný řetězec přesně rovná konkrétní hodnotě a zda konkrétní hodnota obsahuje daný řetězec, jako v následujícím testu.

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";
}

Komparátor :matches lze také použít k definování specifičtějšího formátu. Porovná obě hodnoty od začátku do konce, stejně jako komparátor :is. V případě :matches však vámi definovaná hodnota může obsahovat hodnoty ? a *. Otazník bude odpovídat jednomu znaku a hvězdička (nazývaná zástupný znak) bude odpovídat nule nebo více znakům.

S tímto formátem můžete vytvořit tento test:

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

V tomto příkladu bude test úspěšný, pokud předmět zprávy začíná na mmph a poté obsahuje jakýkoli znak nebo znaky za ním. Jinými slovy, e-mail bude označen příznakem, pokud předmět začíná na „mmph“. „mmph mmph“ i „mmph mmph Hello“ budou odpovídat; „Hello mmph“ a „Springfield sales“ nikoli.

Hvězdičku lze použít také uprostřed hodnoty, a to i několikrát, následovně:

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

Tento test bude úspěšný, pokud předmět začíná na „mmph “ (s mezerou), obsahuje další „mmph “ (s mezerou) a končí na „mmph“ (bez mezery). Odpovídající předměty jsou „mmph mmph mmph“, „mmph mmph mmphmmph“ nebo „mmph is mmph and mmph“.

Tento komparátor :matches může být velmi užitečný při porovnávání adres. Jak možná víte, Proton Mail má několik domén: protonmail.com a proton.me. Pokud chcete zkontrolovat, zda zpráva pochází od uživatele služby Proton Mail, můžete použít tento skript:

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

Pokud z nějakého důvodu potřebujete přesně porovnat znak * nebo ?, můžete je escapovat tak, že před ně přidáte \\: \\* bude odpovídat hvězdičce a \\? bude odpovídat otazníku.

Vezměte na vědomí, že podporujeme také rozšíření regex, které rovněž definuje komparátor :regex. Tento komparátor je přesnější verzí :matches, ale je velmi složitý. Další informace naleznete v oficiální dokumentaci(nové okno).

V některých případech (jak uvidíte v další části tohoto článku) budete možná chtít porovnat číselné hodnoty. Pro toto použití je určen balíček relational. Tento balíček definuje komparátor :value, za kterým následuje typ porovnání.

Umožňuje vám zkontrolovat, zda je hodnota větší než (typ porovnání je “gt”), větší nebo rovna (“ge”), rovna (“eq”), menší nebo rovna (“le”) nebo menší než (“lt”) daná hodnota.

Při porovnávání číselných hodnot je velmi užitečný také balíček comparator-i;ascii-numeric. Interpretovi skriptu říká, že obsahem řetězce je číslo, a nikoli běžný řetězec. Lze jej použít tak, že k testu přidáte :comparator “i;ascii-numeric”.

Se všemi těmito informacemi můžeme sestavit následující skript:

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

Tento test přesune zprávu do složky Dummy example, pokud je předmět větší nebo roven 2. Pokud předmět není číslo, ale text, test selže. Jako takový vypadá tento příklad velmi hloupě, ale je určen k použití v kombinaci s dalšími rozšířeními, jako je například date, které definujeme později v tomto článku.

Porovnávání s využitím kontextu v Sieve

Pomocí rozšíření můžete také přistupovat k informacím souvisejícím s vaším účtem a obecně s kontextem služby Proton Mail. Můžete například zkontrolovat, zda je adresa odesílatele ve vašem seznamu kontaktů.

Přístup k vašemu seznamu kontaktů

K vašemu seznamu kontaktů můžete přistupovat pomocí rozšíření extlists. V kombinaci s testy hlaviček pak můžete zkontrolovat, zda se kontakt nachází ve vašem seznamu kontaktů.

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

Tento test označí zprávu štítkem Known, pokud je odesílatel obsažen v seznamu :addrbook:personal?label=Family. Seznam lze rozdělit na dvě části. Za prvé, :addrbook:personal znamená, že adresa je ve vašem osobním adresáři. Za druhé, label=Family seznam dále zužuje a určuje, že kromě toho, že je kontakt ve vašem adresáři, musí patřit také do skupiny kontaktů Family. Pokud potřebujete, můžete tento štítek změnit na jinou skupinu kontaktů. V případě zájmu můžete použít :addrbook:personal?label=Work, přičemž v takovém případě by byl test úspěšný pouze tehdy, pokud je odesílatel ve vašem adresáři a ve skupině kontaktů Work.

Obecněji řečeno, seznam respektuje Tag URI Scheme(nové okno) a pro zúžení filtrů můžete přidat další parametry. Tento seznam pak můžete použít následovně:

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

Poskytli jsme čtyři různé seznamy:

  • :addrbook:personal¹ kontroluje, zda se adresa nachází ve vašem seznamu kontaktů. Seznam přijímá parametr label, který odpovídá konkrétní skupině kontaktů. Tento parametr lze použít ve čtyřech různých variantách:
    • :addrbook:personal?label=something bude odpovídat kontaktu, který je ve skupině kontaktů „something“;
    • :addrbook:personal?label.starts-with=something bude odpovídat kontaktu, který patří alespoň do jedné skupiny začínající na „something“;
    • :addrbook:personal?label.ends-with=something bude odpovídat kontaktu, který patří alespoň do jedné skupiny končící na „something“;
    • :addrbook:personal?label.contains=something bude odpovídat kontaktu, který patří alespoň do jedné skupiny obsahující „something“.

Můžete také přistupovat ke kryptografickým informacím týkajícím se odpovídajícího e-mailu:

  • :addrbook:personal?keypinning=true bude odpovídat kontaktu, který má důvěryhodný klíč. Změna z true na false bude odpovídat kontaktu, který důvěryhodný klíč nemá;
  • :addrbook:personal?encryption=true bude odpovídat kontaktu, u kterého je aktivováno šifrování. Změna z true na false bude odpovídat kontaktu, u kterého není šifrování nastaveno nebo je deaktivováno;
  • :addrbook:personal?signing=true najde kontakt, u kterého je aktivováno podepisování. Změna true na false najde kontakt, u kterého je podepisování deaktivováno.
  • :addrbook:myself¹ odpovídá každé adrese, kterou sami vlastníte;
  • :addrbook:organization odpovídá každé adrese, kterou vlastní někdo z organizace, jejímž jste členem;
  • :incomingdefaults:inbox kontroluje, zda je adresa na vašem Seznamu povolených;
  • :incomingdefaults:spam kontroluje, zda je adresa na vašem Seznamu blokovaných.

V kombinaci s rozšířením pro proměnné (popsaným v dalším odstavci) se odpovídající proměnné změní. Odpovídající proměnná ${0} bude vždy obsahovat poslední e-mailovou adresu uvedenou v daném seznamu. Pokud byl seznam označen poznámkou 1, bude odpovídající proměnná ${1} obsahovat zobrazované jméno.

Například pomocí níže uvedených seznamů můžete vytvořit filtr, který smaže všechny e-maily přijaté od kohokoli jiného než od vaší rodiny nebo někoho z vašeho seznamu povolených:

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
}

Pokud je tato podmínka splněna, provede se akce discard (zahodit). Tato akce okamžitě a trvale smaže e-mail . Místo zahození byste jej také mohli jednoduše přesunout do složky Koš pomocí akce fileinto: fileinto “trash”;.

Vytváření proměnných

Dalším užitečným nástrojem při správě kontextu je definice proměnné. Proměnná je dočasné úložiště, do kterého můžete vložit text a označit jej názvem. Později budete moci tento obsah znovu použít tak, že jej vyvoláte jeho názvem. Můžete mít například následující 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}";

Cílem tohoto skriptu je odmítnout e-mail s vlastní zprávou. Pokud je původní e-mail od odesílatele kenny a jeho předmět je „mmph mmph“, vytvoří se proměnná „message“ obsahující mmph mmph. V opačném případě bude zpráva vyplněna textem „Sorry, I don’t want emails today!“. V posledním kroku pak tuto proměnnou znovu použijeme v příkazu reject.

Sieve nativně nedefinuje proměnné, takže jsou definovány v rozšíření variables, které musí být vyžadováno na začátku vašeho skriptu. Existují dva způsoby, jak definovat proměnnou.

  • Explicitní vytvoření proměnné:

K vytvoření proměnné slouží akce set.

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

První řetězec je název vaší proměnné a druhý je hodnota vaší proměnné. Předchozí příklad tedy vytvoří proměnnou s názvem labelname, která bude obsahovat hodnotu Work.

Jakmile je proměnná definována, můžete ji vyvolat přidáním následujícího formátu do řetězce: ${name}, kde name je název vaší proměnné. Při spuštění bude nahrazena hodnotou proměnné. (Pokud jste proměnnou nedefinovali, bude nahrazena prázdným řetězcem.) V následujícím skriptu tedy:

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}";

Váš e-mail bude označen štítkem /Work. Protože jsme již definovali proměnnou labelname, je nahrazena hodnotou Work. Proměnná foldername však definována není, takže je jednoduše odstraněna.

  • Implicitní přiřazení proměnné:

Nejzajímavějším případem použití proměnných je použití testu :matches. Vezměme si následující příklad, kde je odesílatelem e-mailu 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}";
}

Při použití s rozšířením pro proměnné se výsledek operace match uloží do proměnných. Nastaví se několik proměnných s číselným názvem. Nejprve bude proměnná 0 obsahovat celou shodu (v našem příkladu to bude celá adresa: test@proton.me). Poté bude první odpovídající skupina přiřazena proměnné 1 (v našem příkladu to bude test), druhá odpovídající skupina bude přiřazena druhé proměnné (proton.me) a tak dále až po poslední odpovídající skupinu.

V našem příkladu se provede příkaz fileinto. Umístění je definováno jako ${1}, což je rozpoznáno jako proměnná a nahrazeno její hodnotou vypočítanou výše: test.

Upozorňujeme, že proměnné je možné přiřadit také v testu :regex pomocí skupin odpovídajících regulárním výrazům.

Transformace proměnných

Jednou z užitečných možností je transformace proměnných. K tomu lze použít klíčové slovo set v kombinaci s příznaky, které lze použít ke změně hodnoty před jejím přiřazením do proměnné.

  • :lower změní hodnotu proměnné na malá písmena;
  • :upper změní hodnotu proměnné na velká písmena;
  • :lowerfirst změní první písmeno hodnoty proměnné na malé;
  • :upperfirst změní první písmeno hodnoty proměnné na velké;
  • :quotewildcard opatří uvozovkami jakýkoli zástupný znak obsažený v řetězci, aby jej bylo možné použít doslovně v příkazu match;
  • :length vrátí délku hodnoty.

Upozorňujeme, že definovanou proměnnou můžete použít také v jiné akci set. Vylepšeme naše předchozí příklady:

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}";

Krok za krokem filtr vytvoří tři proměnné. První příkaz set vytvoří proměnnou labelname. Obsah proměnné je Work. Původní hodnota WORK je totiž transformována pomocí příznaků :lower a :upperfirst, čímž se změní na work a poté na Work.

Druhý příkaz set vytvoří druhou proměnnou s názvem foldername, která bude obsahovat řetězec Geneva. Byly totiž použity příznaky :lower a :upperfirst.

Nakonec se vytvoří proměnná location. Hodnota “${foldername}/${labelname}” obsahuje dvě proměnné: foldername a labelname. Interpret jazyka sieve proto tyto proměnné nahradí jejich hodnotami: Work a Geneva.

Nakonec se proměnná location použije jako argument pro příkaz fileinto. E-mail tak bude přesunut do složky, jejíž název je hodnotou proměnné location: Work/Geneva.

Porovnávače lze použít také na odpovídající proměnné:

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

Zde platí, že pokud je odesílatelem e-mailu test@proton.me, bude označen štítkem Test.

Dalším způsobem, jak změnit hodnotu proměnné, je použít rozšíření vnd.proton.eval. Toto rozšíření definuje nový příznak :eval, který vám umožní provádět jednoduché výpočty:

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}";
}

V tomto příkladu, a stále za předpokladu, že e-mail přichází z adresy test@proton.me, bude e-mail označen hodnotou 478. Délka první odpovídající proměnné je totiž 19 a výsledek 19 * 25 – 1 / 8 + 3 se zaokrouhlí nahoru na 478.

Na první pohled se to může zdát zbytečné, ale toto rozšíření dává větší smysl v kombinaci s jinými operacemi.

Porovnání s jinými poli v Sieve

Možné je také vyhledávání shody v konkrétních hlavičkách. Chcete-li například zařadit všechny zprávy odeslané do seznamů (často se jedná o marketingové zprávy nebo e-mailové zpravodaje), můžete provést následující:

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

Chcete-li roztřídit e-maily ze sociálních sítí do jejich vlastní složky, můžete napsat:

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";
}

Upozorňujeme, že používáme:

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

místo:

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

Protože druhá možnost kontroluje, zda byly nastaveny hlavičky x-facebook i x-linkedin-id.

Chcete-li zjistit, jakou hodnotu hlavička skutečně obsahuje, můžete použít test 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";
}

Kromě operace :is, která provádí přesnou shodu, podporuje příkaz header také :matches, který vyhledává shody pomocí zástupných znaků (např. “*@*.com” odpovídá jakékoli e-mailové adrese končící na dot com), a příkaz :contains, který kontroluje, zda hlavička obsahuje daný řetězec.

Při návrhu filtrů Sieve může být užitečné získat hlavičky e-mailu. Chcete-li to provést ve webovém rozhraní Proton Mail, přejděte na Více () → Zobrazit hlavičky. Otevře se nové okno obsahující všechny hlavičky e-mailu.

Filtrování podle velikosti zprávy v Sieve

S velkými e-maily je možné zacházet jinak než s malými. Velké e-maily můžete například chtít označit příznakem, abyste je mohli smazat a ušetřit tak místo v e-mailové schránce. Toho lze dosáhnout následujícím způsobem:

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";
}

Jak vidíte, pokud chcete zadat velké velikosti, jsou k dispozici jednotky, a to přidáním písmene odpovídajícího předpokládané jednotce hned za číslo. K dispozici jsou tři jednotky: K pro kibioctet (nebo 1024 bajtů), M pro mebioctet (nebo 1 048 576 bajtů) a G pro gibioctet (nebo 1 073 741 824 bajtů).

Vezměte prosím na vědomí, že „over“ v tomto případě znamená větší než a „under“ znamená menší než. To znamená, že pokud má zpráva velikost přesně 1000 bajtů, pak ani

size :under 1000

ani

size :over 1000

nebude odpovídat.

Vezměte na vědomí, že filtry Sieve nemají přístup ke skutečnému obsahu a zobrazují pouze šifrovanou velikost.

Provádění pokročilých akcí se zprávami

V Sieve můžete spouštět různé reakce na zprávu. V předchozích částech jsme již představili akce fileinto, addflag, discard a reject. Zde si představíme pokročilejší akce.

Zprávy v nepřítomnosti a testy data

Funkci automatické odpovědi můžete v Sieve replikovat pomocí příkazu vacation. Funkce automatické odpovědi ve Vašem Nastavení ve skutečnosti spoléhá na Sieve. Použitím možností vacation uvnitř skriptu však máte mnohem více možností, jak si své automatické odpovědi přizpůsobit. Můžete například připravit konkrétní zprávy na míru v závislosti na podmínkách. Poznámka: Stejně jako u funkce automatické odpovědi v Nastavení je akce vacation k dispozici pouze v placených plánech.

Příkaz vacation odešle odpověď v nepřítomnosti každému, kdo se Vás pokusí kontaktovat. Často se spojuje s testy currentdate nebo date, aby se odpovědi odesílaly v určitém časovém rozmezí.

Předpokládejme, že odjíždím na dovolenou od 14. července 2017 do 14. srpna 2017 v coloradském čase. K nastavení automatického odpovídače mohu použít následující kód Sieve:

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.";
}

Jedněmi z volitelných argumentů pro příkaz vacation jsou argumenty :handle a :days. Ve výchozím nastavení Sieve neodpoví témuž odesílateli vícekrát během určitého počtu dní, který se nazývá časový limit (timeout). To Vám zabrání v neúmyslném odesílání velkého množství automatických e-mailů.

Chcete-li řídit časový limit, můžete použít parametr :days. Argument :days se používá k určení období, po které jsou adresy uchovávány a neodpovídá se na ně, a vždy se uvádí ve dnech. Někdy máte ve svém skriptu Sieve více příkazů vacation a potřebujete zajistit, aby každý z nich odeslal odpověď alespoň jednou (pokud pravidlo odpovídá). V takovém případě lze použít volbu :handle. Argument pro :handle je řetězec, který identifikuje typ odesílané odpovědi.

Chcete-li vidět, jak to funguje, představte si, že jste učitel. Učitelé často dostávají úkoly e-mailem. Je užitečné je roztřídit do vlastní složky. Kromě toho můžete odmítnout jakékoli odevzdané práce, které přijdou po termínu.

V takovém případě možná budete chtít použít handle, abyste zajistili, že se odpovědi odešlou v případě potřeby:

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.";
    }
}

Zde jsou všechny povolené argumenty pro odpověď v nepřítomnosti, uvedené v pořadí, v jakém by měly být předány:

  • :days je počet dní, po které by se měl automatický odpovídač zdržet odeslání odpovědi stejnému odesílateli po odeslání zprávy v nepřítomnosti
  • :subject je předpona (ve výchozím nastavení „auto“), kterou by měl automatický odpovídač použít k odpovědi odesílateli. Například předmět „Homework Assignment 2“ obdrží odpověď s předmětem „late: Homework Assignment 2“, pokud je předán argument :subject “late”.
  • :mime označuje, že první řádek odpovědi používá specifický formát. To umožňuje odesílateli odpovědět zprávami ve formátu HTML. Chcete-li například napsat odpověď v HTML, předejte argument :mime a do prvního řádku odpovědi napište Content-Type : text/html.
  • :handle je řetězec, který identifikuje typ odesílané odpovědi.

Vezměte prosím na vědomí, že parametr :zone v currentdate je volitelný a pokud není nastaven, použije se místní čas serveru (v případě Proton Mailu Ženeva, Švýcarsko).

Parametr zóny přijímá posuny časových pásem, což jsou řetězce ve tvaru „+0100“ znamenající UTC+1, a skutečná časová pásma v databázi ICANN (viz https://en.wikipedia.org/wiki/List_of_tz_database_time_zones(nové okno)). Poslední možnost je často užitečnější (přestože se jedná o nestandardní Sieve), protože také kóduje letní čas každého časového pásma.

Data můžete porovnávat pomocí běžného parametru :is/ :contains/ :matches. Například následující příkaz Sieve odpovídá jakémukoli datu v červenci 2017:

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

Ve většině případů je však parametr :value mnohem užitečnější.

Posledním parametrem, který musíte předat, je formát. Formát také určuje, kterou část data chcete porovnávat. V uvedeném příkladu jsme použili formát data. Všechny podporované formáty jsou:

  • year, rok zakódovaný ve formátu „0000“ až „9999“
  • month, měsíc zakódovaný jako „01“ až „12“
  • day, den zakódovaný jako „01“ až „31“
  • date, zakódované jako rrrr-mm-dd
  • hour, hodina zakódovaná jako „00“ až „23“
  • minute, minuta zakódovaná jako „00“ až „59“
  • second, sekunda zakódovaná jako „00“ až „60“ (60 je přestupná sekunda(nové okno), k níž dochází pouze ve 23:59:60, kdykoli to vědci považují za nutné)
  • time, čas jako hh:mm:ss
  • iso8601, datum a čas podle standardu ISO8601, například: 2005-08-15T15:52:01+00:00
  • std11, datum a čas podle standardu RFC2822, například: Mon, 15 Aug 2005 15:52:01 +0000
  • zone, posun časového pásma ve formátu +/-zzzz, například +0000 nebo -1200
  • julian, počet dní od 17. listopadu 1858 UTC
  • weekday, den v týdnu počínaje nedělí jako 0 až sobotou jako 6

V neposlední řadě je také možné získat datum z hlavičky namísto použití currentdate. Tento příkaz pro datum funguje stejně jako currentdate s tím rozdílem, že vyžaduje další řetězec před řetězcem formátu: název hlavičky. Například:

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

Vezměte prosím na vědomí, že hlavičky nemusí být nutně přesné: odesílatel je může libovolně měnit, a proto nejsou spolehlivé.

Co je třeba vzít v úvahu:

  1. Automatický odpovídač neodpovídá na automaticky generované zprávy, jako jsou e-mailové konference, e-maily odeslané jiným automatickým odpovídačem nebo zprávy odeslané z adresy noreply.
  2. Automatický odpovídač neodešle zprávy vícekrát na stejnou e-mailovou adresu, s výjimkou případů, kdy má příkaz vacation jiné :handle.

Správa vypršení platnosti

Jednou z jedinečných funkcí služby Proton Mail je možnost nastavit čas vypršení platnosti odeslaných zpráv. V tomto okamžiku bude zpráva smazána z e-mailové schránky příjemce.

Tuto funkci můžete použít také ke správě příchozích zpráv přidáním času vypršení platnosti:

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

Výše uvedený skript smaže jakýkoli přijatý e-mail po 10 dnech. Tento příklad je poněkud extrémní, protože se vztahuje na všechny e-maily. Místo toho byste pravděpodobně měli použít podmínku, abyste skript aplikovali pouze na určitou skupinu e-maily. Platnost byste mohli nechat vypršet například u jakékoli zprávy od někoho, koho nemáte ve svých kontaktech:

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";
}

Poznámka: Pokud zadaný čas vypršení platnosti překročí 730 dní, bude automaticky omezen na 730 dní.

Omezení Sieve

Existuje několik omezení Sieve, na která byste měli pamatovat.

  • Odeslané zprávy nelze přesunout ručně ani pomocí filtru do Doručené pošty / Konceptů. Vždy zůstanou ve složce Odeslané a ve složkách/štítcích použitých uživatelem nebo filtrem.
  • Přijaté zprávy nelze přesunout ručně ani pomocí filtru do Konceptů / Odeslaných.
  • Koncepty nelze přesunout ručně ani pomocí filtru do Doručené pošty / Odeslaných.
  • U zpráv ve Spamu — nebo zpráv zařazených do spamu během zpracování — neodesíláme automatické odpovědi / zprávy v nepřítomnosti. Pokud takovou funkci potřebujete, zvažte přidání vlastní složky — například mySpam — a vypněte pro ni upozornění.
  • Omezení automatických odpovědí / zpráv v nepřítomnosti

Poznámka k podpoře regulárních výrazů

Implementace Sieve od Protonu se řídí standardem pro filtrování e-mailů Sieve, který zahrnuje pouze minimální podporu regulárních výrazů. Některé běžné zkrácené syntaxe regulárních výrazů, jako je \b (hranice slova), \w (slovní znak), \W (neslovní znak) a \d (číslice), nejsou v Sieve podporovány. V důsledku toho může použití těchto zkrácených znaků ve filtrech způsobit, že filtry tiše selžou. Toto omezení je dáno samotným standardem Sieve, který upřednostňuje jednoduchost a kompatibilitu napříč platformami. Úplné podrobnosti naleznete v konceptu RFC pro regulární výrazy v Sieve.

Seznam podporovaných akcí a testů

Balíčky

Sieve podporuje následující rozšíření. Více informací naleznete v oficiální dokumentaci.

Datum

  • Použití: date
  • Popis: (nové okno)Poskytuje způsob, jak zkontrolovat informace o datu.
  • Dokumentace: https://tools.ietf.org/html/rfc5260(nové okno)
  • Implementace: Výchozí komparátor je i;ascii-numeric, nikoli i;ascii-casemap. Datum totiž není s komparátorem casemap užitečné.
  • Viz: Zprávy v nepřítomnosti a testy data

Obálka

FileInto

  • Použití: fileinto
  • Popis: Použije na zprávu štítek nebo ji přesune do složky.
  • Dokumentace: https://tools.ietf.org/html/rfc5228#section-4.1(nové okno)
  • Implementace: Lomítka označují celou cestu ke složce a musí být escapována, pokud název štítku obsahuje lomítko. Podporovány jsou následující možnosti:
    • Work“: toto je štítek nebo složka s názvem „Work“
    • Work/Project1“: toto je podsložka „Project1“, která se nachází ve složce „Work“
    • Work/Project1/Docs“: toto je podsložka „Docs“, která se nachází v podsložce „Project1“, jež je ve složce „Work“
    • Work/Misc\\/Others“: toto je podsložka „Misc/Others“, která se nachází ve složce „Work“
  • Viz: Začínáme

Imap4flags

Odmítnout

Zpráva v nepřítomnosti

Proměnné

Relační

  • Použití: relational
  • Popis: Poskytuje relační operátory porovnávání.
  • Dokumentace: https://tools.ietf.org/html/rfc5231

Regex

  • Použití: regex
  • Popis: Poskytuje operátory pro porovnávání pomocí regulárních výrazů.
  • Dokumentace: https://tools.ietf.org/id/draft-ietf-sieve-regex-01.html

ASCII numerický porovnávač

Externě uložené seznamy

  • Použití: extlists
  • Popis: Poskytuje přístup k seznamům kontaktů.
  • Dokumentace: https://tools.ietf.org/html/rfc6134(nové okno)
  • Implementace: Jsou podporovány následující seznamy
    • addrbook:personal : Osobní seznam kontaktů. Jsou podporovány následující dotazy:
      • label[.starts-with / .ends-with / .contains]=<skupina: řetězec>: operace se skupinou kontaktů;
      • keypinning=<hodnota: true / false> definice veřejného klíče kontaktu;
      • encryption=<hodnota: true / false> výchozí šifrování kontaktu;
      • signing=<hodnota: true / false>  výchozí podpis kontaktu.
    • :addrbook:myself Adresy patřící aktuálnímu uživateli;
    • :addrbook:organization Adresy patřící členům aktuální organizace;
    • :incomingdefaults:inbox Seznam povolených
    • :incomingdefaults:spam Seznam blokovaných
  • Viz: Přístup k vašemu seznamu kontaktů

Eval

Include

Vypršení platnosti

Testy

Aktuální datum

  • Použití:
currentdate [":zone" <time-zone: string>] [COMPARATOR] [MATCH-TYPE] <date-part: string> <key-list: string-list>

Datum

  • Použití:
date [":zone" <time-zone: string> / ":originalzone"] [MATCH-TYPE] <header-name: string> <date-part: string> <key-list: string-list

HasFlag

  • Použití:
hasflag [MATCH-TYPE] [COMPARATOR] <list-of-flags: string-list>
  • Popis: Testuje, zda má určitá zpráva určitý příznak.
  • Balíček: imap4flags
  • Viz: Jak začít

Obálka

  • Použití:
envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <envelope-part: string-list> <key-list: string-list>

Adresa·

  • Použití:
address [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE] <header-list: string-list> <key-list: string-list>
  • Popis: Testuje, zda zadaná hlavička (nebo hlavičky) parsovaná jako adresa odpovídá zadaným klíčům.
  • Balíček: <výchozí>
  • Viz: Porovnání s adresami v Sieve

Hlavička

  • Použití:
header [COMPARATOR] [MATCH-TYPE] <header-names: string-list> <key-list: string-list>

HasExpiration

  • Použití:
hasexpiration
  • Popis: Testuje, zda má zpráva nastavený čas vypršení platnosti.
  • Balíček: vnd.proton.expire

Exists

  • Použití:
exists <header-names: string-list>

Vypršení platnosti

  • Použití:
expiration :comparator "i;ascii-numeric" [MATCH-TYPE] <unit: "day" / "minute" / "second"> <key-list: string-list>
  • Popis: Porovná čas vypršení platnosti zprávy se zadanými klíči. Test selže, pokud bude spuštěn pro zprávu bez nastaveného vypršení platnosti.
  • Balíček: vnd.proton.expire

Size

  • Použití:
size <":over" / ":under"> <limit: number>

String

  • Použití:
string [MATCH-TYPE] [COMPARATOR] <source: string-list> <key-list: string-list>
  • Popis: Vyhodnocuje, zda některý ze zdrojových řetězců odpovídá některému klíči.
  • Balíček: variables

Anyof

  • Použití:
anyof <tests: test-list>
  • Popis: Provádí logickou operaci OR na testech, které jsou mu předány.
  • Balíček: <výchozí>
  • Viz: Začínáme

Allof

  • Použití:
allof <tests: test-list>
  • Popis: Provádí logickou operaci AND na testech, které jsou mu předány.
  • Balíček: <výchozí>
  • Viz: Jak začít

Not

  • Použití:
not <test: test>
  • Popis: Neguje výsledek zadaného testu.
  • Balíček: <výchozí>
  • Viz: Jak začít

True

  • Použití:
true
  • Popis: Vždy odpovídá.
  • Balíček: <výchozí>

False

  • Použití:
false
  • Popis: Nikdy neodpovídá.
  • Balíček: <výchozí>

Akce

Require

  • Použití:
require <packages: string-list>
  • Popis: Načte zadané rozšíření, aby bylo možné použít jeho metody nebo úpravy.
  • Balíček: <výchozí>
  • Viz: Začínáme

FileInto

  • Použití:
fileinto <folder: string>
  • Popis: Přesune zpracovávanou zprávu do určité složky.
  • Balíček: fileinto
  • Viz: Jak začít

Addflag

  • Použití:
addflag <list-of-flags: string-list>
  • Popis: Přidá zadaný příznak ke zpracovávané zprávě.
  • Balíček: imap4flags
  • Viz: Jak začít

Removeflag

  • Použití:
removeflag <list-of-flags: string-list>
  • Popis: Odebere zadané příznaky ze zpracovávané zprávy.
  • Balíček: imap4flags

Setflag

  • Použití:
setflag <list-of-flags: string-list>
  • Popis: Odstraní všechny příznaky a nastaví zadané příznaky u zpracovávané zprávy.
  • Balíček: imap4flags

Stop

  • Použití:
stop
  • Popis: Zastaví zpracování všech Sieve filtrů. Následující Sieve filtry se nespustí.
  • Balíček: <výchozí>

Return

  • Použití:
return
  • Popis: Zastaví zpracování aktuálního Sieve filtru. Následující Sieve filtry se i nadále spustí.
  • Balíček: include

Set

  • Použití:
set [MODIFIER] <name: string> <value: string>
  • Popis: Vytvoří nové proměnné spojující zadaný název se zadanou hodnotou.
  • Balíček: variables
  • Viz: Vytváření proměnných

Discard

  • Použití:
discard
  • Popis: Zahodí zprávu na konci tohoto Sieve filtru. Po zahození se již nespustí žádné další Sieve filtry.
  • Balíček: <výchozí>

Keep

  • Použití:
keep
  • Popis: Vrátí zpět poslední příkaz discard. Projeví se pouze v případě, že je ve stejném Sieve filtru. Pokud nebylo provedeno žádné zahození, tento příkaz neudělá nic.
  • Balíček: <výchozí>

Odmítnout

  • Použití:
reject <reason: string>

Expire

  • Usage:
expire <unit: "day" / "minute" / "second"> <value: string>

Unexpire

  • Použití:
unexpire
  • Popis: Odstraní čas vypršení platnosti zprávy.
  • Balíček: vnd.proton.expire

Zpráva v nepřítomnosti

  • Použití:
vacation [":days" number] [":subject" string] [":mime"] [":handle" string] <reason: string>
  • Popis: Odešle automatickou odpověď na SMTP adresu odesílatele se zadaným důvodem jako tělem zprávy.
  • Balíček: vacation (vyžaduje placený účet)
  • Viz: Dovolenkové zprávy a testy data

Valid External List

  • Usage:
valid_ext_list <ext-list-names: string-list>
  • Popis: Testuje, zda jsou všechny zadané externí seznamy podporované a platné.
  • Balíček: extlists