#!/usr/bin/perl # # add mail to the XML todo list # # ----- the todo xml file my $todo_file = '/wwwroot/prinzess.dyndns.org/serverdata/todo.xml'; # ----- used modules use strict; use IO::File; use MIME::QuotedPrint; use XML::Parser; use XML::Writer; use Time::localtime; # ----- extract information from mail header and body my $message; my $header; my $from; $/ = ''; $header = <>; $header =~ s/\n\s+/ /g; $* = 1; exit if $header =~ /^Precedence:\s*(bulk|junk|list)/i; exit if $header =~ /^From.*\b(daemon|postmaster|mailer-daemon|mailer)\b/i; ($from) = ($header =~ /^From:\s+(.*)/); $message = <>; # ----- parse existing entries my %this = (); my $db; my $textbuffer = ""; sub StartTag { my ($expat, $element) = @_; if ($element eq "entry") { $this{date} = decode_qp ($_{date}); $this{author} = decode_qp ($_{author}); } } sub Text { my $expat = shift; $textbuffer = $_; } sub EndTag { my ($expat, $element) = @_; if ($element eq "text") { $this{text} = decode_qp ($textbuffer); } if ($element eq "entry") { my %that = %this; push @{$db}, \%that; } } if (-s $todo_file) { my $xml = new XML::Parser(Style => 'Stream', ErrorContext => 2); $xml->parsefile ($todo_file); } # ----- add new entry to the hash reference my %newentry = ( author => $from, date => time (), text => $message); push @{$db}, \%newentry; # ----- write hash reference to the xml file umask 002; my $xmlfile = new IO::File (">$todo_file") or die $!; my $xml = new XML::Writer ( DATA_MODE => 1, DATA_INDENT => 2, OUTPUT => $xmlfile ); $xml->xmlDecl ("ISO-8859-1", "no"); $xml->doctype ("todo", "", "todo.dtd"); $xml->startTag("todo"); foreach (@{$db}) { $xml->startTag ("entry", "date" => encode_qp ($$_{date}), "author" => encode_qp ($$_{author})); $xml->startTag ("text"); $xml->characters (encode_qp ($$_{text})); $xml->endTag ("text"); $xml->endTag("entry"); } $xml->endTag ("todo"); $xml->end; $xmlfile->close(); # ----- complete