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 が機能する場合、電子メールを送信しようとすると機能しないのはなぜでしょうか? また、同じコードがパッケージからではなく、元のスクリプト内から電子メールを送信するのはなぜですか? 繰り返しますが、スローされるエラーや、何か問題が発生したことを示す兆候はありません。また、モジュールに print ステートメントが読み込まれることを確認しました。したがって、モジュールのコードは確実にロードされていますが、電子メールはまだ送信されていません。
更新コメントのリクエストごとに機能しない 場合のコードは次のとおりです。
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
ますか?