# HG changeset patch # User František Kučera # Date 1322664989 -3600 # Node ID 0eca162a758c0182f01b6e1217fe4634acea63cf # Parent a5c8edf14f8208420e7ab6bbe1423ae717b140c4 Doručenky: přejmenování milteru diff -r a5c8edf14f82 -r 0eca162a758c doručenky/dorucenky-milter.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doručenky/dorucenky-milter.pl Wed Nov 30 15:56:29 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. +} diff -r a5c8edf14f82 -r 0eca162a758c doručenky/dsn-doručenky-references.pl --- a/doručenky/dsn-doručenky-references.pl Wed Nov 30 15:44:34 2011 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -# 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. -}