log4perl запускается из другого пакета, а не отправляет сообщения, отправленные по электронной почте

Я вижу поведение, которое не могу объяснить при использовании log4perl для отправки сообщения по электронной почте.

Так что следующий тестовый скрипт работает просто отлично, и электронное письмо отправляется без проблем:

#!/usr/bin/perl
use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Log::Dispatch;

my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    threshold => "INFO",
    to => 'myemail@mail.com',
    subject => 'Perl script message'
);

my $email_logger = get_logger();
$email_logger->level($INFO);
$email_logger->add_appender($appender_email);

$email_logger->info('hi');

Log::Dispatch::Email::SSMTP это модуль, который я написал для отправки писем с помощью команды ssmtp.

Странность начинается, когда этот же точный код перемещается в другой пакет в другом файле в том же каталоге, что и мой оригинальный скрипт. Когда я делаю это и использую этот пакет из моего оригинального скрипта, электронное письмо не отправляется и не выдается никаких ошибок.

Однако, если я изменю:

Log::Dispatch::Email::SSMTP

в

Log::Log4perl::Appender::Screen

Когда я запускаю свой скрипт, он выводит "привет" на экран.

Так что, если log4perl работает при отправке сообщения на экран, почему он не работает при попытке отправить электронное письмо? И почему тот же код запускает электронное письмо из исходного скрипта, а не из пакета? Опять же, нет никаких ошибок или каких-либо признаков того, что что-то пошло не так. И я проверил, что в мой модуль загружаются операторы печати. Так что код моего модуля определенно загружается, но электронная почта все еще не запускается.

ОБНОВЛЕНИЕ Вот код, когда он не работает на запрос в комментариях.

maillog.pl

#!/usr/bin/perl
BEGIN { unshift @INC, "/home/steve/perl/perl-lib" }
use strict;
use warnings;
use Testy;

print 'start' . "\n";

Здесь Testy.pm пакет:

package Testy;
BEGIN { unshift @INC, "/home/steve/perl/perl-lib" }
use strict;
use warnings;
use Log::Log4perl qw(:easy);
use Log::Dispatch;

print 'end' . "\n";
my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    #"Log::Log4perl::Appender::Screen",
    threshold => "INFO",
    to => 'myemail@mail.com',
    subject => 'Perl script message'
);

my $email_logger = get_logger();
$email_logger->level($INFO);
$email_logger->add_appender($appender_email);

$email_logger->info('hi');

1;

А вот мой SSMTP модуль расположен в /home/steve/perl/perl-lib/Log/Dispatch/Email/SSMTP:

package Log::Dispatch::Email::SSMTP;

use strict;
use warnings;
use Log::Dispatch::Email;
use Data::Dumper;

use base qw( Log::Dispatch::Email );
print "hi, i'm here!\n";

sub send_email {
  my $self = shift;
  my %p = @_; 
  my $to = escape ( join ',', @{$self->{to}} );
  my $subject = $self->{subject};
  my $message = $p{message};
  $message =~ s/'/'\\''/g;
  print $to . "\n";
  print $subject . "\n";
  print $message . "\n";
  print "I'm working!";

  system("echo 'To: $to\nFrom: \'Me\' <myemail\@gmail.com>\nSubject:$subject\n\n$message' | /usr/sbin/ssmtp $to");
}

sub escape {
  my $address = shift;
  $address =~ s/@/\\@/g;
  return $address;
}

1;

Когда я бегу ./maillog.pl при использовании кода в Testy пакет (тот же код работает, когда в maillog.pl файл. Однако, если я раскомментирую Log::Dispatch::Email::SSMTP и заменить на Log::Log4perl::Appender::Screen оно работает.

ОБНОВЛЕНИЕ № 2, если я изменюсь Log::Log4perl::Appender::Screen в Log::Dispatch::Screen это работает также. Так что, может быть, ошибка Log::Dispatch::Email?

1 ответ

Решение

Нашел проблему с помощью справки в FAQ здесь

Очевидно, что происходит некоторая буферизация, поэтому электронные письма не отправляются немедленно, пока не будет достигнут некоторый порог для количества сгенерированных сообщений. Хотя для меня все еще остается загадкой, почему электронные письма отправляются немедленно, когда код находится в main пакет.

Так вот код, который работает с buffered свойство установлено на 0:

my $appender_email = Log::Log4perl::Appender->new(
    "Log::Dispatch::Email::SSMTP",
    threshold => "INFO",
    to => 'me@mymail.com',
    buffered => 0,
    subject => 'Perl script message'
);
Другие вопросы по тегам