Разбор непоставленных почтовых заголовков (отказов почты)

9

Как лучше всего проанализировать заголовки отклоненной (недоставленной) электронной почты, отправленной обратно на мой сервер, и определить, является ли это мягкой или жесткой передачей?

Я отправляю только подписные письма своим пользователям, но иногда некоторые адреса электронной почты устаревают. Когда электронное письмо возвращается на мой сервер, я хотел бы выяснить, почему оно было возвращено (мягкое / жесткое). Затем я могу соответствующим образом справиться с этим в своей базе данных и / или отметить пользователя, чтобы он обновлял свою электронную почту при следующем входе в систему.

Я использую Ubuntu и Postfix. Я успешно реализовал VERP с псевдонимами и виртуальными псевдонимами. Таким образом, для отклоненных писем есть обратный путь bounce+OrigEmailAddress@example.com , и я могу направить их в скрипт.

Теперь, когда у меня есть настройка VERP, я знаю, кому было отправлено исходное письмо, но мне нужно проанализировать заголовки возвращенной почты, чтобы выяснить, мягкая она или жесткая.

Каков наилучший способ справиться с этим? Насколько я понимаю, не все почтовые серверы играют по одинаковым правилам, а заголовки могут иметь различные форматы. Есть ли какой-нибудь проект с открытым исходным кодом, который отслеживает подобные вещи? Что-то простое, что я могу реализовать, чтобы правильно классифицировать большинство отскоков?

Я пытаюсь защитить репутацию своего почтового сервера, поэтому любая помощь очень ценится!

Ричард
источник

Ответы:

9

Как объясняет RFC3463 , коды состояния, начинающиеся с 5, используются для постоянных сбоев и 4 для постоянных переходных сбоев. Вместо того, чтобы пытаться анализировать несколько сообщений в разных форматах, вы можете положиться на журналы сервера и попробовать что-то вроде этого:

grep " dsn=5." /var/log/mail.log | grep -o -P " to=<(.+?)>" | sort | uniq -c

Это найдет постоянные ошибки в mail.log (формат Postfix) и даст адреса и количество отказов на каждом адресе. Вы также можете использовать «dsn = 4». получить адреса с временными ошибками.

Эса Йокинен
источник
Спасибо, Эса! Я не понимал, что postfix имел эту информацию в почтовом журнале. Это решение, которое вы используете? Считаете ли вы, что постфикс правильно классифицирует жесткие скачки dsn = 5? Я читал, что некоторые почтовые серверы не соответствуют RFC. Поэтому я подумал, что может потребоваться более сложное решение. Каким был ваш опыт? Это кажется хорошим решением, если мы можем проверить postfix, чтобы понять это правильно :-)
Ричард
Действительно полезный скрипт - спасибо! Рецепт здесь для альтернативы флага -P grep (для пользователей Mac и т. Д.): Unix.stackexchange.com/a/437694/275762 grep " dsn=5." /var/log/mail.log | pcregrep -o1 " to=<(.+?)>" | sort | uniq -c
Питер М.
8

Обычно есть два типа отказов

  1. Отказов, вызванных прямым отклонением удаленного почтового сервера, когда ваш постфикс доставляет электронную почту.
  2. Отказов, вызванных удаленным сервером (сервер следующего перехода после вашего постфикса) не удается доставить сообщение конечным получателям.

Первый случай уже был освещен превосходным ответом Эсы Йокинена выше. Ваш лучший выбор - анализ почтового журнала.

Второй случай был частным случаем отказов. Пример сценария:

  • Вы отправляете письмо с получателем fakemail@example.com на mail.example.com сервер.
  • В mail.example.com fakemail@example.com был назначен псевдоним realmail@example.net и должен быть перенаправлен на mail.example.net .
  • Когда-нибудь mail.example.net отклонит ваше сообщение, поэтому mail.example.com должен отправить отказы на ваш сервер.
  • К сожалению, maillog на вашем сервере будет иметь «dsn = 2», потому что mail.example.com уже принял сообщение, но не смог переслать его на mail.example.net .

Вот пример второго типа отказов электронной почты. Существует правило пересылки на почтовый сервер Yahoo myuser@yahoo.com -> myuser@example.net . К сожалению почтовый сервер example.net отклоняет сообщение :(

From MAILER-DAEMON  Thu Mar  5 05:07:26 2015
Return-Path: <>
X-Original-To: noreply-myuser=yahoo.com@example.org
Delivered-To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org
Received: from nm21-vm7.bullet.mail.gq1.yahoo.com (nm21-vm7.bullet.mail.gq1.yahoo.com [98.136.217.54])
        (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
        (No client certificate requested)
        by mx.example.org (Postfix) with ESMTPS id D6365565FC
        for <noreply-263462085117-1425506829-myuser=yahoo.com@example.org>; Thu,  5 Mar 2015 05:07:25 +0700 (WIT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=bounce; t=1425506842; bh=zk/tWZNl6c36dmlPDmakM9ekK8cHVJANXMmSdsbkcWc=; h=From:To:Date:Subject:From:Subject; b=Im95h1qTg6qN3yUI7vF1fXtJ0SbUnzv8rUPwLbpNwxGPN2p8wfosXJzQgJ3nzr4L4ZQ50P2d9E9U4jEUNtnyi7nlFd5kKbtiVuda4H56h1PFnt+7wSpgHcd5Irs/lLODumb6ZZSEpCOWttcB9+JLaDfEUUPjGcbR+xww4XeH5Eo=
From: MAILER-DAEMON@yahoo.com
To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org
Date: Wed, 04 Mar 2015 22:07:22 -0000
Subject: Failure Notice
X-Yahoo-Newman-Property: bmbounce

Sorry, we were unable to deliver your message to the following address.

<myuser@example.net>:
Remote host said:
550 5.1.1 User unknown
 [RCPT_TO]

В этом случае ваш единственный метод - это анализ сообщения об отказах. К сожалению, нет стандартного формата отказов, поэтому вы должны проанализировать тело и определить причину отклонения.

Контрольный список возможностей вашего анализа постфикса:

  1. Проверьте правильность адреса VERP. Вы не хотите анализировать недействительное сообщение.
  2. Разобрать тело, определить, мягкое ли оно или жесткое отторжение.

Что касается второй функции, вы можете погуглить какое-то распространенное сообщение об отказе. Примером этого является bounce-regex-list.xml от Jakub Liska .


Эса Йокинен хорошо прокомментировала эти два типа отказов в комментарии ниже . Если ваша цель состоит в том, чтобы сохранить репутацию сервера, то достаточно иметь первый тип отказов. Второй отскок был о чистке ваших списков. Таким образом, мертвая электронная почта должна быть удалена, освобождая некоторые ресурсы на вашем сервере

Некоторые менеджеры списков рассылки, такие как PHPlist и Mailman, также имеют дело с этой проблемой отказов при разборе тела письма, поскольку у них нет ресурсов для разбора почтового журнала.

masegaloeh
источник
1
Это решение полезно и более тщательно, если необходимо обрабатывать также письма, автоматически пересылаемые на другой адрес. Однако, если целью является защита репутации почтового сервера, обработки прямых отклонений должно быть достаточно. Администраторы перенаправляющего MTA должны удалить устаревшие списки пересылок и почты (чтобы защитить свою репутацию и избежать ненужного трафика). После этого мы вернулись в первом случае. OP должен использовать это решение, если количество вторичных отскоков является значительным. Который когда-либо требует меньше усилий.
Эса Йокинен
@masegaloeh, спасибо за информацию! Я даже не считал эту ситуацию с пересылкой возможной! Сейчас я в основном занимаюсь защитой репутации моего почтового сервера, но если увеличение отказов увеличится, это может быть очень полезно.
Ричард