Как читать Gmail через POP3 с помощью ActivePerl 5.10 в Windows XP?

Я использую Windows XP SP3 с ActiveState Perl 5.10.0, и я написал эту функцию, взятую/отредактированную из CPAN Net::POP3, в попытке прочитать Gmail через POP3:

  my $pop = Net::POP3->new('pop.gmail.com', 
                            Timeout => 60, 
                            Port => 995, 
                            Debug => 1) || die "$!";
  my $num = $pop->login('[email protected]', 'password');
  if (!defined($num))
  {
    die "Error: couldn't sign-in to your email account.\n";
  }
  elsif ($num > 0)
  {
    warn "There are $num message(s) in your inbox.\n";
    my $msgnums = $pop->list;
    foreach my $msgnum (keys %$msgnums)
    {
      my $msg = $pop->get($msgnum);
      print @$msg;
    }
  }
  else
  {
    die "There are no messages in your inbox. (Nothing to do.)\n"
  }

  $pop->quit;

Код просто истекает с этим сообщением об ошибке:

Use of uninitialized value in numeric eq (==) at C:/Perl/lib/Net/POP3.pm line 59.
Bad file descriptor at pop3.pl line xxx (i.e., the Net::POP3->new() line)

Отладочная информация от Net::POP3 до истечения времени ожидания была следующей:

Net::POP3>>> Net::POP3(2.29)
Net::POP3>>>   Net::Cmd(2.29)
Net::POP3>>>     Exporter(5.62)
Net::POP3>>>   IO::Socket::INET(1.31)
Net::POP3>>>     IO::Socket(1.30_01)
Net::POP3>>>       IO::Handle(1.27)
Net::POP3=GLOB(0x20d253c): Timeout at pop3.pl line xxx

Я также пытался использовать Mail::POP3Client; никакой радости от Windows XP, потому что ни CPAN, ни PPM не установили бы его и его зависимости (IO::SOCKET::SSL и т. д.).

Есть идеи, что не так с моим кодом и/или как можно читать Gmail через POP3 в Windows XP с ActivePerl 5.10.0?

Согласно Gmail, стандартные инструкции по настройке:

Incoming Mail (POP3) Server - requires SSL:  pop.gmail.com
Use SSL: Yes
Port: 995

person Scavokovich    schedule 15.03.2013    source источник
comment
Плохой файловый дескриптор — обычное значение для $!, и ничто из того, что я вижу, не заставляет меня думать, что $! здесь имеет смысл. Один из его базовых классов хранит сообщения в $@, так что это может иметь смысл.   -  person ikegami    schedule 15.03.2013
comment
Тем не менее, использование Net::POP3 не будет работать, поскольку требуется SSL.   -  person ikegami    schedule 15.03.2013
comment
Re: SSL: Я также пробовал Net::POP3::SSLWrapper, но, как и Mail::POP3Client и т. д., он не устанавливался (ни cpan, ни ppm).   -  person Scavokovich    schedule 15.03.2013
comment
IO::Socket::SSL недоступен из ppm, поскольку сначала должен быть установлен генератор случайных чисел. См. его README. Как ни странно, он у меня установлен. Я думаю, что на самом деле он мог поставляться в комплекте с самим ActivePerl. (Но более новая версия)   -  person ikegami    schedule 15.03.2013
comment
Что вы сделали, когда установщик IO::Socket::SSL попросил вас прочитать его README и предлагает установить генератор случайных чисел?   -  person ikegami    schedule 15.03.2013
comment
Ни cpan, ни ppm не упоминали об этом. вывод cpan из 1817 строк не упоминает «случайный». ppm (часто бесполезный) просто говорит: «Не удается найти ни одного пакета, предоставляющего IO::Socket::SSL».   -  person Scavokovich    schedule 15.03.2013
comment
P.S. под «cpan» я имею в виду команду, которую я ввожу в командной строке.   -  person Scavokovich    schedule 15.03.2013
comment
От cpan IO::Socket::SSL я получаю Net::SSLeay could not find a random number generator on your system. This will likely cause most of the tests to fail. Please see the README file for more information. Если вы не получили эту ошибку, какую ошибку вы получили?   -  person ikegami    schedule 15.03.2013
comment
Было около 400+ строк вывода. Все 23 из 23 тестов провалены. Нигде не упоминается слово «случайный». Опять же, это было с 5.10.0.   -  person Scavokovich    schedule 15.03.2013
comment
Это происходит задолго до начала испытаний. (В cpan выполните o conf build_dir_reuse 0 и o conf commit. Теперь вы можете пропустить шаги, сообщающие об ошибке.)   -  person ikegami    schedule 15.03.2013
comment
Как бы я ни хотел сохранить Perl 5.10.0, после четырех часов работы над ним я решил перейти на 5.16.2. Я заменил «использовать Net::POP3» на «использовать Net::POP3::SSLWrapper» и использовал ppm для его установки (это было успешно с 5.16.2). НЕ ЗАБУДЬТЕ добавить pop3s { }; вокруг оригинального кода! (См. пример на CPAN.) Итак, теперь это работает! Спасибо, Икегами, за помощь.   -  person Scavokovich    schedule 15.03.2013
comment
Фу! Net::POP3/Net::POP3::SSLWrapper оказались НЕ в состоянии читать сообщения. Я мог войти в систему и получить список ($pop->list;) сообщений (хеш; ключ = номер сообщения, значение = размер), но попытки получить ($pop->get($msgnum);) не увенчались успехом: Use of uninitialized value in numeric eq (==) at C:/Perl/lib/Net/POP3.pm line 312 Поэтому вместо этого я переключился на Mail::POP3Client: ЭТО РАБОТАЕТ!   -  person Scavokovich    schedule 15.03.2013


Ответы (1)


Вам необходимо использовать SSL для доступа к GMail. Это означает, что вам необходимо установить модуль Perl IO::Socket::SSL. Но это очень просто. ActiveState поставляет хороший клиент cpan и огромное количество бинарных пакетов «PPM». Это требует, чтобы вы обновили Perl до 5.14 или 5.16 или получили какой-то контракт, который они требуют для поддержки старых Perl.

Вы также можете использовать Strawberry Perl; у него есть не менее хороший клиент cpan + инструменты сборки.

person MichielB    schedule 15.05.2013