Main Page |
Recipe 18.15 Program: rfrmThis program fetches a list of messages waiting on a POP3 server and summarizes that list: # ./rfrm Nathan Torkington Re: YAPC Rob Brown Re: Net::Ping syn round trip time Rael Dornfest Re: Book Proposal - Blosxom in a Nutshell spam@example.com Extend your ping times 633%!!!! Tell the program which POP3 server to contact and the username and password to authenticate with using a ~/.rfrmrc file like this: SERVER=pop3.example.com USER=gnat PASS=I(heart)Perl The program verifies that your .rfrmrc file isn't readable or writable by anyone but you, and stops if it is. The program is shown in Example 18-4. Example 18-4. rfrm#!/usr/bin/perl -w # rfrm - get a list of mail messages waiting on a pop server use Net::POP3; use strict; my ($Pop_host, $Pop_user, $Pop_pass) = read_conf( ) or usage( ); my $pop = Net::POP3->new($Pop_host) or die "Can't connect to $Pop_host: $!\n"; defined ($pop->login($Pop_user, $Pop_pass)) or die "Can't authenticate\n"; my $messages = $pop->list or die "Can't get a list of messages\n"; foreach my $msgid (sort { $a <=> $b } keys %$messages) { my ($msg, $subject, $sender, $from); $msg = $pop->top($msgid, 0); # returns ref to array $msg = join "\n", @$msg; # now it's one big string # extract From and Subject lines, and boil From down $subject = $sender = ''; if ($msg =~ /^Subject: (.*)/m) { $subject = $1 } if ($msg =~ /^From: (.*)/m) { $sender = $1 } ($from = $sender) =~ s{<.*>}{ }; if ($from =~ m{\(.*\)}) { $from = $1 } $from ||= $sender; # print boiled down summary of this message printf("%-20.20s %-58.58s\n", $from, $subject); } sub usage { die <<EOF ; usage: rfrm Configure with ~/.rfrmrc thus: SERVER=pop.mydomain.com USER=myusername PASS=mypassword EOF } sub read_conf { my ($server, $user, $pass, @stat); open(FH, "< $ENV{HOME}/.rfrmrc") or return; # paranoia check @stat = stat(FH) or die "Can't stat ~/.rfrmrc: $!\n"; if ($stat[2] & 177) { die "~/.rfrmrc should be mode 600 or tighter\n"; } # read config file while (<FH>) { if (/SERVER=(.*)/) { $server = $1 } if (/USER=(.*)/) { $user = $1 } if (/PASS=(.*)/) { $pass = $1 } } close FH; # must have something for every value return unless $server && $user && $pass; return ($server, $user, $pass); } |
Main Page |