Как лучше всего проанализировать заголовки отклоненных (недоставленных) сообщений электронной почты, которые отправляются обратно на мой сервер, и определить, является ли этот возврат мягким или жестким?
Я отправляю своим пользователям только электронные письма с подтверждением, но иногда некоторые адреса электронной почты устаревают. Когда электронное письмо возвращается на мой сервер, я хотел бы выяснить, почему оно было возвращено (мягкое / жесткое). Затем я могу обработать это соответствующим образом в своей базе данных и / или пометить пользователя, чтобы он обновил свой адрес электронной почты при следующем входе в систему.
Я использую 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». получить адреса с временными ошибками.
Обычно бывает два типа отказов
Первый случай уже был рассмотрен отличный ответ Эса Йокинен выше. Лучше всего разобрать журнал почты.
Второй случай был частным случаем отскоков. Пример сценария:
Вот пример второго типа электронной почты. Есть правило пересылки на почтовый сервер 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]
В этом случае ваш единственный метод - разобрать сообщение о недоставке. К сожалению, стандартного формата отказов не существует, поэтому вы должны проанализировать тело и определить причину отказа.
Контрольный список функций разбора отказов постфикса:
Для второй функции вы можете найти в Google несколько общих сообщений об отказе. Пример такой bounce-regex-list.xml по Якуб Лиска.
Эса Йокинен сделал хороший момент в комментарии ниже об этих двух типах отказов. Если ваша цель - сохранить репутацию сервера, тогда будет достаточно первого типа отказов. Второй отказ был связан с очисткой ваших списков. Таким образом, мертвые сообщения электронной почты должны быть удалены, освобождая некоторые ресурсы на вашем сервере.
Некоторые менеджеры списков рассылки, такие как PHPlist и Mailman, также справляются с этой проблемой отказов при синтаксическом анализе тела электронной почты, поскольку у них нет ресурсов для анализа почтового журнала.