Stránka 1 z 1

28. 6. 2017 Graylist

Napsal: 30. 6. 2017 09:18
od Sykorajak
Úloha na zpracování elektronické pošty podle stavů odesilatelů.

V proměnné $MAIL je cesta k souboru, v kterém jsou uloženy maily (formát souboru):

From Odesilatel Datum

Subject TextSubjectu
Telo
.
.
Konec tela

From Odesilatel Datum

.atd

Bude se pracovat s daty, formát si můžete rozmyslet (zvolil jsem ten, co se používá u touch -t)
Budeme si někde vést informaci o stavech odesilatelů (odesilatel se může nacházet v graylistu, whitelistu nebo blacklistu).
Podle stavů budeme maily zpracovávat. Na to poslouží dva soubory.

graylist (formát volitelný, já si třeba zvolil podobný /etc/passwd, takto:)
Odesilatel:Stav:Timeout
Graylist je váš soubor (databáze), můžete si s ní dělat co chcete, měly by se v ní dát lehce uložit a upravit jednotlivá pole.
Stav: (CHECK|ALLOW,DENY)

sender.cfg (formát pevně daný, co řádek, to odesilatel, bud' je ve whitelistu nebo blacklistu)
odesilatel (ALLOW|DENY)

Dále existuje konfigurační soubor, který nám nastaví, jak budeme zpracovávat stavy a posílat jeden speciální mail:
graylist.cfg (formát volitelný, já si zvolil řádky)
#1 Subject potvrzovacího mailu
#2 Jméno souboru s textem potvrzovacího mailu
#3 CHECK ALLOW DENY timeouty ve dnech, třeba (30 30 30 - každý časový interval je nastaven na 30 dnů)
#4 Jméno souboru s log filem (všechny operace skriptu s poštou budeme někam vypisovat)

Co máte dělat
Máte vytvořit skript, který soubor s maily projde právě jednou a každý mail zpracuje podle stavu odesilatele.

Podívám se, zda je odesilatel uveden v sender.cfg nebo graylistu. Pokud má nastaven ALLOW nebo DENY v sender.cfg,
mail hned odešlu nebo zahodím. Pokud je v graylistu, musím zkontrolovat stav, ale i timeout, který mi udává platnost
stavu. Pokud jsem s datem mailu mimo timeout, stav se mění.
stav CHECK
(datum odeslání < TIMEOUT)
Čekám na potvrzovací mail a pokud mail potvrzovací není, někam ho ukládám (můžu si zvolit, jak a kde).
Pokud mail je potvrzovací mail, stav se mění na ALLOW (ten se nastaví na X dnů, podle záznamu v graylist.cfg) a posílám
potvrzovací mail (jeho konfigurace uvedena v graylist.cfg na prvních dvou řádcích) a dále odesilám ty maily, které jsem si
uložil, protože přišly ve stavu CHECK.
(datum odeslání > TIMEOUT)
Zahazuji uložené maily ze stavu check. Stav se mění asi na DENY nebo řádka s odesilatem se z graylistu ztratí (to už si nepamatuju,
moc podstatné to není).
stav ALLOW
(datum odeslání < TIMEOUT)
Mail pošlu, timeout updatuju (datum odeslání + X ALLOW dní z graylist.cfg).
(datum odeslání > TIMEOUT)
Mail zahodím, přejdu do stavu DENY a nastavím timeout (datum odeslání + X DENY dní z graylist.cfg).
stav DENY
(datum odeslání < TIMEOUT)
Mail zahazuji.
(datum odeslání > TIMEOUT)
Přecházím do stavu CHECK, mail se ukládá.

Řešení
Řešil jsem s AWK za jedna, načetl jsem graylist.cfg, sender.cfg, graylist, soubor v $MAIL.
Pracoval jsem s odesilateli jako s polem: stav[odesilatel],timeout[odesilatel] (pokud byl odesilatel v sender.cfg, tak jsem si dal timeout -1, pro rozlišení whitelistu, blacklistu a graylistu)
Pokud bylo potřeba, mail jsem si uložil výpisem do souboru (podle názvu těchto souborů a jejich existence mimo AWK jsem maily potom odesílal).
Při průchodu souboru s poštou v $MAIL jsem si přečetl From, ale pamatoval si, že hned za ním je o dva řádky dole bude Subject. Po čtení Subjectu jsem mail zpracoval.
Graylist jsem updatoval tak, že jsem si udělal nový soubor (new_graylist), do kterého jsem v END větvi vypisoval nové řádky odesilatel:stav:timeout podle hodnot pole.
Potom jsem za tato data vypsal původní obsah graylistu a použil sort -u na new_graylist, abych si uchoval jen ty novější záznamy. To jsem uložil do graylistu.

Dál se dalo řešit odesílání mailu, ale to Forst moc neřešil, tohle asi šlo udělat líp:

soubory s maily, které jsou s odesláním závislé na potvrzovacím mailu (proměnná mail nějaká counter proměnná v awk):
---CEKAM$mail$odesilatel
pokud odesilatel poslal potvrzovací mail, existuje soubor
---POTVRZ$odesilatel, jeho existencí pošlu všechny maily v CEKAM$mail$odesilatel
pokud mail můžu hned odeslat
---OK$mail
pokud mail zahazuji, no tak ani nemusí soubor existovat

Forst dál zmínil, že dobrý nápad bylo použít nějaký zámek na skript.