The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
   # Connects to NNTP Server, selects a group, then downloads all current articles.
   use strict;
   use POE;
   use POE::Component::Client::NNTP;
   use Mail::Internet;
   use FileHandle;

   $|=1;

   POE::Component::Client::NNTP->spawn ( 'NNTP-Client', { NNTPServer => 'news.host' } );

   POE::Session->create(
        package_states => [
                'main' => { nntp_disconnected => '_shutdown',
                            nntp_socketerr    => '_shutdown',
                            nntp_421          => '_shutdown',
                            nntp_200          => '_connected',
                            nntp_201          => '_connected',
                },
                'main' => [ qw(_start nntp_211 nntp_220 nntp_223)
                ],
        ],
   );

   $poe_kernel->run();
   exit 0;

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

        # Our session starts, register to receive all events from poco-client-nntp
        $kernel->post ( 'NNTP-Client' => register => 'all' );
        # Okay, ask it to connect to the server
        $kernel->post ( 'NNTP-Client' => 'connect' );
        undef;
   }

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

        print "$text\n";

        # Select a group to download from.
        $kernel->post( 'NNTP-Client' => group => 'random.group' );
        undef;
   }

   sub nntp_211 {
        my ($kernel,$heap,$text) = @_[KERNEL,HEAP,ARG0];
        print "$text\n";

        # The NNTP server sets 'current article pointer' to first article in the group.
        # Retrieve the first article
        $kernel->post( 'NNTP-Client' => 'article' );
   }

   sub nntp_220 {
        my ($kernel,$heap,$text,$article) = @_[KERNEL,HEAP,ARG0,ARG1];
        print "$text\n";

        my $message = Mail::Internet->new( $article );
        my $filename = $message->head->get( 'Message-ID' );
        my $fh = new FileHandle "> articles/$filename";
        $message->print( $fh );
        $fh->close;

        # Set 'current article pointer' to the 'next' article in the group.
        $kernel->post( 'NNTP-Client' => 'next' );
        undef;
   }

   sub nntp_223 {
        my ($kernel,$heap,$text) = @_[KERNEL,HEAP,ARG0];
        print "$text\n";

        # Server has moved to 'next' article. Retrieve it.
        # If there isn't a 'next' article an 'nntp_421' is generated
        # which will call '_shutdown'
        $kernel->post( 'NNTP-Client' => 'article' );
        undef;
   }

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

        # We got disconnected or a socketerr unregister and terminate the component.
        $kernel->post ( 'NNTP-Client' => unregister => 'all' );
        $kernel->post ( 'NNTP-Client' => 'shutdown' );
        undef;
   }