[libmail-pop3client-perl] 01/01: Imported using tkCVS
gregor herrmann
gregoa at debian.org
Tue Dec 15 18:21:49 UTC 2015
This is an automated email from the git hooks/post-receive script.
gregoa pushed a commit to tag baseline-2_0
in repository libmail-pop3client-perl.
commit 9948136907c1343f42212803b404f9475a5d4934
Author: sdowd <>
Date: Thu Apr 29 14:41:54 1999 +0000
Imported using tkCVS
---
Changes | 60 ++++
MANIFEST | 6 +
Makefile.PL | 13 +
POP3Client.pm | 904 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
README | 35 +++
t/poptest.t | 142 +++++++++
6 files changed, 1160 insertions(+)
diff --git a/Changes b/Changes
new file mode 100755
index 0000000..843f774
--- /dev/null
+++ b/Changes
@@ -0,0 +1,60 @@
+Revision history for Perl extension Mail::POP3Client.
+
+This is version 2.00 of Mail::POP3Client.
+
+2.00 1999/04/29 - major rebuild, including:
+ + changed to hash-style constructor. See the inline doco.
+ This will be the only supported constructor in later
+ versions.
+ + changed underlying socket code to use IO::Socket. Timeout
+ settings on the socket are now supported so you can make
+ sure that POP accesses do not hang.
+ + added tests (use POPTESTACCOUNT environment variable to use:
+ '% POPTESTACCOUNT=userid:password:host make test')
+ + module passes strict
+ + you can construct a Mail::POP3Client object which does not
+ auto-connect (by not passing in a USER and PASSWORD) and
+ then connect manually
+
+1.23 1999/04/16
+ + fixed bug in Head when optional number of lines is not passed,
+ set to zero if undefined or non-numeric (submitted by Bjoern
+ Kriews <bkr at cut.de>)
+
+1.22 1999/04/15
+ + change Retrieve to return HeadAndBody. It was using too
+ much memory by building both an array and a string to
+ return.
+
+1.21 1999/04/08
+ + add SYNOPSIS info for perldoc.
+ + add support for previewing messages using second integer
+ argument to Head, as in $pop->Head( 0, 10 ), which would get
+ the headers and the first 10 lines of the body for message
+ 0. Contributed by Dennis Moroney <dennis at hub.iwl.net>
+ + convert prints to carps.
+ + change local to my.
+
+1.19 198/12/04
+ + added basic APOP support patches from Gerhard Gonter
+ <gonter at falbala.wu-wien.ac.at>. Login does not currently
+ auto-detect APOP on the server.
+
+1.18 1998/12/04
+ + fixed typo in Body ($$line = ...)
+ + remove set of $\
+ + once again, fix the distribution (this time I built it on a
+ Unix box. Thanks to Terry Sigle.)
+
+1.17 1998/11
+ + fixed newline/carriage return problem in distribution.
+
+1.16 1998/09
+ + replaced all occurences of chop with chomp. Should make it
+ more compatible on machines like the Mac.
+ + Removed all uses of $_ =. Uses locally declared variables
+ now.
+ + Now compiles with no warnings.
+
+
+
diff --git a/MANIFEST b/MANIFEST
new file mode 100755
index 0000000..319995b
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,6 @@
+Changes
+MANIFEST
+Makefile.PL
+POP3Client.pm
+README
+t/poptest.t
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100755
index 0000000..717cd5d
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,13 @@
+use ExtUtils::MakeMaker;
+# See lib/ExtUtils/MakeMaker.pm for details of how to influence
+# the contents of the Makefile that is written.
+WriteMakefile
+ (
+ 'NAME' => 'Mail::POP3Client',
+ 'DISTNAME' => "POP3Client",
+ 'VERSION_FROM' => 'POP3Client.pm', # finds $VERSION
+ 'dist' => {
+ COMPRESS => "gzip -9f",
+ SUFFIX => "gz",
+ }
+ );
diff --git a/POP3Client.pm b/POP3Client.pm
new file mode 100755
index 0000000..d2472d2
--- /dev/null
+++ b/POP3Client.pm
@@ -0,0 +1,904 @@
+#******************************************************************************
+# $Id$
+#
+# Description: POP3Client module - acts as interface to POP3 server
+# Author: Sean Dowd <dowd at home.com> or <sdowd at arcmail.com>
+#
+# Copyright (c) 1999 Sean Dowd. All rights reserved.
+# This module is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+#
+#******************************************************************************
+
+package Mail::POP3Client;
+
+use strict;
+use Carp;
+use IO::Socket;
+
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+require Exporter;
+
+ at ISA = qw(Exporter AutoLoader);
+# Items to export into callers namespace by default. Note: do not export
+# names by default without a very good reason. Use EXPORT_OK instead.
+# Do not simply export all your public functions/methods/constants.
+ at EXPORT = qw(
+
+);
+
+my $ID =q( $Id$ );
+$VERSION = substr q$Revision$, 10;
+
+
+# Preloaded methods go here.
+
+#******************************************************************************
+#* constructor
+#* new Mail::POP3Client( USER => user,
+#* PASSWORD => pass,
+#* HOST => host,
+#* AUTH_MODE => [APOP|PASS],
+#* TIMEOUT => 30,
+#* DEBUG => 1 );
+#* OR (deprecated)
+#* new Mail::POP3Client( user, pass, host [, port, debug, auth_mode])
+#******************************************************************************
+sub new
+{
+ my $classname = shift;
+ my $self = {
+ DEBUG => 0,
+ SERVER => "pop3",
+ PORT => 110,
+ COUNT => -1,
+ SIZE => -1,
+ ADDR => "",
+ STATE => 'DEAD',
+ MESG => 'OK',
+ BANNER => '',
+ MESG_ID => '',
+ AUTH_MODE => "PASS",
+ EOL => "\015\012",
+ TIMEOUT => 60,
+ };
+ bless( $self, $classname );
+ $self->_init( @_ );
+
+ if ( $self->User() && $self->Pass() )
+ {
+ $self->Connect();
+ }
+
+ return $self;
+}
+
+
+
+#******************************************************************************
+#* initialize - check for old-style params
+#******************************************************************************
+sub _init {
+ my $self = shift;
+
+ # if it looks like a hash
+ if ( @_ && (scalar( @_ ) % 2 == 0) )
+ {
+ # ... and smells like a hash...
+ my %hashargs = @_;
+ if ( ( defined($hashargs{USER}) &&
+ defined($hashargs{PASSWORD}) ) ||
+ defined($hashargs{HOST})
+ )
+ {
+ # ... then it must be a hash! Push all values into my internal hash.
+ foreach my $key ( keys %hashargs )
+ {
+ $self->{$key} = $hashargs{$key};
+ }
+ }
+ else {$self->_initOldStyle( @_ );}
+ }
+ else {$self->_initOldStyle( @_ );}
+}
+
+#******************************************************************************
+#* initialize using the old positional parameter style new - deprecated
+#******************************************************************************
+sub _initOldStyle {
+ my $self = shift;
+ $self->User( shift );
+ $self->Pass( shift );
+ my $host = shift;
+ $host && $self->Host( $host );
+ my $port = shift;
+ $port && $self->Port( $port );
+ my $debug = shift;
+ $debug && $self->Debug( $debug );
+ my $auth_mode = shift;
+ $auth_mode && ($self->{AUTH_MODE} = $auth_mode);
+}
+
+#******************************************************************************
+#* Is the socket alive?
+#******************************************************************************
+sub Version {
+ return $VERSION;
+}
+
+
+#******************************************************************************
+#* Is the socket alive?
+#******************************************************************************
+sub Alive
+{
+ my $me = shift;
+ $me->State =~ /^AUTHORIZATION$|^TRANSACTION$/i;
+} # end Alive
+
+
+#******************************************************************************
+#* What's the frequency Kenneth?
+#******************************************************************************
+sub State
+{
+ my $me = shift;
+ my $stat = shift or return $me->{STATE};
+ $me->{STATE} = $stat;
+} # end Stat
+
+
+#******************************************************************************
+#* Got anything to say?
+#******************************************************************************
+sub Message
+{
+ my $me = shift;
+ my $msg = shift or return $me->{MESG};
+ $me->{MESG} = $msg;
+} # end Message
+
+
+#******************************************************************************
+#* set/query debugging
+#******************************************************************************
+sub Debug
+{
+ my $me = shift;
+ my $debug = shift or return $me->{DEBUG};
+ $me->{DEBUG} = $debug;
+
+} # end Debug
+
+
+#******************************************************************************
+#* set/query the port number
+#******************************************************************************
+sub Port
+{
+ my $me = shift;
+ my $port = shift or return $me->{PORT};
+
+ $me->{PORT} = $port;
+
+} # end port
+
+
+#******************************************************************************
+#* set the host
+#******************************************************************************
+sub Host
+{
+ my $me = shift;
+ my $host = shift or return $me->{HOST};
+
+ $me->{INTERNET_ADDR} = inet_aton( $host ) or
+ $me->Message( "Could not inet_aton: $host, $!") and return;
+ $me->{HOST} = $host;
+} # end host
+
+
+#******************************************************************************
+#* query the socket to use as a file handle
+#******************************************************************************
+sub Socket {
+ my $me = shift;
+ return $me->{'SOCKET'};
+}
+
+
+#******************************************************************************
+#* set/query the USER
+#******************************************************************************
+sub User
+{
+ my $me = shift;
+ my $user = shift or return $me->{USER};
+ $me->{USER} = $user;
+
+} # end User
+
+
+#******************************************************************************
+#* set/query the password
+#******************************************************************************
+sub Pass
+{
+ my $me = shift;
+ my $pass = shift or return $me->{PASSWORD};
+ $me->{PASSWORD} = $pass;
+
+} # end Pass
+
+
+#******************************************************************************
+#*
+#******************************************************************************
+sub Count
+{
+ my $me = shift;
+ my $c = shift;
+ if (defined $c and length($c) > 0) {
+ $me->{COUNT} = $c;
+ } else {
+ return $me->{COUNT};
+ }
+
+} # end Count
+
+
+#******************************************************************************
+#* set/query the size of the mailbox
+#******************************************************************************
+sub Size
+{
+ my $me = shift;
+ my $c = shift;
+ if (defined $c and length($c) > 0) {
+ $me->{SIZE} = $c;
+ } else {
+ return $me->{SIZE};
+ }
+
+} # end Size
+
+
+#******************************************************************************
+#*
+#******************************************************************************
+sub EOL {
+ my $me = shift;
+ return $me->{'EOL'};
+}
+
+
+#******************************************************************************
+#*
+#******************************************************************************
+sub Close
+{
+ my $me = shift;
+ if ($me->Alive()) {
+ my $s = $me->Socket();
+ print $s "QUIT", $me->EOL;
+ close( $me->Socket() ) or $me->Message("close failed: $!") and return 0;
+# shutdown($me->{SOCKET}, 2) or $me->Message("shutdown failed: $!") and return 0;
+ $me->State('DEAD');
+ }
+ 1;
+} # end Close
+
+
+#******************************************************************************
+#*
+#******************************************************************************
+sub DESTROY
+{
+ my $me = shift;
+ $me->Close;
+} # end DESTROY
+
+
+#******************************************************************************
+#* Connect to the specified POP server
+#******************************************************************************
+sub Connect
+{
+ my ($me, $host, $port) = @_;
+
+ $host and $me->Host($host);
+ $port and $me->Port($port);
+
+ $me->Close();
+
+ my $s = IO::Socket::INET->new( PeerAddr => $me->Host(),
+ PeerPort => $me->Port(),
+ Proto => "tcp",
+ Type => SOCK_STREAM,
+ Timeout => $me->{TIMEOUT} )
+ or
+ $me->Message( "could not connect socket [$me->{HOST}, $me->{PORT}]: $!" )
+ and
+ return 0;
+ $me->{SOCKET} = $s;
+
+ select((select($s) , $| = 1)[0]); # autoflush
+
+ defined(my $msg = <$s>) or $me->Message("Could not read") and return 0;
+ chomp $msg;
+ $me->{BANNER}= $msg;
+ $me->{MESG_ID}= $1 if ($msg =~ /(<[\w\d\-\.]+\@[\w\d\-\.]+>)/);
+ $me->Message($msg);
+ $me->State('AUTHORIZATION');
+
+ $me->User() and $me->Pass() and $me->Login();
+
+} # end Connect
+
+
+#******************************************************************************
+#* login to the POP server. If the AUTH_MODE is set to APOP an the
+#* server supports it, it will use APOP. Otherwise uid and password are
+#* sent in clear text.
+#******************************************************************************
+sub Login
+{
+ my $me= shift;
+ if ($me->{AUTH_MODE} eq 'APOP' && $me->{MESG_ID}) { $me->Login_APOP(); }
+ else { $me->Login_Pass(); }
+}
+
+
+#******************************************************************************
+#* login to the POP server using APOP (md5) authentication.
+#******************************************************************************
+sub Login_APOP
+{
+ require MD5;
+
+ my $me = shift;
+ my $s = $me->Socket();
+ my $hash= MD5->hexhash ($me->{MESG_ID} . $me->Pass);
+
+ print $s "APOP " , $me->User , ' ', $hash, $me->EOL;
+ my $line = <$s>;
+ chomp $line;
+ $me->Message($line);
+ $line =~ /^\+OK/ or $me->Message("APOP failed: $line") and $me->State('AUTHORIZATION')
+ and return 0;
+ $me->State('TRANSACTION');
+
+ $me->POPStat() or return 0;
+}
+
+
+#******************************************************************************
+#* login to the POP server using simple (cleartext) authentication.
+#******************************************************************************
+sub Login_Pass
+{
+ my $me = shift;
+ my $s = $me->Socket();
+ print $s "USER " , $me->User() , $me->EOL;
+ my $line = <$s>;
+ chomp $line;
+ $me->Message($line);
+ $line =~ /^\+/ or $me->Message("USER failed: $line") and $me->State('AUTHORIZATION')
+ and return 0;
+
+ print $s "PASS " , $me->Pass() , $me->EOL;
+ $line = <$s>;
+ chomp $line;
+ $me->Message($line);
+ $line =~ /^\+OK/ or $me->Message("PASS failed: $line") and $me->State('AUTHORIZATION')
+ and return 0;
+
+ $me->State('TRANSACTION');
+
+ $me->POPStat() or return 0;
+
+} # end Login
+
+
+#******************************************************************************
+#* Get the Head of a message number. If you give an optional number
+#* of lines you will get the first n lines of the body also. This
+#* allows you to preview a message.
+#******************************************************************************
+sub Head
+{
+ my $me = shift;
+ my $num = shift;
+ my $lines = shift;
+ $lines ||= 0;
+ $lines =~ /\d+/ || ($lines = 0);
+ my $header = '';
+ my $s = $me->Socket();
+
+ $me->Debug() and carp "POP3: TOP $num $lines\n";
+ print $s "TOP $num $lines", $me->EOL;
+ my $line = <$s>;
+ $me->Debug() and carp "POP3: $line";
+ chomp $line;
+ $line =~ /^\+OK/ or $me->Message("Bad return from TOP: $line") and return '';
+ $line =~ /^\+OK (\d+) / and my $buflen = $1;
+
+ do {
+ $line = <$s>;
+# $line =~ /^\s*$|^\.\s*$/ or $header .= $line;
+ $line =~ /^\.\s*$/ or $header .= $line;
+ } until $line =~ /^\.\s*$/;
+
+ return wantarray ? split(/\r?\n/, $header) : $header;
+} # end Head
+
+
+#******************************************************************************
+#* Get the header and body of a message
+#******************************************************************************
+sub HeadAndBody
+{
+ my $me = shift;
+ my $num = shift;
+ my $mandb = '';
+ my $s = $me->Socket();
+
+ $me->Debug() and carp "POP3: RETR $num\n";
+ print $s "RETR $num", $me->EOL;
+ my $line = <$s>;
+ $me->Debug() and carp "POP3: $line";
+ chomp $line;
+ $line =~ /^\+OK/ or $me->Message("Bad return from RETR: $line") and return '';
+ $line =~ /^\+OK (\d+) / and my $buflen = $1;
+
+ do {
+ $line = <$s>;
+ $line =~ /^\.\s*$/ or $mandb .= $line;
+ } until $line =~ /^\.\s*$/;
+
+ return wantarray ? split(/\r?\n/, $mandb) : $mandb;
+
+} # end HeadAndBody
+
+
+#******************************************************************************
+#* get the body of a message
+#******************************************************************************
+sub Body
+{
+ my $me = shift;
+ my $num = shift;
+ my $body = '';
+ my $s = $me->Socket();
+
+ $me->Debug() and carp "POP3: RETR $num\n";
+ print $s "RETR $num", $me->EOL;
+ my $line = <$s>;
+ $me->Debug() and carp "POP3: $line";
+ chomp $line;
+ $line =~ /^\+OK/ or $me->Message("Bad return from RETR: $line") and return '';
+ $line =~ /^\+OK (\d+) / and my $buflen = $1;
+
+ # skip the header
+ do {
+ $line = <$s>;
+ } until $line =~ /^\s*$/;
+
+ do {
+ $line = <$s>;
+ $line =~ /^\.\s*$/ or $body .= $line;
+ } until $line =~ /^\.\s*$/;
+
+ return wantarray ? split(/\r?\n/, $body) : $body;
+
+} # end Body
+
+
+#******************************************************************************
+#* handle a STAT command - returns the number of messages in the box
+#******************************************************************************
+sub POPStat {
+ my $me = shift;
+ my $s = $me->Socket();
+
+ $me->Debug() and carp "POP3: POPStat";
+ print $s "STAT", $me->EOL;
+ my $line = <$s>;
+ $line =~ /^\+OK/ or $me->Message("STAT failed: $line") and return -1;
+ $line =~ /^\+OK (\d+) (\d+)/ and $me->Count($1), $me->Size($2);
+
+ return $me->Count();
+}
+
+
+#******************************************************************************
+#* issue the LIST command
+#******************************************************************************
+sub List {
+ my $me = shift;
+ my $num = shift || '';
+ my $CMD = shift || 'LIST';
+ $CMD=~ tr/a-z/A-Z/;
+
+ my $s = $me->Socket();
+ $me->Alive() or return;
+
+ my @retarray = ();
+ my $ret = '';
+
+ $me->Debug() and carp "POP3: $CMD $num";
+ print $s "$CMD $num", $me->EOL;
+ my $line = <$s>;
+ $line =~ /^\+OK/ or $me->Message("$line") and return;
+ if ($num) {
+ $line =~ s/^\+OK\s*//;
+ return $line;
+ }
+ while( defined( $line = <$s> ) ) {
+ $line =~ /^\.\s*$/ and last;
+ $ret .= $line;
+ chomp $line;
+ push(@retarray, $line);
+ }
+ if ($ret) {
+ return wantarray ? @retarray : $ret;
+ }
+}
+
+
+#******************************************************************************
+#* retrieve the given message number - uses HeadAndBody
+#******************************************************************************
+sub Retrieve {
+ return HeadAndBody( @_ );
+}
+
+
+#******************************************************************************
+#* implement the LAST command - see the rfc (1081)
+#******************************************************************************
+sub Last {
+ my $me = shift;
+
+ my $s = $me->Socket();
+
+ $me->Debug() and carp "POP3: LAST (obsolete)";
+ print $s "LAST", $me->EOL;
+ my $line = <$s>;
+
+ $line =~ /\+OK (\d+)\s*$/ and return $1;
+}
+
+
+#******************************************************************************
+#* reset the deletion stat
+#******************************************************************************
+sub Reset {
+ my $me = shift;
+
+ my $s = $me->Socket();
+ $me->Debug() and carp "POP3: RSET";
+ print $s "RSET", $me->EOL;
+ my $line = <$s>;
+ $line =~ /\+OK .*$/ and return 1;
+ return 0;
+}
+
+
+#******************************************************************************
+#* delete the given message number
+#******************************************************************************
+sub Delete {
+ my $me = shift;
+ my $num = shift || return;
+
+ my $s = $me->Socket();
+ $me->Debug() and carp "POP3: DELE $num";
+ print $s "DELE $num", $me->EOL;
+ my $line = <$s>;
+ $me->Message($line);
+ $line =~ /^\+OK / && return 1;
+ return 0;
+}
+
+
+#******************************************************************************
+#* UIDL - submitted by Dion Almaer (dion at member.com)
+#******************************************************************************
+sub Uidl {
+ my $me = shift;
+ my $num = shift || '';
+
+ my $s = $me->Socket();
+ $me->Alive() or return;
+
+ my @retarray = ();
+ my $ret = '';
+
+ $me->Debug() and carp "POP3: UIDL $num";
+ print $s "UIDL $num", $me->EOL;
+ my $line = <$s>;
+ $line =~ /^\+OK/ or $me->Message($line) and return;
+ if ($num) {
+ $line =~ s/^\+OK\s*//;
+ return $line;
+ }
+ while( defined( $line = <$s> ) ) {
+ $line =~ /^\.\s*$/ and last;
+ $ret .= $line;
+ chomp $line;
+ my ($num, $uidl) = split ' ', $line;
+ $retarray[$num] = $uidl;
+ }
+ if ($ret) {
+ return wantarray ? @retarray : $ret;
+ }
+}
+
+
+# end package Mail::POP3Client
+
+# Autoload methods go after =cut, and are processed by the autosplit program.
+
+1;
+__END__
+
+
+
+################################################################################
+# POD Documentation (perldoc Mail::POP3Client or pod2html this_file)
+################################################################################
+
+=head1 NAME
+
+Mail::POP3Client - Perl 5 module to talk to a POP3 (RFC1939) server
+
+=head1 SYNOPSIS
+
+ use Mail::POP3Client;
+ $pop = new Mail::POP3Client( USER => "me",
+ PASSWORD => "mypassword",
+ HOST => "pop3.do.main" );
+ for( $i = 1; $i <= $pop->Count(); $i++ ) {
+ foreach( $pop->Head() ) {
+ /^(From|Subject):\s+/i && print $_, "\n";
+ }
+ }
+ $pop->Close();
+ # OR
+ $pop2 = new Mail::POP3Client( HOST => "pop3.otherdo.main" );
+ $pop2->User( "somebody" );
+ $pop2->Pass( "doublesecret" );
+ $pop2->Connect() || die $pop2->Message();
+ $pop2->Close();
+
+=head1 DESCRIPTION
+
+This module implements an Object-Oriented interface to a POP3 server.
+It implements RFC1939 (http://www.faqs.org/rfcs/rfc1939.html)
+
+=head1 EXAMPLES
+
+Here is a simple example to list out the From: and Subject: headers in
+your remote mailbox:
+
+ #!/usr/local/bin/perl
+
+ use Mail::POP3Client;
+
+ $pop = new Mail::POP3Client( USER => "me",
+ PASSWORD => "mypassword",
+ HOST => "pop3.do.main" );
+ for ($i = 1; $i <= $pop->Count(); $i++) {
+ foreach ( $pop->Head( $i ) ) {
+ /^(From|Subject):\s+/i and print $_, "\n";
+ }
+ print "\n";
+ }
+
+=head1 CONSTRUCTORS
+
+Old style (deprecated):
+ new Mail::POP3Client( USER, PASSWORD [, HOST, PORT, DEBUG, AUTH_MODE] );
+
+New style (shown with defaults):
+ new Mail::POP3Client( USER => "",
+ PASSWORD => "",
+ HOST => "pop3",
+ PORT => 110,
+ AUTH_MODE => 'PASS',
+ DEBUG => 0,
+ TIMEOUT => 60,
+ );
+
+=over 4
+
+=item *
+USER is the userID of the account on the POP server
+
+=item *
+PASSWORD is the cleartext password for the userID
+
+=item *
+HOST is the POP server name or IP address (default = 'pop3')
+
+=item *
+PORT is the POP server port (default = 110)
+
+=item *
+DEBUG - any non-null, non-zero value turns on debugging (default = 0)
+
+=item *
+AUTH_MODE - pass 'APOP' to attempt APOP (MD5) authorization. (default is 'PASS')
+
+=item *
+TIMEOUT - set a timeout value for socket operations (default = 60)
+
+=back
+
+=head1 METHODS
+
+These commands are intended to make writing a POP3 client easier.
+They do not necessarily map directly to POP3 commands defined in
+RFC1081 or RFC1939, although all commands should be supported. Some
+commands return multiple lines as an array in an array context.
+
+=over 8
+
+=item I<new>( USER => 'user', PASSWORD => 'password', HOST => 'host',
+ PORT => 110, DEBUG => 0, AUTH_MODE => 'PASS', TIMEOUT => 60 )
+
+Construct a new POP3 connection with this. You should use the
+hash-style constructor. B<The old positional constructor is
+deprecated and will be removed in a future release. It is strongly
+recommended that you convert your code to the new version.>
+
+You should give it at least 2 arguments: USER and PASSWORD. The
+default HOST is 'pop3' which may or may not work for you. You can
+specify a different PORT (be careful here).
+
+new will attempt to Connect to and Login to the POP3 server if you
+supply a USER and PASSWORD. If you do not supply them in the
+constructor, you will need to call Connect yourself.
+
+The valid values for AUTH_MODE are 'PASS' and 'APOP'. APOP implies
+that an MD5 checksum will be used instrad of passing your password in
+cleartext. However, B<if the server does not support APOP, the
+cleartext method will be used. Be careful.>
+
+If you enable debugging with DEBUG => 1, messages about command will
+go to STDERR.
+
+Another warning, it's impossible to differentiate between a timeout
+and a failure.
+
+
+=item I<Head>( MESSAGE_NUMBER )
+
+Get the headers of the specified message, either as an array or as a
+string, depending on context.
+
+You can also specify a number of preview lines which will be returned
+with the headers. This may not be supported by all POP3 server
+implementations as it is marked as optional in the RFC. Submitted by
+Dennis Moroney <dennis at hub.iwl.net>.
+
+=item I<Body>( MESSAGE_NUMBER )
+
+Get the body of the specified message, either as an array of lines or
+as a string, depending on context.
+
+=item I<HeadAndBody>( MESSAGE_NUMBER [, PREVIEW_LINES ] )
+
+Get the head and body of the specified message, either as an array of
+lines or as a string, depending on context.
+
+=over 4
+
+=item Example
+
+foreach ( $pop->HeadAndBody( 1, 10 ) )
+ print $_, "\n";
+
+prints out a preview of each message, with the full header and the
+first 10 lines of the message (if supported by the POP3 server).
+
+=back
+
+=item I<Retrieve>( MESSAGE_NUMBER )
+
+Same as HeadAndBody.
+
+=item I<Delete>( MESSAGE_NUMBER )
+
+Mark the specified message number as DELETED. Becomes effective upon
+QUIT. Can be reset with a Reset message.
+
+=item I<Connect>
+
+Start the connection to the POP3 server. You can pass in the host and
+port.
+
+=item I<Close>
+
+Close the connection gracefully. POP3 says this will perform any
+pending deletes on the server.
+
+=item I<Alive>
+
+Return true or false on whether the connection is active.
+
+=item I<Socket>
+
+Return the file descriptor for the socket.
+
+=item I<Size>
+
+Set/Return the size of the remote mailbox. Set by POPStat.
+
+=item I<Count>
+
+Set/Return the number of remote messages. Set during Login.
+
+=item I<Message>
+
+The last status message received from the server.
+
+=item I<State>
+
+The internal state of the connection: DEAD, AUTHORIZATION, TRANSACTION.
+
+=item I<POPStat>
+
+Return the results of a POP3 STAT command. Sets the size of the
+mailbox.
+
+=item I<List>
+
+Return a list of sizes of each message.
+
+=item I<Last>
+
+Return the number of the last message, retrieved from the server.
+
+=item I<Reset>
+
+Tell the server to unmark any message marked for deletion.
+
+=item I<User>( [USER_NAME] )
+
+Set/Return the current user name.
+
+=item I<Pass>( [PASSWORD] )
+
+Set/Return the current user name.
+
+=item I<Login>
+
+Attempt to login to the server connection.
+
+=item I<Host>( [HOSTNAME] )
+
+Set/Return the current host.
+
+=item I<Port>( [PORT_NUMBER] )
+
+Set/Return the current port number.
+
+=back
+
+=head1 AUTHOR
+
+Sean Dowd <dowd at home.com>
+
+=head1 CREDITS
+
+Based loosely on News::NNTPClient by Rodger Anderson
+<rodger at boi.hp.com>.
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
diff --git a/README b/README
new file mode 100755
index 0000000..5565599
--- /dev/null
+++ b/README
@@ -0,0 +1,35 @@
+WHAT IS IT?
+
+This is a POP3 client module for perl5. It provides an
+object-oriented interface to a POP3 server. It can be used to write
+perl-based biff clients, mail readers, or whatever. See the inline
+POD doco for more details. (perldoc Mail::POP3Client)
+
+
+HOW DO I INSTALL/TEST IT?
+
+To install Mail::POP3Client:
+
+% perl Makefile.PL
+% make
+% make test
+% make install
+
+NOTE: if you want to test against a real mailbox, set the environment
+variable POPTESTACCOUNT to some POP3 account in the following format:
+user:password:host.
+
+% export POPTESTACCOUNT=jsmith:secret:pop3.my.do.main
+% make test
+
+
+WHERE IS THE DOCUMENTATION?
+
+The documentation is in the code in POD format. To read it, use
+'perldoc Mail::POP3Client' or you can extract it to html using
+pod2html.
+
+
+Written by Sean Dowd <dowd at home.com> or <sdowd at arcmail.com>.
+
+
diff --git a/t/poptest.t b/t/poptest.t
new file mode 100755
index 0000000..43b7343
--- /dev/null
+++ b/t/poptest.t
@@ -0,0 +1,142 @@
+# Before `make install' is performed this script should be runnable with
+# `make test'. After `make install' it should work as `perl t/poptest.t'
+
+######################### We start with some black magic to print on failure.
+
+# Change 1..1 below to 1..last_test_to_print .
+# (It may become useful if the test is moved to ./t subdirectory.)
+
+BEGIN { $| = 1; $tests=26; print "1..$tests\n"; }
+END {print "not ok 1\n" unless $loaded;}
+use Mail::POP3Client;
+$loaded = 1;
+print "ok 1\n";
+
+######################### End of black magic.
+
+# Insert your test code below (better if it prints "ok 13"
+# (correspondingly "not ok 13") depending on the success of chunk 13
+# of the test code):
+
+
+# additional tests require a pop account to test against
+# set POPTESTACCOUNT in environment. Format is user:password:host
+# % POPTESTACCOUNT="userid:password:pop3" make test
+
+$ENV{POPTESTACCOUNT} || do {
+ print STDERR "\nTests 2-$tests skipped, try setting POPTESTACCOUNT=user:pass:host in environment\n";
+ for ( $test = 2; $test <= $tests; $test++ ) {print "ok $test\n";}
+};
+
+$ENV{POPTESTACCOUNT} && do {
+ ($user, $pass, $host) = split( /:/, $ENV{POPTESTACCOUNT} );
+
+ my $test = 2;
+
+ # recommended style - autoconnects
+ my $pop = new Mail::POP3Client( PASSWORD => $pass,
+ HOST => $host,
+ USER => $user,
+ );
+
+ $pop->Alive() || print "not ";
+ print "ok ", $test++, "\n";
+
+ # test some of the methods (we won't test a Delete)
+ $pop->POPStat() >= 0 || print "not ";
+ print "ok ", $test++, "\n";
+
+ (my $count = $pop->Count()) >= 0 || print "not ";
+ print "ok ", $test++, "\n";
+
+ $pop->Size() >= 0 || print "not ";
+ print "ok ", $test++, "\n";
+
+ if ( $count > 0 )
+ {
+ my @array = $pop->List() || print "not ";
+ }
+ print "ok ", $test++, "\n";
+
+ if ( $count > 0 )
+ {
+ $pop->Head( 1 ) || print "not ";
+ }
+ print "ok ", $test++, "\n";
+
+ if ( $count > 0 )
+ {
+ $pop->HeadAndBody( 1 ) || print "not ";
+ }
+ print "ok ", $test++, "\n";
+
+ if ( $count > 0 )
+ {
+ $pop->Body( 1 ) || print "not ";
+ }
+ print "ok ", $test++, "\n";
+
+
+ $pop->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+
+ # do each step by hand
+ my $pop2 = new Mail::POP3Client( HOST => $host ) || print "not ";
+ print "ok ", $test++, "\n";
+ $pop2->User( $user );
+ $pop2->Pass( $pass );
+ $pop2->Connect() and $pop2->POPStat() || print "not ";
+ print "ok ", $test++, "\n";
+
+ $pop2->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+
+ # test old positional-style constructors
+ my $pop3 = new Mail::POP3Client( $user, $pass, $host ) || print "not ";
+ print "ok ", $test++, "\n";
+
+ $pop3->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+ my $pop4 = new Mail::POP3Client( $user, $pass, $host, 110 ) || print "not ";
+ print "ok ", $test++, "\n";
+ $pop4->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+ my $pop5 = new Mail::POP3Client( $user, $pass, $host, 110, 0 ) || print "not ";
+ print "ok ", $test++, "\n";
+ $pop5->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+ my $pop6 = new Mail::POP3Client( $user, $pass, $host, 110, 0, 'APOP' ) || print "not ";
+ print "ok ", $test++, "\n";
+ $pop6->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+ my $pop7 = new Mail::POP3Client( $user, $pass, $host, 110, 0, 'PASS' ) || print "not ";
+ print "ok ", $test++, "\n";
+ $pop7->Close() || print "not ";
+ print "ok ", $test++, "\n";
+
+
+ # 2 concurrent connections - server may barf on this
+ my $pop8 = new Mail::POP3Client( PASSWORD => $pass,
+ HOST => $host,
+ USER => $user,
+ );
+ my $pop9 = new Mail::POP3Client( PASSWORD => $pass,
+ HOST => $host,
+ USER => $user,
+ );
+
+ $pop8->Alive() && $pop9->Alive() || print "not ";
+ print "ok ", $test++, "\n";
+
+ $pop8->Close() || print "not ";
+ print "ok ", $test++, "\n";
+ $pop9->Close() || print "not ";
+ print "ok ", $test++, "\n";
+};
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmail-pop3client-perl.git
More information about the Pkg-perl-cvs-commits
mailing list