我编写了一个Perl脚本,它使用POP3从Gmail帐户检索邮件。不久前,脚本崩溃了,我怀疑这是因为Gmail在使用POP3时开始需要SSL或TLS连接。
我在Mike的博客上找到了这个有趣的帖子,其中包括以下示例代码:
#!/usr/bin/env perl
use strict;
use warnings;
use Net::SSLGlue::POP3;
use Mozilla::CA;
my $host = 'pop.aol.com';
my $login = 'myusername@aol.com';
my $pass = '4Radfsai8fsfd9sdf9sdf';
my $pop3 = Net::POP3->new( $host) || die "Can't connect to $host: $!";
$pop3->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file(),
) || die "Can't perform starttls: $!";
my $messages = $pop3->login( $login, $pass )
|| die "Failed to authenticate login $login on $host: $!";
print "There are $messages messages on $host for $login.\n";下面是我的一部分代码(出于安全原因更改了一些细节):
use YAML;
use Net::SSLGlue::POP3;
use Mozilla::CA;
use Email::Find;
use Data::Dumper;
use LWP::Simple;
my $email_finder = Email::Find->new(\&process_email);
my $verbose = 1;
my $email_account = 'my.email@mydomain.net';
my $email_password = 'somepassword';
my $mail_server = "mail.mydomain.net";
print("\nStarted\n") if ($verbose);
$pop = Net::POP3->new($mail_server) || die("Could not log on to server.");
print(" - starttls using " . Mozilla::CA::SSL_ca_file() . "\n") if ($verbose);
$pop->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!";我的问题是..。
$pop->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!";..。失败了但我说不出原因。有什么建议吗?
更新.
谢谢你斯特芬。通过添加调试=> 1并输出$IO::Socket::SSL::SSL_ERROR,我更新了代码:
$pop = Net::POP3->new($mail_server, Debug => 1)
|| die("Could not log on to server.");
print(" - starttls using " . Mozilla::CA::SSL_ca_file() . "\n") if ($verbose);
$pop->starttls(
SSL_verify_mode => 1,
SSL_ca_file => Mozilla::CA::SSL_ca_file()
) || die "Can't perform starttls: $!\n" . $IO::Socket::SSL::SSL_ERROR;现在的错误消息是:
Net::POP3>>> Net::POP3(2.29)
Net::POP3>>> Net::Cmd(2.29)
Net::POP3>>> Exporter(5.63)
Net::POP3>>> IO::Socket::INET(1.31)
Net::POP3>>> IO::Socket(1.31)
Net::POP3>>> IO::Handle(1.28)
Net::POP3=GLOB(0xb41980)<<< +OK Dovecot ready.
- starttls using /usr/local/share/perl/5.10.1/Mozilla/CA/cacert.pem
Net::POP3=GLOB(0xb41980)>>> STLS
Net::POP3=GLOB(0xb41980)<<< +OK Begin TLS negotiation now.
Can't perform starttls:
**SSL connect attempt failed with unknown error error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate
verify failed at (my script) line 26.**这基本上是说,“Mozilla::CA证书不适合您”吗?
发布于 2014-01-17 19:22:07
它可能失败的原因有几个,如果您在Net::POP3 3-> => 1中添加Debug POP3 1,它会有所帮助。我可以想出以下的理由:
如果这没有帮助,请发布来自调试的输出,并可能设置$IO::Socket::SSL::DEBUG=10。
Steffen ( Net::SSLGlue::POP3 3的作者,IO::Socket::SSL的当前开发人员)
https://stackoverflow.com/questions/21193149
复制相似问题