Mail, który sam wygasa — bez przenoszenia z INBOX
Część maili jest ważna tylko kilka dni. Zamiast przenosić je do folderu „na później" — gdzie nikt już ich nie przeczyta — oznaczamy je w Sieve nagłówkiem retencji i usuwamy automatycznie wprost z INBOX, kiedy faktycznie wygasną.
- zależności poza Pythonem i doveadm
- 0
- generyczny skrypt obsługuje każdą nową regułę retencji
- 1
- licencja — opublikowane jako open source
- MIT
Kontekst
Przeniesienie maila z INBOX do innego folderu bywa najszybszym sposobem, żeby o nim zapomnieć na dobre. Foldery zakładane „na później" działają jak szuflada: wiadomość znika z pola widzenia w momencie przeniesienia, nie w momencie, w którym faktycznie przestaje być ważna.
Na naszym serwerze pocztowym część maili — raporty z backupów, powiadomienia administracyjne, mailingi — była istotna tylko przez kilka dni. Dotychczasowe reguły Sieve przenosiły je do folderów, w których nazwie była już zakodowana reguła retencji („administracyjne, 7 dni"), a osobny cron czyścił te foldery po przekroczeniu wieku. Mechanizm czyszczenia działał bezbłędnie — problem był wcześniej: mail trafiał do folderu w momencie dostawy, więc nikt go już nie czytał, niezależnie od tego, jak szybko potem został usunięty.
Przebieg
Sprawdziliśmy, co już istnieje. Sieve sam z siebie nie potrafi wyrazić warunku „starszy niż N dni" — rozszerzenia daty porównują tylko z wartością wpisaną na trwałe w skrypcie, a sam skrypt uruchamia się jednorazowo, w momencie dostawy, kiedy wiek wiadomości wynosi zero. Wbudowane mechanizmy Dovecota (autoexpunge, plugin expire) obejmują całą skrzynkę, bez dopasowania po nadawcy czy temacie. Dla Roundcube nie istnieje żadna wtyczka realizująca czyszczenie istniejącej poczty według reguł — temat wraca na forach i liście mailingowej Roundcube, zawsze z tą samą odpowiedzią: trzeba to zrobić po stronie serwera.
Rozdzieliliśmy politykę od wykonania. Sieve ma rozszerzenie editheader (RFC 5293) — wkompilowane w Pigeonhole, ale wyłączone domyślnie, bo modyfikuje treść wiadomości. Po jego włączeniu reguła Sieve po prostu oznacza mail nagłówkiem X-Retention-After: 7 i zostawia go tam, gdzie i tak by trafił — zwykle w INBOX, w pełni widocznego. Cała wiedza o tym, co jest tymczasowe, zostaje w Sieve — zupełnie jak dotąd.
1require ["editheader"];2if header :contains "from" "newsletter@example.com"3{4 addheader "X-Retention-After" "7";5}
Zbudowaliśmy jeden generyczny egzekutor. Osobny skrypt nie wie nic o kategoriach: czyta nagłówek i datę wiadomości, i usuwa to, co przeterminowane — wiek liczy w całości doveadm search ... sentbefore, bez własnej arytmetyki dat. Nowa reguła retencji to jedna linia w Sieve, zero zmian w skrypcie. Dzięki temu samemu rozszerzeniu Roundcube automatycznie pokazał w swoim edytorze filtrów akcję „Dodaj nagłówek do wiadomości" — bez instalowania żadnej wtyczki.
Efekt
Rozwiązanie działa produkcyjnie na naszej infrastrukturze pocztowej. Opublikowaliśmy je jako otwarte oprogramowanie: sieve-retention na GitHub — zero zależności poza Pythonem i doveadm, licencja MIT.
To nie był projekt zamówiony przez klienta — powstał, bo sami na co dzień administrujemy tą infrastrukturą i natrafiliśmy na problem, na który nie było gotowej odpowiedzi. Tak pracujemy przy obsłudze poczty, DNS i hostingu dla naszych klientów: kiedy standardowe narzędzia nie wystarczają, budujemy brakujący element — i oddajemy go społeczności, jeśli może się przydać komuś innemu.