Модул 6 · 6.1
Как работят филтрите
Модул 6: Автоматично: филтри и отсъствие · Време за четене: 10 минути
Учебна цел: След този урок ще можете да обясните къде и кога работят филтрите, да прочетете филтърен скрипт на Sieve и да предвидите в коя папка ще попадне едно входящо писмо.
Основни понятия: филтър, Sieve, ManageSieve, набор филтри, правило, условие, действие, имплицитно запазване, stop, съдържа, е равно на, съвпада с израз
Филтрите работят на сървъра
Филтърът подрежда пощата Ви автоматично: писмата с „factuur“ в заглавието отиват в папката Facturen (фактури), бюлетините в отделна папка. Най-важното, което трябва да знаете: това подреждане не става в webmail, а на пощенския сървър, в момента, в който писмото бъде доставено в пощенската Ви кутия.
От това следват три неща:
- Филтрите работят и когато webmail е затворен. Лаптопът Ви може да е изключен. Телефонът вижда писмото веднага в правилната папка.
- Филтрите работят само за нова поща. Писмата, които вече са в пощенската Ви кутия, остават там, където са. Ако създадете филтър днес, старите писма преместете сами.
- Филтрите важат за една пощенска кутия. Всяка пощенска кутия има свои филтри. Ако искате да уредите нещо за всички пощенски кутии на Вашия домейн, например да блокирате подател, направете го в контролния панел на Вашия хостинг.
Филтрите са написани на Sieve, прост език, създаден специално за филтриране на поща (RFC 5228). Пощенският сървър на WebOké използва Dovecot с Pigeonhole, реализацията на Sieve в Dovecot. Webmail превръща изборите Ви във формуляра в Sieve скрипт и го изпраща до сървъра чрез протокола ManageSieve (RFC 5804). Не е нужно да пишете на Sieve, но който може да го чете, разбира точно какво правят филтрите му.
Набор филтри, правила, условия и действия
Наборът филтри е целият скрипт: всички филтри на пощенската Ви кутия в един файл. Можете да имате няколко набора филтри, но винаги само един от тях е активен.
В набора филтри се намират филтрите, които в webmail се наричат и правила. Всеки филтър има:
- име, само за Вас;
- обхват: писмото трябва да отговаря на всички правила, на едно от правилата, или филтърът важи за всички писма;
- едно или повече условия: къде гледа филтърът (заглавие, подател, друг заглавен ред), как сравнява и с какъв текст;
- едно или повече действия: какво се случва, ако условията са изпълнени.
За сравняването има три начина:
| В webmail | В Sieve | Значение |
|---|---|---|
| съдържа | :contains | текстът се среща някъде в заглавния ред |
| е равно на | :is | заглавният ред е точно този текст |
| съвпада с израз | :matches | шаблон с * (нула или повече знака) и ? (точно един знак) |
И при трите начина главните и малките букви нямат значение. По подразбиране Sieve сравнява с правилото i;ascii-casemap, което третира главните и малките букви еднакво. Така „factuur“ намира също „FACTUUR“ и „Factuur“.
Ето как изглежда един набор филтри
В webmail можете да видите набора филтри като текст чрез Филтри > Действия > Редакция на набор филтри. Пример, както го записва webmail:
require ["fileinto"];
# rule:[Nieuwsbrieven]
if exists "List-Id"
{
fileinto "Nieuwsbrieven";
stop;
}
# rule:[Facturen]
if allof (header :contains "subject" "factuur")
{
fileinto "Facturen";
}
# rule:[Collega Daan]
if false # header :contains "from" "daan@example.com"
{
fileinto "INBOX.Team";
}Ред по ред:
require ["fileinto"];иска от сървъра разширението, което е нужно за преместване в папка. Webmail сам го поставя най-отгоре, заедно с всички разширения, които скриптът използва.# rule:[Nieuwsbrieven]е коментар. По него webmail разпознава името на Вашия филтър. Сървърът пропуска този ред.if exists "List-Id"е условието: писмото има заглавен ред List-Id. Бюлетините и пощенските списъци имат такъв (RFC 2919).fileinto "Nieuwsbrieven";премества писмото в папката Nieuwsbrieven (бюлетини). Името на папката е пълното име на сървъра, с точка като разделител (урок 5.1). Така папка под Входящи се казваINBOX.Team.stop;спира целия скрипт. Следващите филтри вече не разглеждат това писмо. В webmail това действие се казва Спри проверка на други условия.if false # ...е изключен филтър. Ако изключите Включен филтър, webmail превръща условието вfalse: никога не е вярно. Старото условие остава като коментар, за да можете по-късно да го включите отново.

Отгоре надолу
Сървърът чете скрипта отгоре надолу и разглежда всеки филтър. При това важат три правила.
1. Без действие писмото остава във Входящи. Sieve познава имплицитното запазване (implicit keep, RFC 5228, раздел 2.10.2): ако нито един филтър не направи нищо, писмото просто попада във Входящи.
2. След преместване писмото не остава и във Входящи. Командата fileinto изключва имплицитното запазване. Писмото попада в избраната папка, а не допълнително във Входящи. Ако искате и двете, използвайте Копирай писмото във.
3. Без stop следващите филтри също проверяват писмото. Ако липсва stop, сървърът продължава със следващия филтър. Ако и той пасва, сървърът изпълнява и неговото действие. Две премествания в две папки означават, че писмото попада и в двете папки. С stop решава първият подходящ филтър.
Затова редът има значение. В горния пример Nieuwsbrieven стои над Facturen, със stop. Бюлетин с „Je factuur“ в заглавието отива в Nieuwsbrieven, а не във Facturen. Ако обърнете реда, същият бюлетин попада във Facturen, защото този филтър няма stop и сега е първи. Тогава бюлетинът дори ще се окаже и в двете папки. Затова поставяйте най-конкретните филтри най-отгоре и им давайте stop.
Проследяване на писмо: така го предвиждате
Вземете едно писмо и проследете скрипта така, както го прави сървърът:
- Започнете от първия филтър. Изключен ли е (
if false)? Пропуснете го. - Изпълнено ли е условието? Гледайте точно заглавния ред:
subjectе заглавието,fromе подателят с име и адрес,toе получателят. - Ако да: изпълнете действията. Ако има
stop, сте готови. - Ако не, или ако няма stop: преминете към следващия филтър.
- Накрая: ако нито един филтър не е преместил или изтрил писмото, то е във Входящи (
INBOX).
С тези пет стъпки можете да прочетете всеки скрипт, дори и дълъг.
На практика: така работи в webmail
Филтрите ще намерите в Настройки > Филтри. Списъкът показва филтрите Ви в реда, в който сървърът ги изпълнява; можете да ги плъзгате, за да промените реда. Под Действия е Редакция на набор филтри: там виждате и променяте скрипта като текст. Стъпките за нов филтър са описани в ръководството за Roundcube, в раздела Създаване на филтър. В други webmail услуги работи по подобен начин: Gmail има филтри, Outlook.com има правила. Те не използват Sieve, но и там редът и спирането имат значение.
Обобщение
- Филтрите работят на пощенския сървър при доставката, следователно и когато webmail е затворен, и само за нова поща.
- Webmail записва филтрите Ви като Sieve скрипт (RFC 5228) и го поставя на сървъра чрез ManageSieve.
- Съдържа, е равно на и съвпада с израз по подразбиране не различават главни и малки букви.
- Ако никой филтър не направи нищо, писмото остава във Входящи; след преместване то не остава и във Входящи.
- Филтрите се изпълняват отгоре надолу; stop прекратява скрипта, затова редът определя резултата.
Тест (quiz)
Задача
Задача A6.1: Къде ще попадне това писмо? Отворете материала filters-1.txt, набор филтри, както го записва webmail, и berichten-1.txt, със заглавните редове (хедъри) на четири входящи писма, номерирани от 1 до 4. Проследете всяко писмо по петте стъпки от този урок: отгоре надолу, като пропускате изключените филтри и внимавате за stop. За всяко писмо въведете името на папката, в която попада, точно както е в скрипта; ако писмото попада във Входящи, въведете INBOX. Програмата сравнява четирите Ви отговора с ключа за отговорите и за всяко писмо показва кой филтър е бил решаващ.
Прочетете още
Където са описани стъпки в webmail, те се отнасят за webmail на WebOké; в други webmail услуги работи по подобен начин.
- Roundcube Webmail 7.1: Създаване на филтър
- Roundcube Webmail 7.2: Примери за полезни филтри
- Сървърни правила за имейл (филтри на сървъра)
- RFC 5228, Sieve: An Email Filtering Language (на английски): https://www.rfc-editor.org/rfc/rfc5228
- RFC 5804, ManageSieve (на английски): https://www.rfc-editor.org/rfc/rfc5804
- RFC 2919, List-Id (на английски): https://www.rfc-editor.org/rfc/rfc2919
