Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

  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 должен отправлять отказы на ваш сервер.
  • К сожалению, почтовый журнал на вашем сервере будет иметь "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. Разберите тело, определите, мягкое они или жесткое отторжение.

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


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

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