Анализ заголовков недоставленной почты (возвращенной почты)

Анализ заголовков недоставленной почты (возвращенной почты)

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

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

Я использую Ubuntu и Postfix. Я успешно реализовал VERP с псевдонимами и виртуальными псевдонимами. Так что возвращенные письма имеют обратный путь[email protected], и я могу перенаправить их в сценарий.

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

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

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

решение1

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

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

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

решение2

Обычно существует два типа отскоков:

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

Первый случай уже был рассмотренотличный ответЭса Йокинен выше. Лучше всего парсить maillog.

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

  • Вы отправляете электронное письмо получателю[email protected]кmail.example.comсервер.
  • В mail.example.com,[email protected]был назван псевдонимом[email protected]и должны быть отправленыmail.example.net.
  • Когда-нибудьmail.example.netотклонить ваше сообщение такmail.example.comнеобходимо отправлять сообщения об отказах на ваш сервер.
  • К сожалению, maillog на вашем сервере будет иметь "dsn=2", потому чтоmail.example.comуже принял сообщение, но не переслал егоmail.example.net.

Вот пример второго типа возвратов писем. Есть правило пересылки почтового сервера Yahoo[email protected]->[email protected]. К сожалению, почтовый сервер example.net отклонил сообщение :(

From MAILER-DAEMON  Thu Mar  5 05:07:26 2015
Return-Path: <>
X-Original-To: [email protected]
Delivered-To: [email protected]
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 <[email protected]>; 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: [email protected]
To: [email protected]
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.

<[email protected]>:
Remote host said:
550 5.1.1 User unknown
 [RCPT_TO]

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

Контрольный список функций анализа отказов Postfix:

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

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


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

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

Связанный контент