diff options
Diffstat (limited to 'lib/Net/POP3.pm')
-rw-r--r-- | lib/Net/POP3.pm | 65 |
1 files changed, 41 insertions, 24 deletions
diff --git a/lib/Net/POP3.pm b/lib/Net/POP3.pm index 772bf76..bccdfb0 100644 --- a/lib/Net/POP3.pm +++ b/lib/Net/POP3.pm @@ -2,10 +2,11 @@ # # Versions up to 2.29 Copyright (c) 1995-2004 Graham Barr <gbarr@pobox.com>. # All rights reserved. -# Changes in Version 2.29_01 onwards Copyright (C) 2013-2014 Steve Hay. All +# Changes in Version 2.29_01 onwards Copyright (C) 2013-2015 Steve Hay. All # rights reserved. -# This program is free software; you can redistribute it and/or -# modify it under the same terms as Perl itself. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F<LICENCE> file. package Net::POP3; @@ -19,27 +20,33 @@ use IO::Socket; use Net::Cmd; use Net::Config; -our $VERSION = "2.32"; +our $VERSION = "3.08"; # Code for detecting if we can use SSL my $ssl_class = eval { require IO::Socket::SSL; # first version with default CA on most platforms - IO::Socket::SSL->VERSION(1.968); + no warnings 'numeric'; + IO::Socket::SSL->VERSION(2.007); } && 'IO::Socket::SSL'; my $nossl_warn = !$ssl_class && - 'To use SSL please install IO::Socket::SSL with version>=1.968'; + 'To use SSL please install IO::Socket::SSL with version>=2.007'; # Code for detecting if we can use IPv6 +my $family_key = 'Domain'; my $inet6_class = eval { require IO::Socket::IP; - IO::Socket::IP->VERSION(0.20); + no warnings 'numeric'; + IO::Socket::IP->VERSION(0.20) || die; + $family_key = 'Family'; } && 'IO::Socket::IP' || eval { require IO::Socket::INET6; + no warnings 'numeric'; IO::Socket::INET6->VERSION(2.62); } && 'IO::Socket::INET6'; + sub can_ssl { $ssl_class }; sub can_inet6 { $inet6_class }; @@ -59,7 +66,6 @@ sub new { } my $hosts = defined $host ? [$host] : $NetConfig{pop3_hosts}; my $obj; - my @localport = exists $arg{ResvPort} ? (LocalPort => $arg{ResvPort}) : (); if ($arg{SSL}) { # SSL from start @@ -74,7 +80,9 @@ sub new { PeerAddr => ($host = $h), PeerPort => $arg{Port} || 'pop3(110)', Proto => 'tcp', - @localport, + $family_key => $arg{Domain} || $arg{Family}, + LocalAddr => $arg{LocalAddr}, + LocalPort => exists($arg{ResvPort}) ? $arg{ResvPort} : $arg{LocalPort}, Timeout => $arg{Timeout}, ) and last; @@ -84,14 +92,11 @@ sub new { unless defined $obj; ${*$obj}{'net_pop3_arg'} = \%arg; + ${*$obj}{'net_pop3_host'} = $host; if ($arg{SSL}) { - Net::POP3::_SSLified->start_SSL($obj, - SSL_verifycn_name => $host,%arg - ) or return; + Net::POP3::_SSL->start_SSL($obj,%arg) or return; } - ${*$obj}{'net_pop3_host'} = $host; - $obj->autoflush(1); $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef); @@ -136,7 +141,7 @@ sub starttls { my $self = shift; $ssl_class or die $nossl_warn; $self->_STLS or return; - Net::POP3::_SSLified->start_SSL($self, + Net::POP3::_SSL->start_SSL($self, %{ ${*$self}{'net_pop3_arg'} }, # (ssl) args given in new @_ # more (ssl) args ) or return; @@ -570,14 +575,16 @@ sub banner { } { - package Net::POP3::_SSLified; + package Net::POP3::_SSL; our @ISA = ( $ssl_class ? ($ssl_class):(), 'Net::POP3' ); sub starttls { die "POP3 connection is already in SSL mode" } sub start_SSL { my ($class,$pop3,%arg) = @_; delete @arg{ grep { !m{^SSL_} } keys %arg }; ( $arg{SSL_verifycn_name} ||= $pop3->host ) - =~s{(?<!:):[\w()]+$}{}; # strip port + =~s{(?<!:):[\w()]+$}{}; # strip port + $arg{SSL_hostname} = $arg{SSL_verifycn_name} + if ! defined $arg{SSL_hostname} && $class->can_client_sni; $arg{SSL_verifycn_scheme} ||= 'pop3'; my $ok = $class->SUPER::start_SSL($pop3,%arg); $@ = $ssl_class->errstr if !$ok; @@ -620,12 +627,16 @@ Net::POP3 - Post Office Protocol 3 Client class (RFC1939) This module implements a client interface to the POP3 protocol, enabling a perl5 application to talk to POP3 servers. This documentation assumes that you are familiar with the POP3 protocol described in RFC1939. +With L<IO::Socket::SSL> installed it also provides support for implicit and +explicit TLS encryption, i.e. POP3S or POP3+STARTTLS. A new Net::POP3 object must be created with the I<new> method. Once this has been done, all POP3 commands are accessed via method calls on the object. -The Net::POP3 class is a subclass of Net::Cmd and IO::Socket::INET. +The Net::POP3 class is a subclass of Net::Cmd and (depending on avaibility) of +IO::Socket::IP, IO::Socket::INET6 or IO::Socket::INET. + =head1 CONSTRUCTOR @@ -656,9 +667,14 @@ upgrade with C<starttls>. You can use SSL arguments as documented in L<IO::Socket::SSL>, but it will usually use the right arguments already. -B<ResvPort> - If given then the socket for the C<Net::POP3> object -will be bound to the local port given using C<bind> when the socket is -created. +B<LocalAddr> and B<LocalPort> - These parameters are passed directly +to IO::Socket to allow binding the socket to a specific local address and port. +For compatibility with older versions B<ResvPort> can be used instead of +B<LocalPort>. + +B<Domain> - This parameter is passed directly to IO::Socket and makes it +possible to enforce IPv4 connections even if L<IO::Socket::IP> is used as super +class. Alternatively B<Family> can be used. B<Timeout> - Maximum time, in seconds, to wait for a response from the POP3 server (default: 120) @@ -837,10 +853,11 @@ Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version =head1 COPYRIGHT Versions up to 2.29 Copyright (c) 1995-2004 Graham Barr. All rights reserved. -Changes in Version 2.29_01 onwards Copyright (C) 2013-2014 Steve Hay. All +Changes in Version 2.29_01 onwards Copyright (C) 2013-2015 Steve Hay. All rights reserved. -This program is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. +This module is free software; you can redistribute it and/or modify it under the +same terms as Perl itself, i.e. under the terms of either the GNU General Public +License or the Artistic License, as specified in the F<LICENCE> file. =cut |