Невозможно вызвать метод "auth" для неопределенного значения в .. ПОСЛЕ МНОГИХ УСПЕШНЫХ РАБОТ - PullRequest
1 голос
/ 26 февраля 2012

У меня есть приложение на Perl, которое должно отправлять электронные письма большому количеству получателей. Кажется, все работает нормально, но после примерно 9K электронных писем происходит сбой:

    Can't call method "auth" on an undefined value at...

В коде я вижу:

    # Open a connection to the SendGrid mail server
    my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN);

    # Authenticate
    my $code = $smtp->auth($USERNAME, $PASSWORD);

Очевидно, что в приложении нет синтаксических ошибок, потому что оно сначала работает. Я гуглил и искал этот сайт, но ничего не смог найти ...

Буду очень признателен за любой совет.

Ответы [ 4 ]

3 голосов
/ 26 февраля 2012

Конструктор Net :: SMTP возвращает undef, если есть проблема (например, он не может подключиться к порту 25 на smtp.xyz.net).Вы не проверяете это, и когда вы пытаетесь вызвать метод на undef, вы получаете сообщение об ошибке, которое вы упомянули.

my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN)
  or die "Failed to open SMTP connection: $!";

может дать вам больше информации.(Хотя это не обязательно ошибка сокета, поэтому $! может не содержать ничего полезного.)

2 голосов
/ 26 февраля 2012

Вы можете изменить его, чтобы повторять через увеличивающиеся интервалы примерно так:

my $retry = 10; # in seconds;
my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN);
while (not defined $smtp) {
  if ($retry > 300) {
    die "could not connect to smtp server, giving up";
  else {
    print "could not connect to smtp, retrying in $retry seconds\n";
  }
  sleep ($retry);
  $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN);
  $retry *= 2;
}

# Authenticate
my $code = $smtp->auth($USERNAME, $PASSWORD);
2 голосов
/ 26 февраля 2012

В документации Net :: SMTP говорится, что при сбое метода возвращается undef.Поэтому я ожидаю, что ваш вызов метода не удался.

Вы можете получить больше информации, включив флаг Debug => 1 в конструкторе Net :: SMTP.Ошибка вызова метода и, возможно, повторите попытку после небольшого ожидания.

   # Open a connection to the SendGrid mail server
    my $smtp = Net::SMTP->new('smtp.xyz.net', Port=> 25, Hello=>$DOMAIN, Debug=>1);

    die "Failed to make connection" unless ($smtp);

    # Authenticate
    my $code = $smtp->auth($USERNAME, $PASSWORD);
0 голосов
/ 08 октября 2018

Это происходит в основном, если у вас неправильный почтовый ящик.Проверьте, является ли smtp.xyz.net правильным почтовым ящиком smtp или это может быть даже mail.xyz.net.Такая ошибка возникает, если auth не может работать с заданным значением host.

...