WWW-Topica-0.6/0040755000175300001440000000000010356527060012337 5ustar simonusersWWW-Topica-0.6/lib/0040755000175300001440000000000010356527060013105 5ustar simonusersWWW-Topica-0.6/lib/WWW/0040755000175300001440000000000010356527060013571 5ustar simonusersWWW-Topica-0.6/lib/WWW/Topica/0040755000175300001440000000000010356527060015010 5ustar simonusersWWW-Topica-0.6/lib/WWW/Topica/Index.pm0100644000175300001440000000416210356510606016413 0ustar simonuserspackage WWW::Topica::Index; use strict; =pod =head1 NAME WWW::Topica::Index - parse a single Topic mailing list index =head1 SYNOPSIS my $index = WWW::Topic::Index->new($index_html); foreach my $mess_id ($index->message_ids) { # the mail has some information and also provides a link to the reply ... my $mail = WWW::Topica::Mail->new($topica->fetch_mail($mess_id), $mess_id); # which has other information (like the un-htmled mail and the email address) ... my $reply = WWW::Topica::Reply->new($topica->fetch_reply($mail->id, $mail->eto), $mail->id, $mail->eto); } print "Next offset is ".$index->next."\n"; print "Previous offset is ".$index->prev."\n"; =head1 DESCRIPTION Used to parse a single index page from Topica.com's mailing list indexes. =head1 METHODS =cut =head2 new =cut sub new { my ($class, $html) = @_; my $self = { }; bless $self, $class; $self->parse($html); return $self; } =head2 parse Parse the html to get message ids and next & prev offsets. =cut sub parse { my ($self, $html) = @_; my $list = $self->{list}; ($self->{prev}) = ( $html =~ m!{next}) = ( $html =~ m!{_message_ids} = \@message_ids; } =head2 message_ids Return all the messge ids found on the page =cut sub message_ids { my $self = shift; return @{$self->{_message_ids}}; } =head2 prev Return the offset of the previous page or undef if there is none. =cut sub prev { return $_[0]->{prev}; } =head2 next Return the offset of the next page or undef if there is none. =cut sub next { return $_[0]->{next}; } 1; =head1 AUTHOR Simon Wistow =head1 COPYRIGHT Copyright (c) 2004, Simon Wistow =cut WWW-Topica-0.6/lib/WWW/Topica/Mail.pm0100644000175300001440000000547010356515364016237 0ustar simonuserspackage WWW::Topica::Mail; use strict; =pod =head1 NAME WWW::Topica::Mail - parse a single Topica mailing list mail =head1 SYNOPSIS my $index = WWW::Topic::Index->new($index_html); foreach my $mess_id ($index->message_ids) { # the mail has some information and also provides a link to the reply ... my $mail = WWW::Topica::Mail->new($topica->fetch_mail($mess_id), $mess_id); # which has other information (like the un-htmled mail and the email address) ... my $reply = WWW::Topica::Reply->new($topica->fetch_reply($mail->id, $mail->eto), $mail->id, $mail->eto); } print "Next offset is ".$index->next."\n"; print "Previous offset is ".$index->prev."\n"; =head1 DESCRIPTION Used to parse a single message page from Topica.com's mailing list indexes. Message pages have the subject and the date and time of the mail being sent as well as a full name of each sender. =head1 METHODS =cut =head2 new Takes the page html and the message-id and parses the html. =cut sub new { my ($class, $html, $id) = @_; my $self = { id => $id }; bless $self, $class; $self->parse($html); return $self; } =head2 parse Parse the html to get message ids and next & prev offsets. =cut sub parse { my ($self, $html) = @_; ($self->{eto},undef,$self->{from}) = ($html =~ m!window.open\('/lists/[^/]+/read/post.html\?mode\=replytosender\&mid=\d+\&eto\=([^']+)'(.+?)return true">(.+?)!s); if (!defined $self->{eto}) { ($self->{from}) = ($html =~ m! ([^<]+)!s); } (undef,$self->{date}) = ($html =~ m!http://lists.topica.com/lists/read/images/icon_clock.gif(.+?)(.+?) <\/NOBR>!s); (undef, $self->{subject}) = ($html =~ m!(.+?)!s); ($self->{body}) = ($html =~ m! (.+?)!s); } =head2 id Get the id of this mail =cut sub id { return $_[0]->{id}; } =head2 eto Get the eto of the next reply we need to get =cut sub eto { my $self = shift; return $self->{eto}; } =head2 date Get the date of this mail =cut sub date { my $date = $_[0]->{date} || ""; return $date; } =head2 subject The subject of the mail =cut sub subject { my $subject = $_[0]->{subject} || ""; return $subject; } =head2 from Get the name of the person it was from =cut sub from { my $from = $_[0]->{from} || ""; return $from; } =head2 body Get the body of the mail. =cut sub body { my $body = $_[0]->{body} || ""; return $body; } 1; =head1 AUTHOR Simon Wistow =head1 COPYRIGHT Copyright (c) 2004, Simon Wistow =cut WWW-Topica-0.6/lib/WWW/Topica/Reply.pm0100644000175300001440000000476310356525606016454 0ustar simonuserspackage WWW::Topica::Reply; use strict; =pod =head1 NAME WWW::Topica::Index - parse a single Topic mailing list index =head1 SYNOPSIS my $index = WWW::Topic::Index->new($index_html); foreach my $message_id ($index->message_ids) { # the mail has some information and also provides a link to the reply ... my $mail = WWW::Topica::Mail->new($topica->fetch_mail($mess_id), $mess_id); # which has other information (like the un-htmled mail and the email address) ... my $reply = WWW::Topica::Reply->new($topica->fetch_reply($mail->id, $mail->eto), $mail->id, $mail->eto); } print "Next offset is ".$index->next."\n"; print "Previous offset is ".$index->prev."\n"; =head1 DESCRIPTION Used to parse a single reply page from Topica.com's mailing list indexes. Reply pages have the body of the email (albeit quoted) and potentially a full email address. =head1 METHODS =cut =head2 new Takes the html of the page, the eto and the message-id and parses the html. =cut sub new { my ($class, $html, $id, $eto) = @_; my $self = { id=>$id, eto=>$eto }; bless $self, $class; $self->parse($html); return $self; } =head2 parse Parse the html to get the subject, email address and body of the email. =cut sub parse { my ($self,$html) = @_; (undef, $self->{email}) = ($html =~ m!(.+?)!s); ($self->{subject}) = ($html =~ m!NAME\="subject" SIZE\=28 VALUE\="(.+?)"!s); ($self->{body}) = ($html =~ m!!s); return unless $self->{body}; # the body is quoted as if ready to reply. So we need to clean that up. $self->{body} =~ s!^(.+?) wrote:!!sg; $self->{body} =~ s!^>\s?!!msg; } =head2 id Get the message id =cut sub id { return $_[0]->{id}; } =head2 eto Get the message eto =cut sub eto { return $_[0]->{eto}; } =head2 email Get the email address parsed out. =cut sub email { my $email = $_[0]->{email} || ""; return $email; } =head2 subject Get the email subject parsed out. =cut sub subject { my $subject = $_[0]->{subject} || ""; return $subject; } =head2 body Get the email body parsed out. =cut sub body { return $_[0]->{body}; } 1; =head1 AUTHOR Simon Wistow =head1 COPYRIGHT Copyright (c) 2004, Simon Wistow =cut WWW-Topica-0.6/lib/WWW/Topica.pm0100644000175300001440000002620510356525440015350 0ustar simonuserspackage WWW::Topica; use strict; use Cwd; use Carp qw(carp croak); use Date::Parse; use Email::Date; use Email::Simple; use Email::Simple::Creator; use HTML::Entities; use HTML::Scrubber; use LWP::UserAgent; use URI; use vars qw($VERSION); use WWW::Topica::Index; use WWW::Topica::Mail; use WWW::Topica::Reply; $VERSION = '0.6'; my $USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'; =pod =head1 NAME WWW::Topica - read emails from a Topica mailing list =head1 SYNOPSIS my $topica = WWW::Topica->new( list => 'mylist', login => 'mylogin', password => 'mypass' ); while (my $mail = $topica->mail) { Email::LocalDelivery->deliver($mail, 'mylist.mbox'); } =head1 DESCRIPTION This module screen scrapes the Topica website and fetches back RFC822 text representations of all the mails posted to a given list. Where possible it fills in the from, to and date fields. It should be noted that in some cases it's impossible to get both the sender name and their email address. =head1 METHODS =cut =head2 new Takes three options, the list name, your login account and your password; You can also pass in C and C. C will print out various debugging messages whereas C will use local files for testing. C automatically sets C to C<1> unless debug is explicitly set to C<0>. Furthermore if you pass in a C option the parsing will start from that offset. A C lets you set an upper bound. =cut sub new { my $class = shift; my %opts = @_; die "You must pass a list\n" unless defined $opts{list}; #die "You must pass an email\n" unless defined $opts{email}; #die "You must pass a password\n" unless defined $opts{password}; $opts{_next} = $opts{first} || 0; $opts{debug} = $opts{local} if exists $opts{local} and not exists $opts{local}; $opts{scrubber} = HTML::Scrubber->new( allow => [] ); return bless \%opts, $class; } =head2 mail Returns a mail at a time Logs in automatically. =cut sub mail { my $self = shift; # first time ever unless ($self->{_index}) { $self->login; print STDERR "Beginning to collect mails\n" if $self->{debug}; } # relog in after an hour # TODO: untested unless ($self->{local}) { my $time_diff = time() - $self->{_logged_in}; $self->login() if ($time_diff>60*60); } INDEX: # need to get new message ids unless (defined $self->{_message_ids} && @{$self->{_message_ids}}) { # all over return undef unless defined $self->{_next}; # the last one we want return undef if defined $self->{last} and $self->{_next} >= $self->{last}; # end of first page # return undef if $self->{debug} && $self->{_index}; $self->{_index} = WWW::Topica::Index->new($self->fetch_index($self->{_next})); return undef unless $self->{_index}; $self->{_next} = $self->{_index}->next(); $self->{_prev} = $self->{_index}->prev(); @{$self->{_message_ids}} = $self->{_index}->message_ids; } GET: my $mess_id = shift @{$self->{_message_ids}}; goto INDEX unless defined $mess_id; # the mail has some information and also provides a link to the reply if we're logged in... my $mail_html = $self->fetch_mail($mess_id); goto GET unless $mail_html; my $mail = WWW::Topica::Mail->new($mail_html, $mess_id); my $reply; # which has other information (like the un-htmled mail and the email address) ... if ($mail->eto) { my $reply_html = $self->fetch_reply($mess_id,$mail->eto) if defined $mail->eto; goto GET unless $reply_html; $reply = WWW::Topica::Reply->new($reply_html, $mess_id, $mail->eto); } # now build the rfc822 mail string return $self->build_rfc822($mail, $reply); } =head2 login Logs in to Topica and stashes the cookie. Called automatically by the first call to C. Builds the loader automatically. =cut sub login { my $self = shift; $self->build_loader; my $anon = !defined $self->{email} || !defined $self->{password}; if ($anon) { $self->{email} = $self->{password} = 'anonymous'; } print STDERR "Logging in using ".$self->{email}."/".$self->{password}."\n" if $self->{debug}; return if $self->{local}; if (!$anon) { (undef) = $self->fetch_page("http://lists.topica.com/"); (undef) = $self->fetch_page("http://lists.topica.com/list.html"); (undef) = $self->fetch_page("http://lists.topica.com/perl/login.pl?email=".$self->{email}."&password=".$self->{password}); } # store when we logged in so that we can relog in again after an hour $self->{_logged_in} = time; } =head2 fetch_index Retrieve the html of the index page with the given offset. =cut sub fetch_index { my $self = shift; my $offset = shift; my $list = $self->{list}; print STDERR "Fetching index $offset of list ${list}\n" if $self->{debug}; my $url = "http://lists.topica.com/lists/${list}/read?sort=d&start=$offset"; if ($self->{local}) { $url = "file://".cwd."/t/local_files/"; if (0 == $offset) { $url .= "list_first.html"; } elsif (100 == $offset) { $url .= "list_middle.html"; } elsif (200 == $offset) { $url .= "list_last.html"; } } return $self->fetch_page($url); } =head2 fetch_mail Retrieve the html of a the message page with the given id. =cut sub fetch_mail { my $self = shift; my $id = shift; my $list = $self->{list}; print STDERR "\tFetching mail $id\n" if $self->{debug}; my $url = "http://lists.topica.com/lists/${list}/read/message.html?mid=$id"; if ($self->{local}) { $url = "file://".cwd."/t/local_files/mail.html"; } return $self->fetch_page($url); } =head2 fetch_reply Retrieve the html of a the reply page with the given id and eto. =cut sub fetch_reply { my $self = shift; my $id = shift; my $eto = shift; my $list = $self->{list}; print STDERR "\t\tFetching reply $id - $eto\n" if $self->{debug}; my $url = "http://lists.topica.com/lists/${list}/read/post.html?mode=replytosender&mid=$id&eto=$eto"; if ($self->{local}) { $url = "file://".cwd."/t/local_files/reply.html"; } return $self->fetch_page($url); } =head2 build_rfc822 Given a C object and a C object build up the text of an RFC822 compliant email. =cut sub build_rfc822 { my $self = shift; my $mail = shift; my $reply = shift; my $list = $self->{list}; my $mid = $mail->id; my $name = decode_entities($mail->from); my $email = ""; if (defined $reply) { $email = decode_entities($reply->email); } else { $email = "${list}\@topica.com"; } # we may have been confused and got name and email mixed up if ($name =~ /@/ && $email !~ /@/) { my $tmp = $name; $name = $email; $email = $tmp; } # try and build a sane From: line my $from; if ($name ne $email && $email =~ /@/) { $from = "$name <$email>"; } elsif ($email =~ /@/) { $from = "<$email>"; } else { $from = "$name <${list}\@topica.com>"; } # get the subject from somewhere - mail preferably because then it # doesn't have the Re: which we don't know whether to strip out or not my $subject = $mail->subject; $subject = $reply->subject if defined $reply && $subject =~ /^\s*$/; # remove newlines $subject =~ s/[\n\r]//gs; # strip out html $subject =~ s!
\s+!!sg; # hack $subject = $self->{scrubber}->scrub($subject); $subject = decode_entities($subject); # time my $time = str2time(decode_entities($mail->date)) || gmtime; # message-id my $message_id = "${mid}\@lists.topica.com"; # time to build the mail # we should probably use Email::Simple::Creator for this my $string = ""; my $body = ""; if ($reply && defined $reply->body) { $body = $reply->body; }else { $body = $self->{scrubber}->scrub($mail->body) || ""; } $string .= "Date: ".format_date($time)."\n"; $string .= "To: ${list}\@topica.com\n"; $string .= "From: $from\n"; $string .= "Message-ID: $message_id\n"; $string .= "X-TopicaMailUrl: http://lists.topica.com/lists/${list}/read/message.html?mid=${mid}\n"; if ($reply) { my $rid = $reply->id; my $eto = $reply->eto; $string .= "X-TopicaReplyUrl: http://lists.topica.com/lists/${list}/read/post.html?mode=replytosender&mid=${rid}&eto=${eto}\n"; } $string .= "Subject: $subject\n"; $string .= "\n$body\n\n"; return $string; } =head2 build_loader Set up the LWP::UserAgent object used to fetch pages. =cut sub build_loader { my $self = shift; my $ua = new LWP::UserAgent( keep_alive => 1, timeout => 30, agent => $USER_AGENT, ); # setting it in the 'new' seems not to work sometimes $ua->agent($USER_AGENT); # for some reason this makes stuff work $ua->max_redirect( 0 ); # cookies! $ua->cookie_jar( {} ); $self->{_ua} = $ua; } =head2 fetch_page Utility function for getting a page with various niceties. =cut sub fetch_page { my $self = shift; my $url = shift; # print STDERR "\tfetching $url\n" if $self->{debug}; # make a full set of headers my $h = new HTTP::Headers( 'Host' => "lists.topica.com", 'User-Agent' => $USER_AGENT, 'Referer' => $url, 'Accept' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1', 'Accept-Language' => 'en-us,en;q=0.5', 'Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', #'Accept-Encoding' => 'gzip,deflate', 'Keep-Alive' => '300', 'Connection' => 'keep-alive', ); $h->referer("$url"); my $request = HTTP::Request->new ( 'GET', $url, $h ); my $response; my $times = 0; # LWP should be able to do this but seemingly fails sometimes while ($times++<3) { $response = $self->{_ua}->request($request); last if $response->is_success; if ($response->is_redirect) { $url = URI->new($response->header("Location")); $url = $url->abs("http://lists.topica.com"); $h->referer("$url"); $request = HTTP::Request->new ( 'GET', $url, $h ); } } if (!$response->is_success && !$response->is_redirect) { carp "Failed to retrieve $url"; return undef; } return $response->content; } 1; =head1 AUTHOR Simon Wistow =head1 COPYRIGHT Copyright (c) 2004, Simon Wistow =cut WWW-Topica-0.6/Changes0100644000175300001440000000137610356526651013643 0ustar simonusersTue Jan 3 17:00:14 GMT 2006 - v 0.6 - How did I not notice that the list is hardcoded to UKR? - Make it work with anonymous lists Thu Dec 16 16:32:31 GMT 2004 - v 0.5 - fix TZ problems Wed Dec 15 14:17:26 GMT 2004 - v 0.4 - add some missing prereqs Mon Oct 25 15:17:34 BST 2004 - v 0.3 - Fix the date handling - Add a message-id - Better docs - Better command line options for topica2mail - Periodic relogging in to defeat session timeout - Strip HTML from subjects Sat Oct 23 12:15:36 BST 2004 - v 0.2 - Force URL to be absolute on redirect - Better recovery from error handling - Add first and last options to new - Turn it into an iterator Thu Oct 21 14:37:17 BST 2004 - v 0.1 - Initial release WWW-Topica-0.6/MANIFEST0100644000175300001440000000056610356527005013473 0ustar simonusersMANIFEST Changes README TODO Makefile.PL t/01use.t bin/topica2mail lib/WWW/Topica.pm lib/WWW/Topica/Index.pm lib/WWW/Topica/Mail.pm lib/WWW/Topica/Reply.pm t/local_files/list_first.html t/local_files/list_last.html t/local_files/list_middle.html t/local_files/mail.html t/local_files/reply.html META.yml Module meta-data (added by MakeMaker) WWW-Topica-0.6/TODO0100644000175300001440000000073010356515437013031 0ustar simonusers* command line options for topica2mail - DONE * cleverer name/email extraction - DONE * strip HTML in subject - DONE * relogin after (before?) timeout - DONE * better docs - DONE * date handling - DONE * fake message id - DONE * make it so you don't have to login - * catch login failures - WWW-Topica-0.6/t/0040755000175300001440000000000010356527060012602 5ustar simonusersWWW-Topica-0.6/t/local_files/0040755000175300001440000000000010356527060015056 5ustar simonusersWWW-Topica-0.6/t/local_files/list_last.html0100644000175300001440000017451610316255622017753 0ustar simonusers Topica Email List Directory
Hi Simon!
Options Post
 Gamesculture : Messages
 Previous Messages 100 Msgs. (Dec 14 – Sep 10)       
 Subject  Author  Date
 RE: CVG guys: FF12 pic isn't from Squ... Emptyjames 12/14/01
 Britney in evil dopelganger conspirac... Michael Roberts 12/14/01
 RE: Britney in evil dopelganger consp... Duncan Metcalfe 12/14/01
 Re: CVG guys: FF12 pic isn't from Squ... Kim Randell 12/14/01
 Getting the DC BBA to 'work' Brian Baird 12/14/01
 RE: Getting the DC BBA to 'work' Mr Jolly  12/14/01
 Fantastic Mr Jolly  12/14/01
 For John Duncan Metcalfe 12/15/01
 Re: For John Brian Baird 12/15/01
 Mika Bomb Emptyjames 12/17/01
 Re: Mika Bomb Mark Eveleigh 12/17/01
 RE: Mika Bomb Mr Jolly  12/17/01
 Re: For John John Hartnup 12/17/01
 RE: For John Duncan Metcalfe 12/17/01
 RE: Mika Bomb Emptyjames 12/17/01
 Re: For John John Hartnup 12/17/01
 Is it me? Mr Jolly  12/17/01
 Re: Is it me? Mark Eveleigh 12/17/01
 RE: For John Mr Jolly  12/17/01
 RE: Is it me? Emptyjames 12/17/01
 RE: For John Mark Eveleigh 12/17/01
 Apologies in advance... Emptyjames 12/17/01
 RE: Apologies in advance... Ian Manders 12/17/01
 RE: Is it me? Mr Jolly  12/17/01
 RE: For John Mr Jolly  12/17/01
 RE: Mika Bomb Kevin Clarke 12/17/01
 RE: Is it me? Ian Manders 12/17/01
 RE: For John Kevin Clarke 12/17/01
 Speccy emulator on GBA Emptyjames 12/17/01
 RE: Is it me? Michael Roberts 12/17/01
 RE: Is it me? Emptyjames 12/17/01
 RE: Is it me? Mr Jolly  12/17/01
 RE: For John James 12/17/01
 Elite on GBA! James 12/17/01
 UKR2 Mr Jolly  12/17/01
 RE: UKR2 Emptyjames 12/17/01
 RE: UKR2 Duncan Metcalfe 12/17/01
 RE: For John Mr Jolly  12/17/01
 RE: Apologies in advance... Michael Roberts 12/17/01
 RE: Apologies in advance... Duncan Metcalfe 12/17/01
 RE: Is it me? Gary Breavington 12/17/01
 RE: Apologies in advance... Emptyjames 12/17/01
 RE: Apologies in advance... Gary Breavington 12/17/01
 RE: Speccy emulator on GBA David Harvey 12/17/01
 Re: Mika Bomb Anthony Chapman 12/17/01
 Christmas Hols Matt Dymond - MDY21940 12/17/01
 Apologies if seen before Mr Jolly  12/17/01
 Another World qatmix 12/18/01
 Re: Another World Mark Eveleigh 12/18/01
 RE: Another World Matt Porter 12/18/01
 Testing/thoughts. Brian Baird 12/21/01
 Re: Testing/thoughts. Kim Randell 12/22/01
 Re[2]: Testing/thoughts. Brian Baird 12/22/01
 Happy New Year Matt Dymond - MDY21940 01/02/02
 Sega do Soccer Brawl? Matt Dymond - MDY21940 01/02/02
 Re: Happy New Year Mark Eveleigh 01/02/02
 Re: Happy New Year Gary Barker 01/02/02
 Re: Happy New Year Duncan Metcalfe 01/02/02
 Anybody there...? Matt Dymond - MDY21940 01/08/02
 Re: Anybody there...? Dee Wiswell 01/08/02
 MVS stuff John Hartnup 01/08/02
 Re: MVS stuff John Hartnup 01/08/02
 Re: MVS stuff Anthony Chapman 01/08/02
 Re: MVS stuff John Hartnup 01/09/02
 Gamecube PSO V2 James 01/09/02
 Royal Rumble Kevin Clarke 01/25/02
 Re: Royal Rumble Stephen Salt 01/25/02
 Carrier? Brian Baird 02/11/02
 Re: Carrier? Adam Doree 02/11/02
 Yahoo Japan in the West? Brian Baird 02/14/02
 A fool and his money... Brian Baird 02/15/02
 Re: A fool and his money... Duncan Metcalfe 02/15/02
 Problems with Yahoo Groups? Bru 02/16/02
 RE: A fool and his money... Kevin Clarke 02/18/02
 Jap Saturn mediocraties for trade or ... Mr Jolly  03/04/02
 Yahoo down? Mr Jolly  03/05/02
 Re: Yahoo down? Chris Andrews 03/05/02
 DC Mame Emptyjames 03/05/02
 RE: DC Mame qatmix 03/05/02
 Re: Yahoo down? Gary Barker 03/05/02
 Rockstargame Mk2? Duncan Metcalfe 03/05/02
 RE: Rockstargame Mk2? Emptyjames 03/05/02
 RE: Rockstargame Mk2? Duncan Metcalfe 03/05/02
 RE: Rockstargame Mk2? Emptyjames 03/05/02
 RE: Rockstargame Mk2? Kevin Clarke 03/05/02
 RE: Rockstargame Mk2? Duncan Metcalfe 03/05/02
 RE: Rockstargame Mk2? Kevin Clarke 03/05/02
 Re: Rockstargame Mk2? Simon Wistow 03/05/02
 Re: Rockstargame Mk2? John Hartnup 03/05/02
 RE: Rockstargame Mk2? Michael Roberts 03/05/02
 RE: Rockstargame Mk2? Michael Roberts 03/05/02
 Big List of N64 stuff Random Hagile 04/27/02
 Gardens Hainault, Ilford Essex IG6  Adam Doree 07/15/02
 RE: Gardens Hainault, Ilford Essex IG6  Emptyjames 07/15/02
 RE: Gardens Hainault, Ilford Essex IG6 Sarah Chudley 07/15/02
 =?ISO-8859-15?B?UmU6IChVS1IpIEdhcmRlb... Brian Baird 07/15/02
 Keepalive post Mr Jolly 07/23/03
 Keep alive Mr Jolly 12/11/03
 another keep alive post Mr Jolly 01/16/04
 Keepalive jo-@wibble.powernet.co.uk 09/10/04
 Previous Messages 100 Msgs. (Dec 14 – Sep 10)       
Business Software
Computer Hardware
Consumer Electronics
Developers
Family
Fashion & Apparel
Food & Drink
Health & Fitness
Home & Garden
Investing
IS/IT
Shopping & Gifts
Small Business
Tech & Wireless
Travel
Women
Extra Great Deals
HTML   Text
   More TopOffers


  Check It Out!

  Topica Channels
 Best of Topica
 Art & Design
 Books, Movies & TV
 Developers
 Food & Drink
 Health & Fitness
 Internet
 Music
 News & Information
 Personal Finance
 Personal Technology
 Small Business
 Software
 Sports
 Travel & Leisure
 Women & Family

  Start Your Own List!
Email lists are great for debating issues or publishing your views.
Start a List Today!

  jobs about topica contact us advertiser info help unsubscribe
© 2001 Topica Inc. TFMB
Copyright  |  Terms |  Anti-Spam Policy
Concerned about privacy? Topica is TrustE certified.
See our Privacy Policy.

WWW-Topica-0.6/t/local_files/reply.html0100644000175300001440000000612610316255622017077 0ustar simonusers Reply to sender
 Reply to sender
From:  example@example.com  
To:  light-@example.com   Cc: 
Subject:    Bcc: 
    
WWW-Topica-0.6/t/local_files/list_middle.html0100644000175300001440000017674710316255622020256 0ustar simonusers Topica Email List Directory
Hi Simon!
Options Post
 Gamesculture : Messages
 Previous Messages 100 Msgs. (Sep 17 – Sep 21) Next Messages 
 Subject  Author  Date
 RE: Maximum Online YES!!!! Chris Edmondson 09/17/99
 Re: True depths of banality Dreamcastmaster * 09/17/99
 Re: Maximum Online YES!!!! Dreamcastmaster * 09/17/99
 RE: Maximum Online YES!!!! Lloyd, Richard 09/17/99
 Re: True depths of banality Kim Randell 09/17/99
 RE: Maximum Online YES!!!! Maslowicz, Mark 09/17/99
 RE: oh, chinny reckon... Chris Andrews 09/17/99
 RE: Maximum Online YES!!!! Chris Edmondson 09/17/99
 RE: Maximum Online YES!!!! Lloyd, Richard 09/17/99
 RE: Maximum Online YES!!!! Stephen Fulljames 09/17/99
 RE: Maximum Online YES!!!! Kim Randell 09/17/99
 Re: Maximum Online YES!!!! John Hartnup 09/17/99
 RE: oh, chinny reckon... Chris Andrews 09/17/99
 RE: oh, chinny reckon... Chris Andrews 09/17/99
 RE: Maximum Online YES!!!! Maslowicz, Mark 09/17/99
 Re: True depths of banality Kim Randell 09/17/99
 RE: Doree Dreamcastmaster * 09/17/99
 RE: oh, chinny reckon... Chris Edmondson 09/17/99
 RE: Doree Stephen Fulljames 09/17/99
 RE: Doree Chris Edmondson 09/17/99
 RE: oh, chinny reckon... Chris Andrews 09/17/99
 RE: Hello everyone Sarah Dixon 09/17/99
 Re: True depths of banality Jonathan Dyton 09/17/99
 RE: Hello everyone Lloyd, Richard 09/17/99
 Re: Maximum Online YES!!!! Jonathan Dyton 09/17/99
 Re: Maximum Online YES!!!! JollyBoy 09/17/99
 (no subject) JollyBoy 09/17/99
 RE: Maximum Online YES!!!! Gary 09/17/99
 RE: Mean Machines Dreamcastmaster * 09/17/99
 RE: Maximum Online YES!!!! Kim Randell 09/17/99
 RE: Maximum Online YES!!!! Chris Andrews 09/17/99
 RE: Maximum Online YES!!!! Chris Andrews 09/17/99
 RE: Maximum Online YES!!!! Sarah Dixon 09/17/99
 Tony Mott John Hartnup 09/18/99
 Anyone else stuck in the office on Sa... Stephen Fulljames 09/18/99
 RE: Anyone else stuck in the office o... Gary 09/20/99
 RE: Anyone else stuck in the office o... Christophe-@sbphrd.com 09/20/99
 RE: Anyone else stuck in the office o... Kim Randell 09/20/99
 PSX2 a vision from heaven? Dreamcastmaster * 09/20/99
 Re: PSX2 a vision from heaven? Chris Edmondson 09/20/99
 RE: PSX2 a vision from heaven? Maslowicz, Mark 09/20/99
 RE: PSX2 a vision from heaven? Chris Edmondson 09/20/99
 RE: PSX2 a vision from heaven? Stephen Fulljames 09/20/99
 Re: PSX2 a vision from heaven? Dreamcastmaster * 09/20/99
 Re: PSX2 a vision from heaven? Chris Edmondson 09/20/99
 RE: PSX2 a vision from heaven? Lloyd, Richard 09/20/99
 RE: PSX2 a vision from heaven? Christophe-@sbphrd.com 09/20/99
 RE: PSX2 a vision from heaven? Nick Wiswell 09/20/99
 Re: Commodore mumblings Dreamcastmaster * 09/20/99
 Re: Commodore mumblings Kim Randell 09/20/99
 les maximos onlinos Chris Edmondson 09/20/99
 maximum Christophe-@sbphrd.com 09/20/99
 Re: les maximos onlinos  Dreamcastmaster * 09/20/99
 Re: les maximos onlinos Christophe-@sbphrd.com 09/20/99
 Rythym and Stealth Stephen Fulljames 09/20/99
 RE: Rythym and Stealth Lloyd, Richard 09/20/99
 RE: Rythym and Stealth Maslowicz, Mark 09/20/99
 RE: Rythym and Stealth Stephen Fulljames 09/20/99
 RE: Rythym and Stealth Chris.P-@icl.com 09/20/99
 RE: Rythym and Stealth Stephen Fulljames 09/20/99
 Recall: Rythym and Stealth Lloyd, Richard 09/20/99
 Re: les maximos onlinos Dreamcastmaster * 09/20/99
 RE: les maximos onlinos Stephen Fulljames 09/20/99
 RE: Eat electric death off topic merc... Dreamcastmaster * 09/20/99
 dreamcast -type antics Christophe-@sbphrd.com 09/20/99
 RE: dreamcast -type antics Lloyd, Richard 09/20/99
 Re: PSX2 a vision from heaven? John Hartnup 09/20/99
 Re: les maximos onlinos JollyBoy 09/20/99
 Re: PSX2 a vision from heaven? JollyBoy 09/20/99
 Re: PSX2 a vision from heaven? jon m 09/20/99
 Re: dreamcast -type antics jon m 09/20/99
 MAXIMUM schmaximum Chris Edmondson 09/21/99
 RE: MAXIMUM schmaximum Stephen Fulljames 09/21/99
 RE: MAXIMUM schmaximum Chris Edmondson 09/21/99
 Old Father Time Dreamcastmaster * 09/21/99
 RE: Old Father Time Stephen Fulljames 09/21/99
 RE: Old Father Time Chris Andrews 09/21/99
 RE: Old Father Time Lloyd, Richard 09/21/99
 RE: Old Father Time Lloyd, Richard 09/21/99
 RE: Old Father Time Stephen Fulljames 09/21/99
 RE: Old Father Time Chris Andrews 09/21/99
 RE: Old Father Time Chris.P-@icl.com 09/21/99
 annoyed Chris Edmondson 09/21/99
 RE: Old Father Time Lloyd, Richard 09/21/99
 RE: Old Father Time Dreamcastmaster * 09/21/99
 RE: Old Father Time Chris Andrews 09/21/99
 Re: annoyed Mat Simpson 09/21/99
 RE: Old Father Time Gary 09/21/99
 RE: Old Father Time Lloyd, Richard 09/21/99
 RE: annoyed Lloyd, Richard 09/21/99
 Re: Simply Games John Hartnup 09/21/99
 Re: annoyed Dreamcastmaster * 09/21/99
 RE: Simply Games Lloyd, Richard 09/21/99
 hmmmmm Chris Edmondson 09/21/99
 another quickie Chris Edmondson 09/21/99
 Re: hmmmmm Mat Simpson 09/21/99
 Re: another quickie Christophe-@sbphrd.com 09/21/99
 Re: another quickie Chris Edmondson 09/21/99
 Re: Simply Games John Hartnup 09/21/99
 Metropolis quicktime (actual games post) Stephen Fulljames 09/21/99
 Previous Messages 100 Msgs. (Sep 17 – Sep 21) Next Messages 
Business Software
Computer Hardware
Consumer Electronics
Developers
Family
Fashion & Apparel
Food & Drink
Health & Fitness
Home & Garden
Investing
IS/IT
Shopping & Gifts
Small Business
Tech & Wireless
Travel
Women
Extra Great Deals
HTML   Text
   More TopOffers


  Check It Out!

  Topica Channels
 Best of Topica
 Art & Design
 Books, Movies & TV
 Developers
 Food & Drink
 Health & Fitness
 Internet
 Music
 News & Information
 Personal Finance
 Personal Technology
 Small Business
 Software
 Sports
 Travel & Leisure
 Women & Family

  Start Your Own List!
Email lists are great for debating issues or publishing your views.
Start a List Today!

  jobs about topica contact us advertiser info help unsubscribe
© 2001 Topica Inc. TFMB
Copyright  |  Terms |  Anti-Spam Policy
Concerned about privacy? Topica is TrustE certified.
See our Privacy Policy.

WWW-Topica-0.6/t/local_files/list_first.html0100644000175300001440000017457210316255622020141 0ustar simonusers Topica Email List Directory
Hi Simon!
Options Post
 Gamesculture : Messages
       100 Msgs. (Sep 15 – Sep 17) Next Messages 
 Subject  Author  Date
 Re: Hi Jonathan Dyton 09/15/99
 Re: Hi Chris Andrews 09/15/99
 Re: Hi Chris Andrews 09/15/99
 one, two, testes testes Chris Edmondson 09/16/99
 doa2 Chris Edmondson 09/16/99
 Surefire way to sell DCs John Hartnup 09/16/99
 Re: one, two, testes testes Jonathan Dyton 09/16/99
 Er...hi. Kim Randell 09/16/99
 Re: Er...hi. Chris Edmondson 09/16/99
 Re: Er...hi. Jonathan Dyton 09/16/99
 Re: Er...hi. Kim Randell 09/16/99
 Re: Er...hi. Chris Edmondson 09/16/99
 Re: Er...hi. Kim Randell 09/16/99
 Re: Er...hi. Dreamcastmaster * 09/16/99
 Re: Er...hi. Jonathan Dyton 09/16/99
 Re: Er...hi. Kim Randell 09/16/99
 Games journos John Hartnup 09/16/99
 RE: Games journos Stephen Fulljames 09/16/99
 Re: Games journos Christophe-@sbphrd.com 09/16/99
 Re: Games journos Kim Randell 09/16/99
 Re: Games journos Kim Randell 09/16/99
 Re: Games journos Jonathan Dyton 09/16/99
 Re: Games journos Christophe-@sbphrd.com 09/16/99
 Re: Games journos Christophe-@sbphrd.com 09/16/99
 Re: Games journos Chris Edmondson 09/16/99
 Re: Games testing Dreamcastmaster * 09/16/99
 Re: Surefire way to sell DCs Chris Andrews 09/16/99
 Re: Surefire way to sell DCs Dreamcastmaster * 09/16/99
 Re: Games testing Chris Andrews 09/16/99
 Re: Games testing Christophe-@sbphrd.com 09/16/99
 Re: Games testing Chris Andrews 09/16/99
 oh, chinny reckon... Mat Simpson 09/16/99
 RE: Games testing Chris.P-@icl.com 09/16/99
 um Chris Edmondson 09/16/99
 Re: oh, chinny reckon... Kim Randell 09/16/99
 RE: Games testing Chris Andrews 09/16/99
 Re: um Kim Randell 09/16/99
 RE: Games testing Stephen Fulljames 09/16/99
 Re: um Chris Edmondson 09/16/99
 Re: um Jonathan Dyton 09/16/99
 Re: oh, chinny reckon... Jonathan Dyton 09/16/99
 Re: oh, chinny reckon... Dreamcastmaster * 09/16/99
 RE: oh, chinny reckon... Stephen Fulljames 09/16/99
 RE: oh, chinny reckon... Chris Andrews 09/16/99
 Re: Games journos John Hartnup 09/16/99
 RE: Games testing Christophe-@sbphrd.com 09/16/99
 Re: oh, chinny reckon... Mat Simpson 09/16/99
 Re: Games journos Christophe-@sbphrd.com 09/16/99
 Simply Games John Hartnup 09/16/99
 Re: Simply Games Chris Andrews 09/16/99
 Re: oh, chinny reckon... Jonathan Dyton 09/16/99
 Re: oh, chinny reckon... Mat Simpson 09/16/99
 Re: oh, chinny reckon... Kim Randell 09/16/99
 RE: oh, chinny reckon... Stephen Fulljames 09/16/99
 Re: oh, chinny reckon... John Hartnup 09/16/99
 Re: oh, chinny reckon... Jonathan Dyton 09/16/99
 Hello my pretty. Chris Andrews 09/16/99
 RE: oh, chinny reckon... Chris.P-@icl.com 09/17/99
 Re: oh, chinny reckon... Chris Edmondson 09/17/99
 take heart Chris Edmondson 09/17/99
 RE: oh, chinny reckon... Stephen Fulljames 09/17/99
 RE: oh, chinny reckon... Chris Edmondson 09/17/99
 RE: oh, chinny reckon... Stephen Fulljames 09/17/99
 Re: take heart Christophe-@sbphrd.com 09/17/99
 RE: oh, chinny reckon... Chris Edmondson 09/17/99
 M25 Racer John Hartnup 09/17/99
 RE: oh, chinny reckon... Christophe-@sbphrd.com 09/17/99
 RE: oh, chinny reckon... Stephen Fulljames 09/17/99
 RE: oh, chinny reckon... Christophe-@sbphrd.com 09/17/99
 RE: oh, chinny reckon... Stephen Fulljames 09/17/99
 RE: oh, chinny reckon... Chris Edmondson 09/17/99
 RE: oh, chinny reckon... Christophe-@sbphrd.com 09/17/99
 RE: oh, chinny reckon... Stephen Fulljames 09/17/99
 RE: oh, chinny reckon... Christophe-@sbphrd.com 09/17/99
 more recuits needed Dreamcastmaster * 09/17/99
 Re: more recuits needed Chris Edmondson 09/17/99
 Re: more recuits needed Christophe-@sbphrd.com 09/17/99
 Re: more recuits needed Dreamcastmaster * 09/17/99
 Get yourself a job Stephen Fulljames 09/17/99
 Re: Get yourself a job Chris Edmondson 09/17/99
 Re: take heart Kim Randell 09/17/99
 RE: more recuits needed Stephen Fulljames 09/17/99
 Re: take heart Christophe-@sbphrd.com 09/17/99
 Re: take heart Kim Randell 09/17/99
 RE: more recuits needed Dreamcastmaster * 09/17/99
 Hello everyone Sarah Dixon 09/17/99
 omg Chris Edmondson 09/17/99
 Maximum Online Chris Edmondson 09/17/99
 Re: Hello everyone Dreamcastmaster * 09/17/99
 Re: Maximum Online YES!!!! Dreamcastmaster * 09/17/99
 True depths of banality GCut-@ComputecMedia.co.uk 09/17/99
 RE: Maximum Online YES!!!! Maslowicz, Mark 09/17/99
 Re: Maximum Online YES!!!! Chris Edmondson 09/17/99
 RE: Maximum Online YES!!!! Stephen Fulljames 09/17/99
 RE: Maximum Online YES!!!! Chris Edmondson 09/17/99
 RE: Maximum Online YES!!!! Stephen Fulljames 09/17/99
 Re: Maximum Online YES!!!! John Hartnup 09/17/99
 RE: Maximum Online YES!!!! Lloyd, Richard 09/17/99
 RE: Maximum Online YES!!!! Chris Edmondson 09/17/99
 Re: Hello everyone Kim Randell 09/17/99
       100 Msgs. (Sep 15 – Sep 17) Next Messages 
Business Software
Computer Hardware
Consumer Electronics
Developers
Family
Fashion & Apparel
Food & Drink
Health & Fitness
Home & Garden
Investing
IS/IT
Shopping & Gifts
Small Business
Tech & Wireless
Travel
Women
Extra Great Deals
HTML   Text
   More TopOffers


  Check It Out!

  Topica Channels
 Best of Topica
 Art & Design
 Books, Movies & TV
 Developers
 Food & Drink
 Health & Fitness
 Internet
 Music
 News & Information
 Personal Finance
 Personal Technology
 Small Business
 Software
 Sports
 Travel & Leisure
 Women & Family

  Start Your Own List!
Email lists are great for debating issues or publishing your views.
Start a List Today!

  jobs about topica contact us advertiser info help unsubscribe
© 2001 Topica Inc. TFMB
Copyright  |  Terms |  Anti-Spam Policy
Concerned about privacy? Topica is TrustE certified.
See our Privacy Policy.

WWW-Topica-0.6/t/local_files/mail.html0100644000175300001440000006606710316255622016700 0ustar simonusers Topica Email List Directory
Hi Simon!
 Gamesculture
 Previous Message All Messages Next Message 
Re: Yahoo down?  Clive Barker
 Mar 05, 2002 05:42 PST 
"Chris Cross" <hex@dogfoo.com>; wrote:
 
   You get an appology and a picture of a fat plumber if you try to access
the web site.

Is that who they modelled Mario on?

----
There are doorways I haven't opened...
And windows I've yet to look through....
 Previous Message All Messages Next Message 
Business Software
Computer Hardware
Consumer Electronics
Developers
Family
Fashion & Apparel
Food & Drink
Health & Fitness
Home & Garden
Investing
IS/IT
Shopping & Gifts
Small Business
Tech & Wireless
Travel
Women
Extra Great Deals
HTML   Text
   More TopOffers


  Check It Out!

  Topica Channels
 Best of Topica
 Art & Design
 Books, Movies & TV
 Developers
 Food & Drink
 Health & Fitness
 Internet
 Music
 News & Information
 Personal Finance
 Personal Technology
 Small Business
 Software
 Sports
 Travel & Leisure
 Women & Family

  Start Your Own List!
Email lists are great for debating issues or publishing your views.
Start a List Today!

  jobs about topica contact us advertiser info help unsubscribe
© 2001 Topica Inc. TFMB
Copyright  |  Terms |  Anti-Spam Policy
Concerned about privacy? Topica is TrustE certified.
See our Privacy Policy.

WWW-Topica-0.6/t/01use.t0100644000175300001440000000175210316255622013724 0ustar simonusers#!perl -w use Test::More tests => 9; use Date::Parse; use_ok('WWW::Topica'); use_ok('Email::Simple'); my %opts = ( list => 'bogus', email => 'something@examples.com', password => 'foo', local => 1, debug => 0, ); my $topica; my @mails; ok($topica = WWW::Topica->new(%opts), "create new topica"); while (my $mail = $topica->mail) { push @mails, $mail; } is(scalar @mails, 300, "Got 300 mails"); my $email; my $date; ok( $email = Email::Simple->new($mails[0]), "Created new Email::Simple"); ok( $date = $email->header('date'), "Found date"); my $got_date = str2time($date); my $expected_date = str2time('Tue, 5 Mar 2002 13:42:00 +0000'); is( $email->header('subject'), 'Re: Yahoo down?', 'Got correct subject'); is( $got_date, $expected_date, 'Got correct date'); is( $email->header('from'), 'Clive Barker ', 'Got correct from'); WWW-Topica-0.6/META.yml0100644000175300001440000000130610356527005013604 0ustar simonusers# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: WWW-Topica version: 0.6 version_from: lib/WWW/Topica.pm installdirs: site requires: Carp: 0 Date::Parse: 0 Email::Date: 0 Email::LocalDelivery: 0 Email::Simple: 0 Email::Simple::Creator: 0 File::Basename: 0 HTML::Scrubber: 0 LWP::UserAgent: 0 Time::Piece: 0 URI: 0 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.25 WWW-Topica-0.6/bin/0040755000175300001440000000000010356527060013107 5ustar simonusersWWW-Topica-0.6/bin/topica2mail0100644000175300001440000000504110356526571015241 0ustar simonusers#!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 [login] [password] [ -d ] [ -l ] [ -s ] [ -e ] =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 Which mail offset to start from =head2 -e Which mail offset to end on =head1 AUTHOR Simon Wistow =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"; } WWW-Topica-0.6/Makefile.PL0100755000175300001440000000144710316255623014316 0ustar simonusersuse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'WWW::Topica', 'VERSION_FROM' => 'lib/WWW/Topica.pm', 'PREREQ_PM' => { 'Carp' => 0, 'Date::Parse' => 0, 'Email::Date' => 0, 'Email::Simple' => 0, 'Email::Simple::Creator' => 0, 'Email::LocalDelivery' => 0, 'File::Basename' => 0, 'HTML::Scrubber' => 0, 'LWP::UserAgent' => 0, 'Time::Piece' => 0, 'URI' => 0, }, 'EXE_FILES' => [ 'bin/topica2mail' ], ); WWW-Topica-0.6/README0100644000175300001440000000020210316255623013205 0ustar simonusersWWW::Topica - Scrape mails of Topica mailing lists Install using % perl Makefile.PL % make % make test % sudo make install