### CMail::In::pop3
# module for checking for messages in pop3 mailboxes
package CMail::In::pop3;

use strict;

BEGIN {
	use CMail::In::Base;
	use vars qw($VERSION @ISA);

	$VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };

	@ISA = qw( CMail::In::Base );
}

use IO::Socket;

# methods
sub count {
	my $self = shift;

	my($user,$pass,$host,$port) = $self->parse_uri;
	my $verbose = $self->{verbose};

	warn "pop3: Connecting to $host.\n" if $verbose > 1;
	my $socket = $self->connect($host,$port);
	my $resp = '';

	# Get greeting from server
	$resp = $socket->getline;
	return comm_error($resp) unless $resp =~ /^\+OK/;

	# Send USER
	warn "pop3: Sending 'USER $user' to server.\n" if $verbose > 1;
	$socket->print("USER $user\r\n");
	$resp = $socket->getline;
	return comm_error($resp) unless $resp =~ /^\+OK/;

	# Send PASS
	warn "pop3: Sending 'PASS $pass' to server.\n" if $verbose > 1;
	$socket->print("PASS $pass\r\n");
	$resp = $socket->getline;
	return comm_error($resp) unless $resp =~ /^\+OK/;

	# Send STAT
	warn "pop3: Sending 'STAT' to server.\n" if $verbose > 1;
	$socket->print("STAT\r\n");
	$resp = $socket->getline;
	return comm_error($resp) unless $resp =~ /^\+OK\s+(\d+)\s+/;
	warn "pop3: Server said there are $1 messages.\n" if $verbose;
	my $count = $1;

	# Send QUIT
	warn "pop3: Sending 'QUIT' to server.\n" if $verbose > 1;
	$socket->print("QUIT\r\n");
	$resp = $socket->getline;
	return comm_error($resp) unless $resp =~ /^\+OK/;

	# Close socket.
	$socket->close;

	return($count,0);
}

# internal methods

# connect($host,$port) - opens a socket to the given host and port and
#  returns it. If someone wants to implement SSL, I suggest overloading
#  just this function, if that's all that's required.
sub connect {
	my $self = shift;
	my $host = shift;
	my $port = shift || '110';

	my $socket = IO::Socket::INET->new(
		PeerAddr	=>	$host,
		PeerPort	=>	$port,
		Proto		=>	'tcp',
	);

	if ( not defined $socket ) {
		die "pop3: couldn't open socket to $host:$port: $!\n";
	}

	return $socket;
}

sub comm_error {
	my $response = shift;

	$response =~ s/\s+$//;

	die "pop3: server responded with negative '$response'\n";

	return;
}

1;


syntax highlighted by Code2HTML, v. 0.9.1