[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