# 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.
}
