#!perl -w
use strict;
use Time::Piece;
use Date::Parse;
use WWW::Topica;
use Email::Simple;
use Email::LocalDelivery;
=pod
=head1 NAME
topica2mail - convert a Topica mailing list into a mail box
=head1 USAGE
topica2mail <list-id> <mailbox> [login] [password] [ -d ] [ -l ] [ -s <start> ] [ -e <end> ]
=head1 OPTIONS
=head2 list-id
The name of the list
=head2 mailbox
The mailbox you want to deliver the mail into.
Will automatically prepend the year and the month so
foo
will turn into
foo-2004-10
etc etc
=head2 login
Your login email address.
If you don't pass in your login and password you may not be able to read some lists.
=head2 password
Your password
If you don't pass in your login and password you may not be able to read some lists.
=head2 -d
Debug - print out debug messages where appropriate
=head2 -l
Local - use the local test files (for testing, obviously)
=head2 -s <start>
Which mail offset to start from
=head2 -e <end>
Which mail offset to end on
=head1 AUTHOR
Simon Wistow <simon@thegestalt.org>
=head1 COPYRIGHT
Copyright (c), 2004 - Simon Wistow
Distributed under the same terms as Perl itself
=cut
my $email;
my $pass;
my $list = shift || die "You must pass a list name\n";
my $out = shift || die "You must pass a mailbox\n";
if (@ARGV && $ARGV[0] !~ /^-/ && $ARGV[1] !~ /^-/) {
$email = shift;
$pass = shift;
}
my %opts = (
list => $list,
email => $email,
password => $pass,
debug => 0,
local => 0,
);
while (my $arg = shift @ARGV) {
if ($arg eq '-d') {
$opts{debug} = 1;
} elsif ($arg eq '-l') {
$opts{local} = 1;
} elsif ($arg eq '-s') {
$opts{first} = shift;
} elsif ($arg eq '-e') {
$opts{last} = shift;
} else {
die "Confused by $arg - bailing out\n";
}
}
my $topica = WWW::Topica->new(%opts);
print "\n\n" if $opts{debug};
my $counter = 1;
while (my $rfc822 = $topica->mail) {
my $mail = Email::Simple->new($rfc822);
my $date = $mail->header("date");
my $time = str2time($date);
my $tp = Time::Piece->new($time);
my $mbox = sprintf "%s-%.4d-%.2d", $out, $tp->year, $tp->mon;
print "\t\t". $counter++.") ".
$mail->header("from")." - ".
$mail->header("subject")." - ".
$mail->header("date")." to $mbox\n\n";
Email::LocalDelivery->deliver($mail->as_string, $mbox)
|| die "Couldn't deliver mail to $mbox\n";
}