use MIME::QuotedPrint;
use MIME::Base64;
use MIME::Parser;
+use Mail::Box::Manager;
use POSIX qw(strftime);
use vars qw($VERSION);
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 (<VOTES>) {
- if (/$config{mailstart}/) {
- $i++;
+
+ my $readfilename;
+
+ if ($caller==0) {
+ # called from uvvote.pl: use configured mailbox file
+ $readfilename = $config{votefile};
+ } else {
+ # else use filename provided in function call
+ $readfilename = $filename;
+ # and create backup archive filename
+ $filename .= '.processed';
+ }
+
+ my $mgr = Mail::Box::Manager->new;
+ my $folder;
+
+ eval{
+ $folder = $mgr->open( folder => $readfilename,
+ create => 0,
+ access => 'rw',
+ type => $config{mailboxtype},
+ expand => 'LAZY',
+ remove_when_empty => 0,
+ );
+ };
+ die UVmessage::get("READMAIL_NOMAILFILE", (FILE => $readfilename)) . "\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($_->timestamp()) . "\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) {