Mail::IMAPClient->new hangs in Windows

2019-07-17 05:47发布

问题:

This Mail::IMAPClient->new() freezes in Windows 7:

sub connectGMail
{
    my $client = Mail::IMAPClient->new
    (
        Server   => 'imap.gmail.com',
        Port     => 993,
        Ssl      =>  1,
        User     => 'whateverUser',
        Password => 'aG00dP455w0rd',
        Socket   => IO::Socket::SSL->new
        (       
            SSL_verify_mode => SSL_VERIFY_NONE
        )
    )
    or die "Cannot connect  ($@)\n";
    return $client;
}

I tried deactivating Windows firewall, but nothing changed.

A very similar code works fine in Linux:

sub connectGMail
{
    my $client = Mail::IMAPClient->new
    (
        Server   => 'imap.gmail.com',
        Port     => 993,
        Ssl      =>  1,
        User     => 'whateverUser',
        Password => 'aG00dP455w0rd'
    )
    or die "Cannot connect  ($@)\n";
    return $client;
}

In both cases Mail::IMAPClient was installed fine from CPAN repositories, but in Windows, if I don't include the Socket option, it shows me this warning

*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 together with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************

and the rest of the script (which parses the emails) won't work correctly.

error:    unexpected end of header


error:    unexpected end of header


error:    unexpected end of header

Any help would be appreciated, thanks in advance.

回答1:

Looks like Mail::IMAPClient->new doesn't like both a socket and the server/port. If I create the socket with server/port then pass it, it does connect successfully.

sub connectGMail
{
    my $socket = IO::Socket::SSL->new
    (  
       PeerAddr => 'imap.gmail.com',  
       PeerPort => 993, 
       SSL_verify_mode => SSL_VERIFY_NONE
    )  
    or die "socket(): $@";  

    my $client = Mail::IMAPClient->new
    (
        User     => 'whateverUser',
        Password => 'aG00dP455w0rd'
        Socket   => $socket
    )
    or die "Cannot connect  ($@)\n";
    return $client;
}