8 # Content-Type: multipart/report; report-type=delivery-status; ~ Delivery Status Notification (DSN)
9 # doplňujeme hlavičku References,
10 # aby si je e-mailový klient mohl zařadit do vlákna pod zprávu, ke které doručenka patří.
12 # viz http://search.cpan.org/~dskoll/MIME-tools-5.502/lib/MIME/Entity.pm
13 # viz http://search.cpan.org/~dskoll/MIME-tools-5.502/lib/MIME/Head.pm
14 # viz http://perldoc.perl.org/Net/SMTP.html
16 # aptitude install libmime-tools-perl libmailtools-perl
19 # Nastavení --------------------------------------------------------------------
20 my $komu = 'noreply@example.com'; # adresa správce – sem pošleme zprávy, pokud nevíme, kam je poslat (chybí Delivered-To), nebo máme podezření na zacyklení
21 # ------------------------------------------------------------------------------
23 my $znacka = "X-DSN-Pridej-References"; # hlavička, kterou si poznačíme, že zpráva prošla tímto programem
24 my $stav = "chyba - nedefinovano"; # výchozí hodnota naší hlavičky
28 my $parser = new MIME::Parser;
29 $parser->output_to_core(1);
30 my $dorucenka = $parser->parse(\*STDIN);
33 # Kontrola, že se zpráva nezacyklila (chybí naše značka)
34 if ($dorucenka->head->count($znacka) == 0) {
36 # Podle hlavičky Delivered-To zjistíme, kam máme zprávu poslat zpátky
37 my $deliveredTo = $dorucenka->head->get("Delivered-To", 1); # [0] = adresa tohoto skriptu, [1] = předchozí adresa – původní příjemce doručenky
39 $deliveredTo =~ s/\s+$//; # zbavíme se přebytečného konce řádku
41 $dorucenka->head->delete("Delivered-To", 1); # aby si poštovní server nemyslel, že se zpráva zacyklila
43 # Pokud hlavička References chybí, doplníme ji
44 if ($dorucenka->head->count("References") == 0) {
46 # Zjistíme Message-ID původní zprávy
48 my @casti = $dorucenka->parts;
49 for my $cast (@casti) {
50 if ($cast->mime_type eq "text/rfc822-headers") {
51 my @radky = $cast->bodyhandle->as_lines;
52 for my $radek (@radky) {
53 if ($radek =~ /^Message-ID:\s*(<.*>)$/) {
60 # Nastavíme nalezené Message-ID do References hlavičky
63 $dorucenka->head->add("References", $messageID);
65 $stav = "chyba - Message-ID nenalezeno";
68 $stav = "ok - hlavicka References uz byla nastavena drive";
71 $stav = "chyba - nevime, kam zpravu poslat zpet";
74 $stav = "chyba - zprava se zacyklila";
78 $stav .= " [pid=$$,uid=$>]"; # přidáme PID a UID
79 $dorucenka->head->add($znacka, $stav);
81 # Výpis (nepotřebujeme, jen pro ladění)
82 #$dorucenka->print(\*STDOUT);
83 #print "Pošleme komu: $komu\n";
85 # Odeslání přes SMTP (pro ostrý provoz):
86 my $smtp = Net::SMTP->new("localhost");
90 $dorucenka->print($smtp);