#!/usr/bin/perl

use strict;
#sub POE::Kernel::TRACE_DEFAULT  () { 1 }
#sub POE::Kernel::TRACE_EVENTS   () { 1 }
#sub POE::Kernel::TRACE_GARBAGE  () { 1 }
#sub POE::Kernel::TRACE_PROFILE  () { 1 }
#sub POE::Kernel::TRACE_QUEUE    () { 1 }
#sub POE::Kernel::TRACE_REFCOUNT () { 1 }
#sub POE::Kernel::TRACE_RETURNS  () { 1 }
#sub POE::Kernel::TRACE_SELECT   () { 1 }
#sub POE::Kernel::TRACE_SIGNALS  () { 1 }
#sub POE::Component::Client::POP3::DEBUG () { 1 }
use Symbol qw(gensym);
use POE qw/Component::Client::POP3/;
use Data::Dumper;



sub handler_start {
    my ( $kernel, $heap ) = @_[KERNEL, HEAP];

    POE::Component::Client::POP3->spawn(
        Alias      => 'test',
        Username   => $ARGV[0],
        Password   => $ARGV[1],
        RemoteAddr => 'localhost',
        AuthMethod => 'PASS',
        Events => [{
            list          => 'pop_list',
            retr          => 'pop_message',
            authenticated => 'pop_auth',
            error         => 'pop_error',
            disconnected  => 'pop_disconnect'
        }]
    );
    $kernel->alias_set( 'me' );
}

sub handler_auth {
    my ( $kernel, $heap, $input ) = @_[KERNEL, HEAP, ARG0];
    print "Got connected: $input\n";
    $kernel->post( 'test', 'list' );
}

sub handler_list {
    my ( $kernel, $list ) = @_[KERNEL, ARG0];

    print Dumper( $list ), "\n";
    for ( sort keys %$list ) {
        $kernel->post( 'test', 'retr', $_ );
    }
    for ( sort keys %$list ) {
        my $fh = gensym;
        open $fh, ">msg$_.eml" or die "Could not open test1.eml; Reason: $!";
        $kernel->post( 'test', 'retr', $_, $fh );
    }
    $kernel->post( 'test', 'quit' );
}

sub handler_message {
    my ( $kernel, $message, $num ) = @_[KERNEL, ARG0, ARG1];

    print "Got message number $num\n";
    print Dumper( $message ), "\n";
}

sub handler_error {
    my ( $kernel, @args ) = @_[KERNEL, ARG0 .. $#_];
    print "Error with: ", Dumper( \@args ), "\n";
}

sub handler_disconnect {
    my $kernel = $_[KERNEL];

    warn "Got disconnected";
}

sub handler_stop {
    my $kernel = $_[KERNEL];

    warn "In stop";
    $kernel->alias_remove( 'me' );
}

POE::Session->create(
    inline_states => {
        _start         => \&handler_start,
        _stop          => \&handler_stop,
        pop_list       => \&handler_list,
        pop_message    => \&handler_message,
        pop_error      => \&handler_error,
        pop_auth       => \&handler_auth,
        pop_disconnect => \&handler_disconnect
    }
);

$poe_kernel->run;




syntax highlighted by Code2HTML, v. 0.9.1