milter/dsn-doručenky-references.pl
author František Kučera <franta-hg@frantovo.cz>
Mon Nov 28 13:53:59 2011 +0100 (2011-11-28)
changeset 19 9e680fd9d8f8
permissions -rw-r--r--
Doručenky: návrh milteru a lepšího řešení problému s chybějící hlavičkou References u doručenek.
     1 # E-mailové doručenky je dobré dávat do složky s odeslanou poštou,
     2 # kde se můžou řadit do vláken pod zprávu, ke které patří.
     3 #
     4 # Potvrzení o přečtení posílané klientem (Content-Type: multipart/report; report-type=disposition-notification;)
     5 # obsahují hlavičku References se správným Message-ID, takže to funguje.
     6 #
     7 # Ale potvrzení o doručení posílané serverem příjemce (Content-Type: multipart/report; report-type=delivery-status;)
     8 # tuto hlavičku neobsahují, takže si je klient odesílatele nemůže správně zařadit do vlákna pod odeslanou zprávu.
     9 #
    10 # Možná řešení:
    11 # 1) server příjemce tuto hlavičku bude vyplňovat – ideální, ale nemůžeme ovlivnit
    12 # 2) na serveru odesílatele původní zprávy (u nás) budeme doplňovat hlavičku References
    13 #    na základě obsahu přílohy doručenky (text/rfc822-headers), která obsahuje všechny hlavičky 
    14 #    (včetně potřebného Message-ID) původní odeslané zprávy
    15 #		a) uděláme to tímto milterem
    16 #		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
    17 
    18 # Tento milter není hotový a pravděpodobně bude lepší řešení b)
    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)
    20 
    21 # Instalace tohoto milteru:
    22 #	aptitude install libsendmail-milter-perl
    23 #	spustit tento skript → vytvoří unixový socket
    24 #	v postfixu v main.cf nastavit: smtpd_milters = … unix:/dorucenky/dorucenky.sock
    25 
    26 # http://search.cpan.org/~cying/Sendmail-Milter-0.18/Milter.pm
    27 use Sendmail::Milter;
    28 
    29 # při jakých akcích bude náš milter volán
    30 my %my_milter_callbacks =
    31 (
    32 	'eoh'	=>	\&my_eoh_callback,
    33 	'body'	=>	\&my_body_callback,
    34 	'eom'	=>	\&my_eom_callback,
    35 	'abort'	=>	\&my_abort_callback,
    36 );
    37 
    38 # konec hlaviček
    39 sub my_eoh_callback
    40 {
    41 	my $ctx = shift;
    42 	# TODO: zkontrolovat
    43 	#	zda se jedná o doručenku
    44 	#	zda už neobsahuje hlavičku References
    45 	return SMFIS_CONTINUE;
    46 }
    47 
    48 # po každé MIME části
    49 sub my_body_callback
    50 {
    51 	my $ctx = shift;
    52 	# TODO: načíst Message-ID z části s Content-Type: text/rfc822-headers
    53 	return SMFIS_CONTINUE;
    54 }
    55 
    56 # konec zprávy
    57 sub my_eom_callback
    58 {
    59 	my $ctx = shift;
    60 	# TODO: přidat hlavičku References s Message-ID původně odeslané zprávy
    61 	$ctx->addheader("X-Perl", "byl jsem tu");
    62 	$ctx->setpriv(undef);
    63 	return SMFIS_ACCEPT;
    64 }
    65 
    66 # nečekaný konec spojení
    67 sub my_abort_callback
    68 {
    69 	my $ctx = shift;
    70 	# uklidit po sobě
    71 	$ctx->setpriv(undef);
    72 	return SMFIS_CONTINUE;
    73 }
    74 
    75 
    76 BEGIN:
    77 {
    78 	# autokonfiguraci nepoužijeme (to je pro Sendmail)
    79 	# Sendmail::Milter::auto_setconn("myfilter");
    80 	
    81 	Sendmail::Milter::setconn("local:/var/spool/postfix/dorucenky/dorucenky.sock");
    82 	Sendmail::Milter::register("myfilter", \%my_milter_callbacks, SMFI_CURR_ACTS);
    83 	Sendmail::Milter::main();
    84 	# Never reaches here, callbacks are called from Milter.
    85 }