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