# HG changeset patch # User František Kučera # Date 1322484839 -3600 # Node ID 9e680fd9d8f83d53b29a1c92198d98e8ac49e1f6 # Parent 7eb66061cac89951445966f5bdcbca297b9aab00 Doručenky: návrh milteru a lepšího řešení problému s chybějící hlavičkou References u doručenek. diff -r 7eb66061cac8 -r 9e680fd9d8f8 milter/doručenky.sieve --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/milter/doručenky.sieve Mon Nov 28 13:53:59 2011 +0100 @@ -0,0 +1,7 @@ +require ["fileinto"]; +# rule:[doručenky] +if anyof (header :contains "Content-Type" "report-type=disposition-notification;", header :contains "Content-Type" "report-type=delivery-status;") +{ + fileinto "Sent"; + stop; +} diff -r 7eb66061cac8 -r 9e680fd9d8f8 milter/dsn-doručenky-references.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/milter/dsn-doručenky-references.pl Mon Nov 28 13:53:59 2011 +0100 @@ -0,0 +1,85 @@ +# E-mailové doručenky je dobré dávat do složky s odeslanou poštou, +# kde se můžou řadit do vláken pod zprávu, ke které patří. +# +# Potvrzení o přečtení posílané klientem (Content-Type: multipart/report; report-type=disposition-notification;) +# obsahují hlavičku References se správným Message-ID, takže to funguje. +# +# Ale potvrzení o doručení posílané serverem příjemce (Content-Type: multipart/report; report-type=delivery-status;) +# tuto hlavičku neobsahují, takže si je klient odesílatele nemůže správně zařadit do vlákna pod odeslanou zprávu. +# +# Možná řešení: +# 1) server příjemce tuto hlavičku bude vyplňovat – ideální, ale nemůžeme ovlivnit +# 2) na serveru odesílatele původní zprávy (u nás) budeme doplňovat hlavičku References +# na základě obsahu přílohy doručenky (text/rfc822-headers), která obsahuje všechny hlavičky +# (včetně potřebného Message-ID) původní odeslané zprávy +# a) uděláme to tímto milterem +# b) pomocí sieve přesměrujeme doručenky na adresu, kde čeká skript/program (roura), který doplní hlavičku a pošle nám zprávu zpátky + +# Tento milter není hotový a pravděpodobně bude lepší řešení b) +# doručenek je totiž minimum z celkového objemu zpráv, a proto bude lepší přes doplňovač prohnat jen doručenky (filtrované sievem) + +# Instalace tohoto milteru: +# aptitude install libsendmail-milter-perl +# spustit tento skript → vytvoří unixový socket +# v postfixu v main.cf nastavit: smtpd_milters = … unix:/dorucenky/dorucenky.sock + +# http://search.cpan.org/~cying/Sendmail-Milter-0.18/Milter.pm +use Sendmail::Milter; + +# při jakých akcích bude náš milter volán +my %my_milter_callbacks = +( + 'eoh' => \&my_eoh_callback, + 'body' => \&my_body_callback, + 'eom' => \&my_eom_callback, + 'abort' => \&my_abort_callback, +); + +# konec hlaviček +sub my_eoh_callback +{ + my $ctx = shift; + # TODO: zkontrolovat + # zda se jedná o doručenku + # zda už neobsahuje hlavičku References + return SMFIS_CONTINUE; +} + +# po každé MIME části +sub my_body_callback +{ + my $ctx = shift; + # TODO: načíst Message-ID z části s Content-Type: text/rfc822-headers + return SMFIS_CONTINUE; +} + +# konec zprávy +sub my_eom_callback +{ + my $ctx = shift; + # TODO: přidat hlavičku References s Message-ID původně odeslané zprávy + $ctx->addheader("X-Perl", "byl jsem tu"); + $ctx->setpriv(undef); + return SMFIS_ACCEPT; +} + +# nečekaný konec spojení +sub my_abort_callback +{ + my $ctx = shift; + # uklidit po sobě + $ctx->setpriv(undef); + return SMFIS_CONTINUE; +} + + +BEGIN: +{ + # autokonfiguraci nepoužijeme (to je pro Sendmail) + # Sendmail::Milter::auto_setconn("myfilter"); + + Sendmail::Milter::setconn("local:/var/spool/postfix/dorucenky/dorucenky.sock"); + Sendmail::Milter::register("myfilter", \%my_milter_callbacks, SMFI_CURR_ACTS); + Sendmail::Milter::main(); + # Never reaches here, callbacks are called from Milter. +}