doručenky milter a sieve
authorFrantišek Kučera <franta-hg@frantovo.cz>
Wed Nov 30 15:40:16 2011 +0100 (2011-11-30)
changeset 202a00ee0b740a
parent 19 9e680fd9d8f8
child 21 a5c8edf14f82
doručenky milter a sieve
doručenky/doručenky.sieve
doručenky/dsn-doručenky-references.pl
milter/doručenky.sieve
milter/dsn-doručenky-references.pl
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/doručenky/doručenky.sieve	Wed Nov 30 15:40:16 2011 +0100
     1.3 @@ -0,0 +1,7 @@
     1.4 +require ["fileinto"];
     1.5 +# rule:[doručenky]
     1.6 +if anyof (header :contains "Content-Type" "report-type=disposition-notification;", header :contains "Content-Type" "report-type=delivery-status;")
     1.7 +{
     1.8 +        fileinto "Sent";
     1.9 +        stop;
    1.10 +}
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/doručenky/dsn-doručenky-references.pl	Wed Nov 30 15:40:16 2011 +0100
     2.3 @@ -0,0 +1,85 @@
     2.4 +# E-mailové doručenky je dobré dávat do složky s odeslanou poštou,
     2.5 +# kde se můžou řadit do vláken pod zprávu, ke které patří.
     2.6 +#
     2.7 +# Potvrzení o přečtení posílané klientem (Content-Type: multipart/report; report-type=disposition-notification;)
     2.8 +# obsahují hlavičku References se správným Message-ID, takže to funguje.
     2.9 +#
    2.10 +# Ale potvrzení o doručení posílané serverem příjemce (Content-Type: multipart/report; report-type=delivery-status;)
    2.11 +# tuto hlavičku neobsahují, takže si je klient odesílatele nemůže správně zařadit do vlákna pod odeslanou zprávu.
    2.12 +#
    2.13 +# Možná řešení:
    2.14 +# 1) server příjemce tuto hlavičku bude vyplňovat – ideální, ale nemůžeme ovlivnit
    2.15 +# 2) na serveru odesílatele původní zprávy (u nás) budeme doplňovat hlavičku References
    2.16 +#    na základě obsahu přílohy doručenky (text/rfc822-headers), která obsahuje všechny hlavičky 
    2.17 +#    (včetně potřebného Message-ID) původní odeslané zprávy
    2.18 +#		a) uděláme to tímto milterem
    2.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
    2.20 +
    2.21 +# Tento milter není hotový a pravděpodobně bude lepší řešení b)
    2.22 +# 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)
    2.23 +
    2.24 +# Instalace tohoto milteru:
    2.25 +#	aptitude install libsendmail-milter-perl
    2.26 +#	spustit tento skript → vytvoří unixový socket
    2.27 +#	v postfixu v main.cf nastavit: smtpd_milters = … unix:/dorucenky/dorucenky.sock
    2.28 +
    2.29 +# http://search.cpan.org/~cying/Sendmail-Milter-0.18/Milter.pm
    2.30 +use Sendmail::Milter;
    2.31 +
    2.32 +# při jakých akcích bude náš milter volán
    2.33 +my %my_milter_callbacks =
    2.34 +(
    2.35 +	'eoh'	=>	\&my_eoh_callback,
    2.36 +	'body'	=>	\&my_body_callback,
    2.37 +	'eom'	=>	\&my_eom_callback,
    2.38 +	'abort'	=>	\&my_abort_callback,
    2.39 +);
    2.40 +
    2.41 +# konec hlaviček
    2.42 +sub my_eoh_callback
    2.43 +{
    2.44 +	my $ctx = shift;
    2.45 +	# TODO: zkontrolovat
    2.46 +	#	zda se jedná o doručenku
    2.47 +	#	zda už neobsahuje hlavičku References
    2.48 +	return SMFIS_CONTINUE;
    2.49 +}
    2.50 +
    2.51 +# po každé MIME části
    2.52 +sub my_body_callback
    2.53 +{
    2.54 +	my $ctx = shift;
    2.55 +	# TODO: načíst Message-ID z části s Content-Type: text/rfc822-headers
    2.56 +	return SMFIS_CONTINUE;
    2.57 +}
    2.58 +
    2.59 +# konec zprávy
    2.60 +sub my_eom_callback
    2.61 +{
    2.62 +	my $ctx = shift;
    2.63 +	# TODO: přidat hlavičku References s Message-ID původně odeslané zprávy
    2.64 +	$ctx->addheader("X-Perl", "byl jsem tu");
    2.65 +	$ctx->setpriv(undef);
    2.66 +	return SMFIS_ACCEPT;
    2.67 +}
    2.68 +
    2.69 +# nečekaný konec spojení
    2.70 +sub my_abort_callback
    2.71 +{
    2.72 +	my $ctx = shift;
    2.73 +	# uklidit po sobě
    2.74 +	$ctx->setpriv(undef);
    2.75 +	return SMFIS_CONTINUE;
    2.76 +}
    2.77 +
    2.78 +
    2.79 +BEGIN:
    2.80 +{
    2.81 +	# autokonfiguraci nepoužijeme (to je pro Sendmail)
    2.82 +	# Sendmail::Milter::auto_setconn("myfilter");
    2.83 +	
    2.84 +	Sendmail::Milter::setconn("local:/var/spool/postfix/dorucenky/dorucenky.sock");
    2.85 +	Sendmail::Milter::register("myfilter", \%my_milter_callbacks, SMFI_CURR_ACTS);
    2.86 +	Sendmail::Milter::main();
    2.87 +	# Never reaches here, callbacks are called from Milter.
    2.88 +}
     3.1 --- a/milter/doručenky.sieve	Mon Nov 28 13:53:59 2011 +0100
     3.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.3 @@ -1,7 +0,0 @@
     3.4 -require ["fileinto"];
     3.5 -# rule:[doručenky]
     3.6 -if anyof (header :contains "Content-Type" "report-type=disposition-notification;", header :contains "Content-Type" "report-type=delivery-status;")
     3.7 -{
     3.8 -        fileinto "Sent";
     3.9 -        stop;
    3.10 -}
     4.1 --- a/milter/dsn-doručenky-references.pl	Mon Nov 28 13:53:59 2011 +0100
     4.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.3 @@ -1,85 +0,0 @@
     4.4 -# E-mailové doručenky je dobré dávat do složky s odeslanou poštou,
     4.5 -# kde se můžou řadit do vláken pod zprávu, ke které patří.
     4.6 -#
     4.7 -# Potvrzení o přečtení posílané klientem (Content-Type: multipart/report; report-type=disposition-notification;)
     4.8 -# obsahují hlavičku References se správným Message-ID, takže to funguje.
     4.9 -#
    4.10 -# Ale potvrzení o doručení posílané serverem příjemce (Content-Type: multipart/report; report-type=delivery-status;)
    4.11 -# tuto hlavičku neobsahují, takže si je klient odesílatele nemůže správně zařadit do vlákna pod odeslanou zprávu.
    4.12 -#
    4.13 -# Možná řešení:
    4.14 -# 1) server příjemce tuto hlavičku bude vyplňovat – ideální, ale nemůžeme ovlivnit
    4.15 -# 2) na serveru odesílatele původní zprávy (u nás) budeme doplňovat hlavičku References
    4.16 -#    na základě obsahu přílohy doručenky (text/rfc822-headers), která obsahuje všechny hlavičky 
    4.17 -#    (včetně potřebného Message-ID) původní odeslané zprávy
    4.18 -#		a) uděláme to tímto milterem
    4.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
    4.20 -
    4.21 -# Tento milter není hotový a pravděpodobně bude lepší řešení b)
    4.22 -# 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)
    4.23 -
    4.24 -# Instalace tohoto milteru:
    4.25 -#	aptitude install libsendmail-milter-perl
    4.26 -#	spustit tento skript → vytvoří unixový socket
    4.27 -#	v postfixu v main.cf nastavit: smtpd_milters = … unix:/dorucenky/dorucenky.sock
    4.28 -
    4.29 -# http://search.cpan.org/~cying/Sendmail-Milter-0.18/Milter.pm
    4.30 -use Sendmail::Milter;
    4.31 -
    4.32 -# při jakých akcích bude náš milter volán
    4.33 -my %my_milter_callbacks =
    4.34 -(
    4.35 -	'eoh'	=>	\&my_eoh_callback,
    4.36 -	'body'	=>	\&my_body_callback,
    4.37 -	'eom'	=>	\&my_eom_callback,
    4.38 -	'abort'	=>	\&my_abort_callback,
    4.39 -);
    4.40 -
    4.41 -# konec hlaviček
    4.42 -sub my_eoh_callback
    4.43 -{
    4.44 -	my $ctx = shift;
    4.45 -	# TODO: zkontrolovat
    4.46 -	#	zda se jedná o doručenku
    4.47 -	#	zda už neobsahuje hlavičku References
    4.48 -	return SMFIS_CONTINUE;
    4.49 -}
    4.50 -
    4.51 -# po každé MIME části
    4.52 -sub my_body_callback
    4.53 -{
    4.54 -	my $ctx = shift;
    4.55 -	# TODO: načíst Message-ID z části s Content-Type: text/rfc822-headers
    4.56 -	return SMFIS_CONTINUE;
    4.57 -}
    4.58 -
    4.59 -# konec zprávy
    4.60 -sub my_eom_callback
    4.61 -{
    4.62 -	my $ctx = shift;
    4.63 -	# TODO: přidat hlavičku References s Message-ID původně odeslané zprávy
    4.64 -	$ctx->addheader("X-Perl", "byl jsem tu");
    4.65 -	$ctx->setpriv(undef);
    4.66 -	return SMFIS_ACCEPT;
    4.67 -}
    4.68 -
    4.69 -# nečekaný konec spojení
    4.70 -sub my_abort_callback
    4.71 -{
    4.72 -	my $ctx = shift;
    4.73 -	# uklidit po sobě
    4.74 -	$ctx->setpriv(undef);
    4.75 -	return SMFIS_CONTINUE;
    4.76 -}
    4.77 -
    4.78 -
    4.79 -BEGIN:
    4.80 -{
    4.81 -	# autokonfiguraci nepoužijeme (to je pro Sendmail)
    4.82 -	# Sendmail::Milter::auto_setconn("myfilter");
    4.83 -	
    4.84 -	Sendmail::Milter::setconn("local:/var/spool/postfix/dorucenky/dorucenky.sock");
    4.85 -	Sendmail::Milter::register("myfilter", \%my_milter_callbacks, SMFI_CURR_ACTS);
    4.86 -	Sendmail::Milter::main();
    4.87 -	# Never reaches here, callbacks are called from Milter.
    4.88 -}