我正在尝试计算我的邮件服务器成功投递所处理的电子邮件数量与当场丢弃的来自错误配置的邮件服务器、垃圾邮件等的电子邮件数量的大致百分比......
我首先在 /var/log/ 目录中运行以下 2 个命令(以捕获邮件日志中的条目以及已轮换出的旧邮件日志):
grep "dsn=2.0.0, status=sent (delivered to maildir)" * | wc -l
7814
grep "NOQUEUE: reject: RCPT" * | wc -l
13338
但后来我想这些条目可能会出现重复(尤其是 NOQUEUE)。所以我运行了以下稍作修改的命令来查看可能存在多大的差异。
grep "dsn=2.0.0, status=sent (250 2.0.0 from MTA(" * | wc -l
8839
查看我的邮件日志条目,我收到多个 NOQUEUE 投递尝试条目。但我认为这是因为发送邮件服务器有时会尝试多次投递。例如:
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 450 4.7.1 Client host rejected: cannot find your reverse hostname, [112.198.103.178]; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: NOQUEUE: reject: RCPT from unknown[112.198.103.178]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<112.198.103.178>
Aug 10 10:48:24 mail postfix/smtpd[7159]: disconnect from unknown[112.198.103.178]
所以我有两个问题:
- 我是否应该担心仅使用 grep 即可捕获重复的条目
NOQUEUE: reject: RCPT
? - 在过滤这些日志条目并得出正确的数字时,我是否应该考虑更好的方法?
- 我如何确定每次成功交付的唯一行。查看
grep "dsn=2.0.0, status=sent (delivered to maildir)" * | wc -l
和之间的差异,grep "dsn=2.0.0, status=sent (250 2.0.0 from MTA(" * | wc -l
我们可以看出存在差异。
答案1
这些似乎是单独的递送尝试,因此应该算作单独的递送尝试。
假设这类事情一定已经解决了,我查看了
munin
postfix_mailstats
脚本中是如何完成的。这是一个 perl 脚本,因此正则表达式与 perl 兼容:
以下为成功投递:
/ to=.*, status=sent /
这些是拒绝的:
/postfix\/smtpd.*proxy-reject: \S+ (\S+)/
/postfix\/smtpd.*reject: \S+ \S+ \S+ (\S+)/
/postfix\/cleanup.* reject: (\S+)/
正则表达式的捕获部分(括号之间)是拒绝代码,它指示消息是如何被拒绝的。
delivered to maildir
是本地投递,250 .* from MTA
是远程投递,即两种不同类型的投递;因此,计算出每种投递的数量不同也就不足为奇了。