Disassembler

Artificial intelligence is no match for natural stupidity.
10leden2012

Postfix: Fronty a práce s nimi


Všechny maily procházející přes postfix jsou zpracovávány pomocí front. Občas se stane, že některá zpráva je odeslána na špatnou adresu anebo je graylistnuta serverem příjemce. Taková zpráva pak zpravidla zůstane ve frontě a jednou za čas je opakován pokus o její doručení, dokud nevyprší její životnost. Ve výchozím nastavení postfixu je interval doručení nastaven mezi 300 a 4000 sekundami a živost zprávy ve frontě je pět dní. Co ale dělat, když se chci třeba podívat, jaké zprávy ve frontách jsou?

Fronta na banány


Postfix, respektive jeho součást zvaná qmgr obsluhuje pět front - active, bounce, corrupt, deferred a hold - tedy pro aktivní (příchozí i odchozí), notifikační, poškozené, odložené a zadržené zprávy. V aktivní frontě v ideálním případě žádnou zprávu nikdy neuvidíte. Pokud je ale mail doručován nějakému pomalému SMTP serveru, může se zde na chvíli objevit. Výchozí doba, jakou se váš server bude pokoušet doručit zprávu je 30 sekund. Po uplynutí této doby je server označen za nedostupný a zpráva skončí ve frontě odložených (deferred). V této frontě jsou zprávy, které se z nějakého důvodu nepodařilo doručit, ale nebyly přímo odmítnuty, ať už odesílajícím nebo přijímajícím serverem. Pokud byla zpráva odmítnuta, vrací se za asistence notifikační fronty příjemci, případně i postmasterovi, pokud je v konfiguraci nastaveno bonzování problémů, jak jsem popisoval v článku o upozorňování na nedoručitelné maily. Postfix si pak ke zprávám v deferred frontě nadělá časová razítka a pokouší se je doručit opakovaně. Interval doručení lze nastavit pomocí proměnných minimal_backoff_time a maximal_backoff_time. Dále je vhodné nastavit i queue_run_delay, která udává interval mezi jednotlivými skeny fronty odložených zpráv a měla by být nastavena na hodnotu nižší nebo stejnou než je minimal_backoff_time. Poslední zajímavá proměnná je maximal_queue_lifetime, která určuje, za jak dlouho bude odložená zpráva vrácena jako nedoručitelná. Část /etc/postfix/main.cf pro velmi nedočkavý server tedy může vypadat třeba takto

minimal_backoff_time = 120s
maximal_backoff_time = 1200s
queue_run_delay = 60s
maximal_queue_lifetime = 12h

Další fronty jen stručně. V corrupt jsou zprávy, se kterými si postfix neporadil a není schopen je doručit a ve frontě hold jsou zprávy zadržené, tj. postfix se u nich nebude pokoušet o opětovné doručení. Jak je možno zprávu zadržet se dozvíte níže.

Boudo, budko, kdo v tobě přebývá?


Co se tedy dá se zprávami ve frontách dělat? Můžeme je vypisovat a odstraňovat (to budeme dělat hlavně) a pak je můžeme zadržovat a znovu vkládat do front. K tomu všemu si vystačíme se dvěma příkazy - postqueue a postsuper. Pro výpis front slouží postqueue -p. Díky kompatibilitě se sendmailem je k totožnému výstupu možno použít i příkaz mailq. Výpis vypadá následovně

root@mail:~# postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
7D4A480382     5068 Fri Jan  6 10:24:10  user@example.cz
                  (connect to example.com[123.45.67.89]:25: Connection refused)
                                         rcpt@example.com

8FF697FA62   235380 Mon Jan  9 12:07:40  jiny.user@example.cz
(host in.smtp.cz[123.45.67.89] said: 430 <rcpt@example.com>: Recipient address rejected: Mailbox is blocked now. Please, try it again later. (in reply to RCPT TO command))
                                         rcpt@example.com

305EA80388     6145 Fri Jan  6 10:26:00  user@example.cz
                  (connect to example.com[123.45.67.89]:25: Connection refused)
                                         rcpt@example.com

-- 244 Kbytes in 4 Requests.

Jedná se ovšem o výpis všech front, takže postfix přidává identifikační značky, aby bylo poznat ve které frontě zpráva je. Zprávy ve frontě aktivních jsou označeny hvězdičkou, zprávy zadržené pak vykřičníkem. Ve výše uvedeném výpisu žádná taková značka není, tudíž se jedná pouze o maily v deferred frontě. Z výpisu se dá vyčíst i důvod odložení. Zprávy můžete mazat jednotlivě, podle ID nebo můžete vyprázdnit naráz celou frontu anebo smazat úplně všechny zprávy. Jednu zprávu smažete takto

postsuper -d 305EA80388

Kde 305EA80388 je ID zprávy vyčteno z výše uvedeného výpisu. Celou frontu odložených pak vymažete takto

postsuper -d ALL deferred

No a jak z výše uvedeného příkazu vyplývá, všechny zprávy ze všech front smažete pomocí jednoduchého

postsuper -d ALL

Další násilí


Jak jsem výše zmínil, poštu můžeme ještě zadržet a také můžeme násilně donutit postfix pokusit se doručit pozdržené zprávy. Zprávu do hold fronty umístíte pomocí

postsuper -h 305EA80388

a zpět do fronty

postsuper -H 305EA80388

Opět místo ID zprávy můžete použít symbol ALL pro přesun všech zpráv.

Pokus o opětovné doručení spustíte

postqueue -f

A pokud se chcete pokusit doručit pozdržené zprávy jen na jeden konkrétní server, o kterém třeba víte, že před nějakou dobou nejel, ale teď už jede, použijte

postqueue -s example.com