From 34809a2a81332b011af9f6055a8e3b846053d491 Mon Sep 17 00:00:00 2001 From: Thomas Hochstein Date: Sat, 15 Feb 2014 17:41:54 +0100 Subject: [PATCH] Add option to read from Maildir. Parse a mailbox by virtue of Mail::Box and add "mailboxtype" to usevote.cfg. Picked from upstream. Signed-off-by: Thomas Hochstein --- UVreadmail.pm | 64 ++++++++++++++++++++++++++++++++------------------- usevote.cfg | 2 ++ uvvote.pl | 10 -------- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/UVreadmail.pm b/UVreadmail.pm index e1e599c..01d062f 100644 --- a/UVreadmail.pm +++ b/UVreadmail.pm @@ -9,6 +9,7 @@ use UVmessage; use MIME::QuotedPrint; use MIME::Base64; use MIME::Parser; +use Mail::Box::Manager; use POSIX qw(strftime); use vars qw($VERSION); @@ -118,37 +119,52 @@ sub process { close (UIDLCACHE) or print STDERR UVmessage::get("READMAIL_UIDL_CLOSE") . "\n"; } - # make archive of all mails - my $fileproblem = 0; - open (VOTES, ">$filename") or $fileproblem = 1; - if ($fileproblem) { - print STDERR UVmessage::get("READMAIL_ARCHIVE_PROBLEM", - (FILE => $filename)) . "\n"; - } else { - print VOTES join ("\n", @mails); - close (VOTES) - or print STDERR UVmessage::get("READMAIL_ARCHIVE_CLOSE", - (FILE => $filename)) . "\n"; - } - $pop->quit(); + # Mailbox / Maildir } else { - # open mail file - open(VOTES, "<$filename") - or die UVmessage::get("READMAIL_NOMAILFILE", (FILE => $filename)) . "\n\n"; - # read all mails - my $i = 0; - while () { - if (/$config{mailstart}/) { - $i++; + my $mgr = Mail::Box::Manager->new; + my $folder; + + eval{ + $folder = $mgr->open( folder => $config{votefile}, + create => 0, + access => 'rw', + type => $config{mailboxtype}, + expand => 'LAZY', + ); + }; + die UVmessage::get("READMAIL_NOMAILFILE", (FILE => $config{votefile})) . "\n\n" if $@; + + # Iterate over the messages. + foreach (@$folder) { + my $mail = $_->string; + $_->delete(); + my $fromline = 'From '; + if ($mail =~ /From: .*?<(.+?)>/) { + $fromline .= $1; + } elsif ($mail =~ /From:\s+?(\S+?\@\S+?)\s/) { + $fromline .= $1; + } else { + $fromline .= 'foo@bar.invalid'; } - $mails[$i] = ($mails[$i] || "") . $_; + $fromline .= ' ' . localtime() . "\n"; #strftime ('%a %b %d %H:%M:%S %Y', localtime) . "\n"; + push (@mails, $fromline . $mail); } + } - # close mail file - close(VOTES); + # make archive of all mails + my $fileproblem = 0; + open (VOTES, ">$filename") or $fileproblem = 1; + if ($fileproblem) { + print STDERR UVmessage::get("READMAIL_ARCHIVE_PROBLEM", + (FILE => $filename)) . "\n"; + } else { + print VOTES join ("\n", @mails); + close (VOTES) + or print STDERR UVmessage::get("READMAIL_ARCHIVE_CLOSE", + (FILE => $filename)) . "\n"; } foreach my $mail (@mails) { diff --git a/usevote.cfg b/usevote.cfg index aee1fc1..c472b45 100644 --- a/usevote.cfg +++ b/usevote.cfg @@ -90,6 +90,8 @@ pop3 = 1 # Mailbox, in der die zu verarbeitenden Mails liegen (falls pop3=0) votefile = votes +# Typ der Mailbox (mbox, maildir) +mailboxtype = mbox # POP3-Einstellungen fuer Abruf der eingehenden Wahlscheine: # Server, Port, Benutzername, Passwort pop3server = 127.0.0.1 diff --git a/uvvote.pl b/uvvote.pl index 99988c0..5cff375 100755 --- a/uvvote.pl +++ b/uvvote.pl @@ -135,16 +135,6 @@ if ($clean) { my $thisresult = "ergebnis-" . $ext; my $thisvotes = "stimmen-" . $ext; - # POP3 not activated: rename votes file - unless ($config{pop3}) { - print UVmessage::get("VOTE_RENAMING_MAILBOX"), "\n"; - rename ($config{votefile}, "$config{tmpdir}/$thisvotes") - or die UVmessage::get("ERR_RENAME_MAILFILE") . "$!\n\n"; - - # wait, so that current mail deliveries can finalize - sleep 2; - } - # open results file open (RESULT, ">>$config{tmpdir}/$thisresult") or die UVmessage::get("VOTE_WRITE_RESULTS", (FILE=>$thisresult)) . "\n\n";