#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use Net::POP3; use Pod::Usage; use Term::ReadLine; use Term::ANSIColor qw(:constants); $Term::ANSIColor::AUTORESET = 1; use Carp; #use POSIX qw/getpgrp tcgetpgrp/; use vars qw( $VERSION $opt_verbose $opt_host $opt_username $opt_password $opt_noprompt $opt_summary $opt_port $opt_timeout $opt_help $opt_version ); $VERSION = sprintf '%d.%02d', q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/; $opt_noprompt = 0; $opt_port = 110; $opt_timeout = 120; GetOptions( 'v|verbose' => \$opt_verbose, 'h|host=s' => \$opt_host, 'u|username=s' => \$opt_username, 'p|password=s' => \$opt_password, 'summary' => \$opt_summary, 'noprompt' => \$opt_noprompt, 'timeout=i' => \$opt_timeout, 'port=s' => \$opt_port, 'help' => \$opt_help, 'version' => \$opt_version, ) or pod2usage(2); pod2usage(1) if $opt_help; if ($opt_version) { print <. Copyright (c) 2002-2003 Michael A Nachbaur. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. VERSION exit(0); } unless ($opt_noprompt) { my $term = new Term::ReadLine::Gnu 'pop3list'; my $attribs = $term->Attribs; $term->ReadHistory; Term::ReadLine::Gnu->Features->{ornaments} = 0; Term::ReadLine::Gnu->Features->{autohistory} = 0; my $OUT = $term->OUT || *STDOUT; unless ($opt_host) { $opt_host = $term->readline("Hostname: "); } unless ($opt_username) { $opt_username = $term->readline("Username: "); } unless ($opt_password) { $attribs->{redisplay_function} = $attribs->{shadow_redisplay}; $opt_password = $term->readline("Password: "); $term->remove_history($term->where_history); } $term->WriteHistory; } exit(1) unless defined($opt_username) or defined($opt_password) or defined($opt_host); my $messagehash = list_mailbox( username => $opt_username, password => $opt_password, host => $opt_host, port => $opt_port, timeout => $opt_timeout, ) or carp "Could not get listing for this mail account.\n"; unless (ref($messagehash) eq 'HASH') { die("Message listing failed\n"); } if ($opt_summary) { print scalar(keys(%{$messagehash})) . "\n"; } else { if (test_interactive()) { print "MSG#\tSize\n-------------------\n"; } foreach my $key (sort {$a <=> $b} keys %{$messagehash}) { print "$key\t$messagehash->{$key}\n"; } } sub list_mailbox { my (%params) = @_; my $res = undef; my $num_messages = undef; my $message_list = undef; print STDERR GREEN "Opening POP3 connectionn to $params{host}.\n" if ($opt_verbose); my $pop = Net::POP3->new($params{host}, Timeout => $params{timeout}); print STDERR GREEN "Sending USER command.\n" if ($opt_verbose); $res = $pop->user( $params{username} ); unless ($res) { print STDERR RED "Username rejected\n"; return 0; } print STDERR GREEN "Sending PASS command.\n" if ($opt_verbose); $res = $pop->pass( $params{password} ); unless ($res) { print STDERR RED "Password rejected\n"; return 0; } else { ($num_messages) = $res =~ /^(\d+)/; } print STDERR CYAN "This mailbox contains $num_messages messages.\n" if ($opt_verbose); print STDERR GREEN "Sending LIST command.\n" if ($opt_verbose); $res = $pop->list; unless ($res) { print STDERR RED "LIST command failed\n"; return 0; } else { $message_list = $res; } print STDERR GREEN "Sending QUIT command.\n" if ($opt_verbose); $res = $pop->quit(); unless ($res) { print STDERR RED "Logout rejected\n"; return 0; } return $message_list; } sub test_interactive { return -t STDIN && -t STDOUT; } 1; __END__ # Below is stub documentation for your module. You better edit it! =head1 NAME pop3list - Connects to a POP3 account and lists the messages therein =head1 OSNAMES Any Unix-like only =head1 SCRIPT CATEGORIES UNIX/System_administration Mail =head1 PREREQUISITES This script requires the C, C and C packages, which should be on your system anyway. Additionally, C and C are used to print pretty verbose messages, so you can differentiate between local message and server-side mail. Finally, the magic behind this package is thanks to C, which is required. =head1 SYNOPSIS pop3list [OPTIONS] Options: -v, --verbose be verbose about what's happening -h, --host hostname of POP server -u, --username pop3 username -p, --password password --noprompt do not prompt for information --port override the TCP port (default: 110) --timeout response timeout in secs (default: 120) --help this help screen --version version information =head1 DESCRIPTION pop3list is part of the POP3Utils package, and is used to programatically list the contents of a POP3 account. It accepts a bunch of nifty input that allows you to change it's behavior. It's really quite a cool idea, IMHO. =head1 README pop3list is part of the POP3Utils package, and is used to programatically list the contents of a POP3 account. It accepts a bunch of nifty input that allows you to change it's behavior. It's really quite a cool idea, IMHO. =head1 AUTHOR Michael A Nachbaur, Emike@nachbaur.comE =head1 COPYRIGHT Copyright (c) 2002-2003 Michael A Nachbaur. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L. =head1 REVISION $Id: pop3list,v 1.3 2003/09/10 17:44:54 nachbaur Exp $ =cut