sendmail 队列-显示每个域的消息数

sendmail 队列-显示每个域的消息数

是否有一个简单的命令可以找出 linux sendmail 队列中每个域的当前消息数?mailq 会转储出一个详细列表,但不方便快速概览。

我正在使用 Centos 和 sendmail。

mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c
But the above command output is as following:
1 domain.com>

上述命令不能满足我的要求,请提供这方面的帮助。

以下是更新后的输出:

domain.com> has 5 message(s)
domain.com.pk> has 1 message(s)
abc.com.pk> has 2 message(s)
xyz.coinfo.net.cn> has 1 message(s)
mmm.com> has 1 message(s)

答案1

好吧,如果您要使用 perl,不妨一路使用下去。

以下是计算每个域的消息数量的一种相当不完善的方法:

#!/usr/bin/perl

use strict;

my @mailq = `cat /home/users/rilindo/mailq`; #Had to simulate the output of the mail command here. Change this to the actual mailq path, e.g. /usr/bin/mailq
my %domains = ();

foreach my $m (@mailq) {
    $m =~ s/^\s+//;
    $m =~ s/\s+$//;
    $m =~ s/>//;
    next if $m =~ /Queue/;
    if ($m =~ /\d\d:\d\d:\d\d/) {
        $domains{(split(/@/,$m))[1]}++;
    }
    else {
        $domains{(split(/@/,$m))[1]}++;
    }
}

foreach my $d (keys %domains) {
    print $d . " has $domains{$d} message(s)" . "\n";
}

本质上,我们将 mailq 命令的输出发送到数组中并进行迭代。对于数组中的每个记录,我们删除前导和尾随空格/换行符,然后在“@”符号处拆分。然后我们将域作为键插入(如果不存在),然后在哈希中增加它。在下一次尝试时,如果找到相同的域,它将简单地增加值。从那里,我们循环遍历哈希,然后打印出域和匹配总数。

结果:

[rilindo@localhost ~]$ ./parsemail.pl 
domain.com has 6 message(s)
domain3.com has 2 message(s)
domain1.com has 2 message(s)

就像我说的,它并不完美,但它能完成工作。即使没有别的,它也能让你知道接下来该怎么做。

顺便说一句,既然你似乎了解 Perl,那么回顾一下 Perl 的哈希数据结构将会非常有用:

http://www.cs.mcgill.ca/~abatko/computers/programming/perl/howto/hash/

或者:

http://perldoc.perl.org/perldsc.html

答案2

尝试这个:

# mailq -v | awk 'BEGIN { FS = "@" } \
!/^[a-zA-Z0-9-]|^[ \t]+(\(|\/|Total requests:)/ { print $2 }' | sort | uniq -c

答案3

“简单”是相对的。mailq 的输出解析起来非常麻烦,但还是可以做到的。典型的mailq详细输出如下:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
637F5CFF9C*    1497 Sat Dec 18 21:40:34  [email protected] 
                                         [email protected]

637F5CFF9d*    1497 Sat Dec 18 21:40:35  [email protected] 
                                         [email protected]

一些创造性的技巧可以让你得到你需要的东西:

首先,你需要删除最上面的那行 - 它对人类有用,但与我们的解析目标无关。
最简单的方法:mailq -v | egrep -v '^-'

现在您要获取收件人信息并提取域名。Perl 是您的好朋友 - 通过这个方便的脚本(我们称之为get_domains.pl)传输输出:

#!/usr/bin/perl
$/ = "\n\n";                                    # Use a blank line as the separator.
while (<>) {
        ($x,$recip) = split(/\n/, $_);          # Extract the recipient line
        ($user,$domain) = split(/@/, $recip);   # Get the domain.
        print "$domain\n";                      # Print Recipient Domain
}

这只剩下简单的部分——计算域(通过管道sort | uniq -c)。

因此mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c 会给你类似的输出:

    1 domain.com
    1 domain2.com

相关内容