Byla vydána nová stabilní verze 7.2 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 134. Přehled novinek i s náhledy v příspěvku na blogu.
Eric Migicovsky, zakladatel společnosti Pebble, v lednu oznámil, že má v plánu spustit výrobu nových hodinek Pebble s již open source PebbleOS. Včera je představil a spustil předprodej: Core 2 Duo za 149 dolarů s dodáním v červenci a Core Time 2 za 225 dolarů s dodáním v prosinci.
3D software Blender byl vydán ve verzi 4.4. Podrobnosti v poznámkách k vydání. Videopředstavení na YouTube.
Byla vydána Java 24 / JDK 24. Nových vlastností (JEP - JDK Enhancement Proposal) je 24. Nová Java / JDK vychází každých 6 měsíců. LTS verze jsou 8, 11, 17 a 21 a bude 25.
Byla vydána betaverze Fedora Linuxu 42, tj. poslední zastávka před vydáním finální verze, která je naplánována na úterý 15. dubna. Z novinek (ChangeSet) lze vypíchnout edici KDE Plasma Desktop nebo spin Cosmic. Vydán byl také Fedora Asahi Remix 42 Beta pro Apple Silicon.
Byla vydána verze 12.00 linuxové distribuce SystemRescue, původně SystemRescueCd, určené pro záchranu systémů a dat. Přehled novinek v changelogu. Přidána byla podpora bcachefs, Linux byl povýšen na verzi 6.12.19, GParted na verzi 1.7.0, nwipe na verzi 0.38, dump na verzi 0.4b49, …
Google kupuje společnost Wiz za 32 miliard dolarů.
Byly zpracovány a na YouTube zveřejněny videozáznamy jednotlivých přednášek z letošního Installfestu.
Společnost Bambu Lab spustila na Kickstarteru kampaň CyberBrick: Beyond Bricks. Jedná se o modulární systém programovatelných a dálkově ovládaných hraček. Objednat si lze jenom moduly s čipy a hračky si vytisknout na 3D tiskárně.
Mikrokontroléry RP2350A a RP2350B jsou již volně v prodeji. Představeny byly v srpnu loňského roku společně s Raspberry Pi Pico 2.
Z předchozího dílu seriálu bohužel vypadla jedna „maličkost“, která je však důležitá pro správnou funkci Dovecot LDA. Jde o to, že se doručovací agent potřebuje dotazovat do databáze uživatelů, aby mohl zprávy správně doručovat. Agent se však nedotazuje sám, využívá k tomu stejnou službu, jakou využívají i služby pro IMAP a POP3.
Výchozí nastavení je takové, že by komunikace měla fungovat. Často to však fungovat nebude – a to konkrétně tehdy, nebude-li mít dotazující se proces dostatečná práva. Proto je dobré nastavit si věci okolo práv explicitně. Následující fragment souboru /etc/dovecot.conf
obsahuje – jako obvykle – jen to, co se mění:
auth default { socket listen { user = vmail group = vmail } }
Speciální soubor socketu je zde umístěn na /var/run/dovecot/auth-master
(výchozí hodnota) a oprávnění jsou 0600 (dtto), tedy s přístupem pouze pro vlastníka. Výchozím vlastníkem je však root
, v čemž může být právě problém, protože pokud se pokusí připojit proces běžící pod jiným uživatelem (typicky vmail
, což je vlastník úložiště pošty), selže to. Z bezpečnostních důvodů není dobré rozšiřovat okruh oprávněných uživatelů, čili se zde nastaví ten uživatel, který bude tento socket používat, což je vmail
.
Přestože spousta lidí pracuje s elektronickou poštou pouze formou čtení a odesílání zpráv, je nemálo těch, kteří žádají víc. Tím „víc“ se v tomto smyslu rozumí to, že si vytvářejí pro své zprávy různé složky, kam je chtějí třídit, a to často nejlépe automaticky. Chtějí také, aby se některé zprávy zahazovaly (nemusí přitom jít o spam) nebo aby se přesměrovávaly na jiné adresy. Někdo také požaduje, aby během jeho pobytu na dovolené server automaticky posílal informaci o tom, že si příjemce zprávu přečte až někdy později.
Některé z těchto požadavků splňují implementace v klientech (např. Mozilla Thunderbird), nicméně některé z požadavků takto splnit nejdou. Navíc se klientsky řešené třídění/filtrace uplatní jen v tomto klientovi, což činí problémy při přístupu z více počítačů, případně ještě v kombinaci s webovým rozhraním. Proto je mnohem výhodnější, když se o všechno postará server – nastaví se to jen jednou, může to umět mnohem víc a zpracování probíhá ihned po příchodu zprávy.
Pro snadnou implementaci uvedených funkcí vznikla otevřená technologie Sieve (jejími otci jsou vývojáři Cyrus IMAP Serveru) popsaná aktuálně dokumentem RFC 5228. Základem technologie je jazyk, jímž se popisuje požadované chování serveru. Aby technologie „ožila“, je samozřejmě potřeba implementovat program, který na základě pravidel popsaných jazykem Sieve zpracovává přijaté zprávy a provádí s nimi požadované akce.
V rámci poštovního serveru na bázi Postfix + Dovecot bude takovou implementací plugin do Dovecot LDA, tedy do doručovacího agenta. Existují v zásadě dva možné způsoby, jak takový plugin připravit. Jednou z možností je použít nativní plugin, což je od verze 1.2 doporučená cesta. Lze však také využít upravenou implementaci ze serveru Cyrus (CMU Sieve), což je jediný možný způsob u verze 1.1 a starších. CMU Sieve však nepodporuje tak širokou škálu funkcí jako Dovecot Sieve, což se týká i některých příkladů uvedených v tomto článku.
Teď by někdo možná očekával popis toho, co všechno Sieve a jeho implementace umí. Ale tento popis bude lepší nechat na později, na konkrétní ukázky Sieve kódu. Ještě totiž zbývá vyřešit jeden netriviální problém, a to jak na server definovaná pravidla dostat.
Opět je více možností. Nejjednodušší je uložit si ta pravidla do souboru a ten pak nakopírovat na patřičné místo v souborovém systému poštovního serveru. To samozřejmě lze a je to výhodné pro globální pravidla (pokud nějaká jsou; například ve firmě se to může někdy hodit). Uživatelé však přivítají spíše jiný způsob, tedy takový, kde si budou moci definovat pravidla přímo z poštovního klienta.
Aby toto bylo možné, musí server podporovat mechanismus pro práci s pravidly. Takovým mechanismem je ManageSieve, což je otevřený komunikační protokol – jeho definice je sice zatím jen ve fázi draftu, nicméně se tento protokol běžně používá. I tady je více možností, jak ManageSieve provozovat. Jednou z nich je použít nativní implementaci, která je distribuována samostatně a bohužel vyžaduje určité úpravy zdrojového kódu. Dále existuje démon pysieved napsaný v jazyce Python, který je snadno a bezproblémově použitelný, vyžaduje však samozřejmě interpret Pythonu. Případně lze použít některé další existující implementace.
Základem zprovoznění Sieve na serveru je nastavení správných parametrů v konfiguračním souboru /etc/dovecot/dovecot.conf
. Nejprve musí však být plugin nainstalován, a to buď z balíčku, nebo kompilací ze zdrojových kódů. Výsledný nativní plugin se jmenuje sieve
; plugin kompilovaný na základě starého CMU Sieve nese název cmusieve
. Takto může vypadat konfigurační soubor dovecot.conf
:
protocol lda { mail_plugins = sieve quota } plugin { sieve = /var/mail/virtual/%d/%n/script.sieve sieve_global_path = /etc/sieve/default.sieve }
Jsou uvedeny jen ty části, které jsou nové nebo se mění. V první sekci, tedy lda
, přibyl v seznamu pluginů plugin sieve
(plugin quota
z minulého dílu zůstává). Pokud by byl nainstalován plugin cmusieve
, použil by se pochopitelně ten.
Další dvě volby jsou v sekci plugin
. Parametr sieve
je velmi důležitý, protože definuje šablonu pro tvorbu cesty ke skriptům (souborům s pravidly) pro jednotlivé uživatele. V tomto případě jde o cestu z minulého dílu – virtuální uživatelé mají adresáře tvořené názvem domény a uživatelským jménem. Lze používat běžné proměnné určené pro konfiguraci programu Dovecot. Parametr sieve_global_path
není až tolik potřeba, definuje cestu k souboru s globálními pravidly. Tento soubor se použije jen tehdy, nemá-li uživatel vytvořen svůj vlastní. Nelze přes něj tedy vynucovat nějaká pravidla, je však užitečný v případě, že je žádoucí nějak obecně nakládat se zprávami a jen uživatelé, kteří potřebují něco specifického, si vytvářejí své vlastní soubory.
Konfigurace může být bohatší, nicméně toto zcela postačuje pro plnohodnotný provoz Sieve. Pokud nyní budou v uživatelském nebo globálním souboru nějaká pravidla, doručovací agent se podle nich zachová a například zprávu zatřídí do požadované složky nebo ji přesměruje jinému příjemci.
Přestože existují i určité možnosti, jak si pravidla jednoduše „naklikat“, GUI nástroje nikdy nevloží do rukou uživatele takovou sílu, jakou nabízí přímé psaní pravidel v jazyce Sieve. Proto je dobré znát aspoň základy toho, jak se pravidla píší a hlavně co vůbec Sieve umožňuje. Asi bude nejlepší začít hned příkladem:
require "fileinto"; if header :contains "subject" "faktura" { fileinto "Faktury"; }
Příklad je jednoduchý a dá se z něj snadno zjistit, co taková definice dělá. Na prvním řádku je direktiva require
, která říká, které rozšíření je potřeba použít. Jednotlivá rozšíření totiž implementují různé operace – a podle toho, co se použije v pravidlech, je také potřeba si vyžádat potřebná rozšíření. Některá rozšíření jsou definována přímo v RFC 5228, další v jiných dokumentech, například RFC 5229, 5490 a řadě dalších.
Pak už je tu přímo samotné pravidlo. To zjišťuje, zda hlavička Subject
(tedy předmět zprávy) obsahuje slovo „faktura“ – v takovém případě přesune zprávu do složky „Faktury“. Jednoduché, že? Zde skutečně ano. Ovšem pro psaní složitějších pravidel je třeba pochopit, jak se konstruují podmínky a jak se vůbec potom pravidla zpracovávají.
Výše uvedený test nerozlišuje velká a malá písmena, proto bude pravidlem zpracován stejně předmět „Faktura č. 12345“ jako „Re: faktura“ nebo jiné takové. To se týká všech testů hlaviček.
Pravidla sestávají z podmínek (testů) a akcí. Podmínka je prostě nějaký test (typicky na obsah některé hlavičky, těla apod.), akce je to, co se v případě splnění podmínky vykoná. Opět krátký příklad:
if size :over 1M { discard; }
Toto pravidlo říká, že pokud velikost zprávy překročí 1 MB, zpráva se zahodí (akce discard
). Je-li toto pravidlo jediné a zpráva jím není explicitně zahozena, doručí se jako obvykle. Implicitně se totiž zpráva ponechává ke zpracování. Lze si to představit i tak, jako by byla na konci uvedena akce keep
, tedy ponechání zprávy.
Dále si v obou příkladech povšimněte, že se v podmínce uvádí vždy nejdřív druh testu, potom operátor (:contains
, :over
) a potom všechny potřebné operandy. Jinak řečeno, pro zápis testu se používá prefixová notace (operátor je na začátku). Další zákonitosti se ukáží opět v příkladu:
require "fileinto"; require "imap4flags"; if header :contains "subject" "upomínka" { setflag "$Label1"; } elsif header :contains "subject" "***spam***" { setflag "$Junk"; fileinto "Junk"; }
Podmínky lze skládat způsobem uvedeným v příkladu. Lze tak zamezit nechtěnému spouštění akcí nebo zbytečným testům. Zde bude druhá podmínka testována jen v případě, že zpráva první podmínce nevyhověla. Dále je v příkladu vidět použití rozšíření imap4flags
. To slouží k nastavování příznaků zpráv – jak specifických (zde Junk
, tedy „označení jako spam“), tak obecných štítků (zde použitý štítek č. 1 bývá v klientech obvykle červený, což lze využít k automatickému zvýraznění důležitých zpráv). Akcí může být pro každou podmínku více, což je zde také vidět.
Testy na hlavičky mohou samozřejmě testovat kteroukoli hlavičku zprávy. Většinou se v praxi testují Subject
, From
a To
, lze však testovat i některé méně používané nebo vysloveně specifické hlavičky a dát tak zpracování zpráv doslova novou dimenzi. Takovou zajímavou hlavičkou je například Precedence
, používaná u hromadných zpráv.
require "copy"; if header :contains "subject" ["faktura", "výzva k platbě", "vyzva k platbe"] { redirect :copy "uctarna@moje.firma"; } elsif header :contains "subject" ["upomínka", "upominka"] { redirect "uctarna@moje.firma"; }
Příklad ukazuje, jak naložit s příchozími fakturami a upomínkami. Obě mají být přeposílány do účtárny, ovšem faktury je třeba přeposílat jen jako kopii, tedy nechat zprávu doručit i do schránky, zatímco u upomínek to potřeba není. K tomu se používá rozšíření copy
a do akce redirect
se přidá ještě :copy
, čímž se změní chování této akce (pošle kopii místo přesměrování zprávy).
České znaky v příkladu jsou kódovány jako UTF-8. To se zde týká i názvů složek. Dovecot Sieve si je pro vnitřní potřebu překódovává, protože například názvy složek jsou v upraveném UTF-7.
V příkladu si povšimněte ještě jedné věci – způsobu zápisu polí. Dávají se do hranatých závorek a prvky se oddělují čárkou. Pokud se pole použije jako parametr testu, testují se všechny hodnoty, dokud nějaká neuspěje. Je-li třeba testovat více podmínek najednou, ať už ve smyslu logického součtu či součinu (tj. musí být splněna aspoň jedna podmínka nebo naopak všechny), použije se tento zápis:
if allof(header :contains "subject" "New version", header :contains "from" "releases@nejaka.domena") { redirect "admin@moje.domena"; }
Cílem uvedeného konstruktu je přesměrovat na administrátora informace o nových verzích určitého programu – testuje se proto předmět zprávy a současně i adresa odesílatele. Operátor allof
říká, že musí být splněny všechny podmínky uvedené v kulatých závorkách. Pro případ opačný, tedy splnění kterékoli podmínky, by se použil operátor anyof
.
Ze zajímavých funkcí lze zmínit ještě například automatickou odpověď. Někdo požaduje, aby se odesílatelé zpráv dozvěděli, že si zprávy přečte až později. To lze zajistit například takovýmto pravidlem:
require ["vacation", "variables"]; if header :matches "subject" "*" { vacation :days 7 :subject "Auto Re: ${1}" "Bohužel si teď vaši zprávu nemohu přečíst. Odpovím Vám po 1.8.2010. Děkuji za pochopení."; }
Toto bude fungovat tak, že pokud přijde zpráva, Dovecot LDA na ni automaticky odpoví. Použije k tomu původní předmět (kterému předřadí Auto Re:
) a určený text. Přijde-li další zpráva od stejného odesílatele během intervalu určeného pomocí :days
(zde 7 dní), další automatická odpověď se již neodesílá. Na prvním řádku si můžete všimnout zápisu požadovaných rozšíření pomocí pole (nahrazuje dva příkazy require
), v podmínce zase testu matches
, který umožňuje testovat za pomoci „divokých karet“ (* a ?; komu by to nestačilo, existuje rozšíření regex
, které přidává do Sieve podporu regulárních výrazů).
Text je opět v kódování UTF-8. Lze však použít i jiná kódování nebo dokonce mnohem bohatší možnosti dané standardem MIME (např. alternativní verze, případně i přílohy, jakkoli je to bizarní). Jak se s tím pracuje, se dozvíte například v dokumentu RFC 5230, který se zabývá rozšířením vacation
.
Uvedené příklady a komentáře k nim nepopisují ani nepatrný zlomek toho, co všechno Sieve dokáže. Ostatně už fakt, že skoro každé rozšíření má svůj vlastní dokument RFC, svědčí o komplexnosti této technologie. Koho zajímají detaily, nechť nahlédne například právě do RFC, protože dobrých informačních zdrojů o této problematice zatím bohužel moc není.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
sieve_before
a sieve_after
, které umožňují definovat další Sieve skripty (nebo celé adresáře se skripty). Pravidla v sieve_before
se zpracují před uživatelskými pravidly, sieve_after
po nich (ale jen v případě, že zpráva zůstává ve zpracování). Takže pokud už se má nějaké zpracování vynucovat všem uživatelům (i když to obecně nevidím jako přínosné), lze to využít. Všechny tyto skripty (stejně jako skript s globálními pravidly) se musí předem kompilovat pomocí sievec
.
Vy sieve_before a sieve_after pouzivate uspesne?Nepoužívám vůbec. Zatím jsem neměl takovou potřebu a obecně mě nenapadá příliš případů, kdy to má smysl (proto jsem to ani neuvedl v článku). Nicméně to mohu příležitostně vyzkoušet.
sieve_before
a funguje bez problémů.
... xfilter "/usr/sbin/spamc" ... if (/^X-Spam-Status: *Yes/) { exception { to ... } } ...
require ["fileinfo", "copy"]; if header :contains "X-Spam-Status" "Yes" { setflag "$Junk"; fileinto ".Spam"; stop; } else { "fileinto" :copy folder: "/home/backup/%d/%n";Nicmene mi to nefunguje. Domnival jsem se, ze misto %d se doplni domena.tld a misto %n username. Existuje nejaky elegantni a funkcni zpusob, jak dostat z hlavicky uzivatele a domenu (treba i nejak parsovat To:)...?
if
, to else
už je zbytečné. Mimochodem zbytečný je i příkaz stop
, protože akce fileinto
ruší implicitní keep
(viz RFC 5228, bod 2.10.2) a žádný jiný důvod k uvedení zde není.
Není to myšleno jako zálohování (když tam vidím to backup)? Pokud ano, tak mi to nepřijde jako příliš smysluplné řešení, spíš jako takové "velkobratrské" (ukládá se všechno, nezálohuje se stav ke konkrétnímu okamžiku).
editheader
podle RFC 5293, bylo by to velmi jednoduché - stačilo by podle obálkového příjemce vytvořit novou hlavičku (např. X-Original-Recipient
), pak to přeposlat na speciálního uživatele (třeba velkybratr@moje.domena
), u něj pak tuto hlavičku rozežírat a zprávy správně třídit. Jenže protože zatím toto rozšíření podporováno není, nelze takové řešení použít.
Možná by se ale dala rozežírat hlavička Delivered-To
, protože je možné (ale to právě nevím), že se přidává do zprávy až na konci zpracování LDA. Chtělo by to prověřit, zda tam po přeposlání kopie nejsou ty hlavičky dvě. Pokud je tam opravdu jen ta první, je vyhráno - stačí hlavičku pomocí :domain
a :localpart
rozežrat do proměnných a podle nich pak uložit zprávu do správné složky.
require ["fileinfo", "copy", "envelope"]; if header :contains "X-Spam-Status" "Yes" { setflag "$Junk"; fileinto ".Spam"; stop; } else { "fileinto" :copy folder: "/home/backup/:domain/:localpart"; }
require ["fileinto", "copy", "envelope", "variables"]; ... if allof(envelope :domain :matches "to" "*", envelope :localpart :matches "to" "*") { fileinto :copy "/home/backup/${1}/${2}"; }Je to jen hrubý nástřel. Dělá to to, že se vyhodnocují obě části adresy obálkového příjemce, dají se do proměnných a tyto proměnné se pak použijí. Jenže zásadní problém bude v tom, že asi nebude možné použít absolutní cestu k poštovní složce (nezkoušel jsem, v dokumentaci o tom nic není, nicméně velmi pochybuji).
To:
, která nemusí odpovídat skutečnosti. Hlavičku Delivered-To:
jsem teď zkusil, ale tu použít nelze, protože se tam vloží ve druhém exempláři při doručování po přeposlání.
To ale stale neresi situaci, kdy potrebuji mit kopie ne v Maildiru urciteho uzivatele, ale v uplne jine cesteTo je velmi snadno řešitelné tím, že se ten Maildir umístí na tu správnou cestu.
Jeste mne teda napada vlozit pred frontu (v master.cf) skript, ktery by udelal kopii, respektive nakopiroval email do zaloh a zpravu poslal zpet do fronty postfixu kde ji prevezme deliver. Tohle asi neni uplne nejsistci reseni.Pak existují ještě jiná řešení. Tak například využít incron, pokud by už uměl rekurzivně sledovat celé podstromy filesystému (ššššššššš - to se snáší popel na moji hlavu
IN_MOVED_TO
, testovat, zda šlo o přesun z adresáře tmp
do new
v rámci inboxu (protože to je operace, kterou je završeno doručení zprávy) a pak už jen kopírovat příslušné zprávy.
zda šlo o přesun z adresáře tmp do new v rámci inboxuResp. spíš nejen v rámci inboxu, ale ve všech poštovních složkách kromě spamové.