franta-hg@19: # E-mailové doručenky je dobré dávat do složky s odeslanou poštou, franta-hg@19: # kde se můžou řadit do vláken pod zprávu, ke které patří. franta-hg@19: # franta-hg@19: # Potvrzení o přečtení posílané klientem (Content-Type: multipart/report; report-type=disposition-notification;) franta-hg@19: # obsahují hlavičku References se správným Message-ID, takže to funguje. franta-hg@19: # franta-hg@19: # Ale potvrzení o doručení posílané serverem příjemce (Content-Type: multipart/report; report-type=delivery-status;) franta-hg@19: # tuto hlavičku neobsahují, takže si je klient odesílatele nemůže správně zařadit do vlákna pod odeslanou zprávu. franta-hg@19: # franta-hg@19: # Možná řešení: franta-hg@19: # 1) server příjemce tuto hlavičku bude vyplňovat – ideální, ale nemůžeme ovlivnit franta-hg@19: # 2) na serveru odesílatele původní zprávy (u nás) budeme doplňovat hlavičku References franta-hg@19: # na základě obsahu přílohy doručenky (text/rfc822-headers), která obsahuje všechny hlavičky franta-hg@19: # (včetně potřebného Message-ID) původní odeslané zprávy franta-hg@19: # a) uděláme to tímto milterem franta-hg@19: # 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 franta-hg@19: franta-hg@19: # Tento milter není hotový a pravděpodobně bude lepší řešení b) franta-hg@19: # 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) franta-hg@19: franta-hg@19: # Instalace tohoto milteru: franta-hg@19: # aptitude install libsendmail-milter-perl franta-hg@19: # spustit tento skript → vytvoří unixový socket franta-hg@19: # v postfixu v main.cf nastavit: smtpd_milters = … unix:/dorucenky/dorucenky.sock franta-hg@19: franta-hg@19: # http://search.cpan.org/~cying/Sendmail-Milter-0.18/Milter.pm franta-hg@19: use Sendmail::Milter; franta-hg@19: franta-hg@19: # při jakých akcích bude náš milter volán franta-hg@19: my %my_milter_callbacks = franta-hg@19: ( franta-hg@19: 'eoh' => \&my_eoh_callback, franta-hg@19: 'body' => \&my_body_callback, franta-hg@19: 'eom' => \&my_eom_callback, franta-hg@19: 'abort' => \&my_abort_callback, franta-hg@19: ); franta-hg@19: franta-hg@19: # konec hlaviček franta-hg@19: sub my_eoh_callback franta-hg@19: { franta-hg@19: my $ctx = shift; franta-hg@19: # TODO: zkontrolovat franta-hg@19: # zda se jedná o doručenku franta-hg@19: # zda už neobsahuje hlavičku References franta-hg@19: return SMFIS_CONTINUE; franta-hg@19: } franta-hg@19: franta-hg@19: # po každé MIME části franta-hg@19: sub my_body_callback franta-hg@19: { franta-hg@19: my $ctx = shift; franta-hg@19: # TODO: načíst Message-ID z části s Content-Type: text/rfc822-headers franta-hg@19: return SMFIS_CONTINUE; franta-hg@19: } franta-hg@19: franta-hg@19: # konec zprávy franta-hg@19: sub my_eom_callback franta-hg@19: { franta-hg@19: my $ctx = shift; franta-hg@19: # TODO: přidat hlavičku References s Message-ID původně odeslané zprávy franta-hg@19: $ctx->addheader("X-Perl", "byl jsem tu"); franta-hg@19: $ctx->setpriv(undef); franta-hg@19: return SMFIS_ACCEPT; franta-hg@19: } franta-hg@19: franta-hg@19: # nečekaný konec spojení franta-hg@19: sub my_abort_callback franta-hg@19: { franta-hg@19: my $ctx = shift; franta-hg@19: # uklidit po sobě franta-hg@19: $ctx->setpriv(undef); franta-hg@19: return SMFIS_CONTINUE; franta-hg@19: } franta-hg@19: franta-hg@19: franta-hg@19: BEGIN: franta-hg@19: { franta-hg@19: # autokonfiguraci nepoužijeme (to je pro Sendmail) franta-hg@19: # Sendmail::Milter::auto_setconn("myfilter"); franta-hg@19: franta-hg@19: Sendmail::Milter::setconn("local:/var/spool/postfix/dorucenky/dorucenky.sock"); franta-hg@19: Sendmail::Milter::register("myfilter", \%my_milter_callbacks, SMFI_CURR_ACTS); franta-hg@19: Sendmail::Milter::main(); franta-hg@19: # Never reaches here, callbacks are called from Milter. franta-hg@19: }