/usr/bin/mail 有队列吗?

/usr/bin/mail 有队列吗?

RHEL 5

我正在使用在旧的 RHEL 5 机器上运行的 perl 服务监控脚本(由不再在公司工作的同事编写)。如果服务关闭,它会向 root 用户发送电子邮件警报:

            # Email administrator
            if ($retval == 0 && $config{'MAX_EMAILS'} > 0) {
                $service_restarts{$service} = 0;
                system("echo \"This notification was generated because $service was down and has been successfully restarted.\"
 | /bin/mail -s \"Monitor: $service restarted ($date)\" root");
            }

/etc/aliases我有:

root:            [email protected]

我的问题是——需要运行哪些服务才能将发送到 root 的邮件转发到外部别名?如果这些服务中断了,还会/usr/bin/mail排队吗?

答案1

mail非常愚蠢,通常只是将消息传递给sendmail二进制文件。不幸的是,有多种实现,mail因此您理想情况下需要检查文档或代码以查看对正在使用的确切版本进行了哪种错误处理(如果有)。

除了属于sendmail邮件传输代理 (MTA)(在 RHEL5 上很可能是 Sendmail 或 Postfix)一部分的邮件服务之外,您可能还需要 DNS,因为 MTA 需要执行 DNS 查找才能fooexample.blah发送邮件那里。如果出现临时故障并且电子邮件最终位于 MTA 队列目录中的某个位置(RHEL MTA 默认情况下包括此类队列运行程序),则可能还有 MTA 队列运行程序。哦,还有文件系统,如果/var或其他什么情况已满,MTA 可能无法对其他邮件进行排队,因此可能不会接受来自 的邮件mail。 (特别是如果由于其他错误,警报系统填满/var,然后创建更多警报,然后当它恢复正常时,您必须致电寻呼机公司,因为他们禁用了您的寻呼机,因为它收到了无数警报,哦,我所以不要错过那些天。)

...以及一个工作网络,具体取决于您想要定义服务的范围...还有可选但常用的反垃圾邮件服务;当 Gmail 或 Exchange 将您的提醒作为垃圾邮件拒绝或丢弃时,会发生什么情况?

另请注意,该调用缺乏错误检查systemmail(或forkexec调用)可能会失败,然后怎么办?更明智的做法可能是将此类失败记录在某处:

use Sys::Syslog;
openlog("homegrown-monitoring-101", "ndelay", "user");

system("echo ... root") == 0
  or syslog(LOG_ERR, "non-zero exit code from mail command");

然后理想地有就像是sec.pl检查homegrown-monitoring-101日志并报告它们(通过分组摘要,而不是通常的每条日志消息一封电子邮件的 cron 垃圾邮件......)。

mail或者 MTA 也可能将dead.letter文件留在某个地方(假设它可以写入它想要写入的位置),理论上监控可以检查这些文件,但如果有新的警报dead.letter并且您的警报是通过电子邮件发送的,您可能需要一些其他协议来报告该情况错误。

在 centos 7 系统上,我改为使用该perl-Email-Sender包来mail传递消息位置:

#!/usr/bin/perl
use 5.16.0;
use warnings;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;

...

my $message = ...;
my $email = Email::Simple->create(
    header => [
        To      => $username . '@example.edu',
        From    => '[email protected]',
        Subject => "...",
    ],
    body => $message,
);
sendmail($email);

相关内容