Я пытаюсь подсчитать приблизительный процент того, сколько писем мой почтовый сервер обрабатывает для успешной доставки, по сравнению с тем, сколько писем он сразу теряет как приходящие с неправильно настроенных почтовых серверов, спам и т. д.
Сначала я выполнил следующие 2 команды в каталоге /var/log/ (чтобы перехватить записи в почтовом журнале, а также старые почтовые журналы, которые были удалены):
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]
Итак, у меня 2 вопроса:
- Стоит ли мне беспокоиться о выявлении дубликатов записей с помощью 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
это удаленная доставка, т.е. это два разных типа доставки; поэтому неудивительно, что вы подсчитываете разное количество каждого из них.