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