解析未送達的郵件標頭(退回的郵件)

解析未送達的郵件標頭(退回的郵件)

解析發送回我的伺服器的退回(無法送達)電子郵件的標頭並確定它是軟退回還是硬退回的最佳方法是什麼?

我只會向我的用戶發送選擇加入的電子郵件,但有時一些電子郵件地址會過時。當電子郵件退回到我的伺服器時,我想找出它退回的原因(軟/硬)。然後我可以在我的資料庫中適當地處理它和/或標記使用者在下次登入時更新他們的電子郵件。

我正在使用 Ubuntu 和 Postfix。我已經成功實作了帶有別名和虛擬別名的 VERP。因此,退回的電子郵件的返迴路徑為[電子郵件受保護],我可以將它們傳送到腳本。

現在我已經設定了 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. 由遠端伺服器(後綴後的下一跳伺服器)引起的退回郵件無法將郵件傳遞給最終收件者。

第一個案例已經被覆蓋很好的答案上方由 Esa Jokinen 撰寫。你最好的選擇是解析郵件日誌。

第二種情況是反彈的特殊情況。範例場景:

  • 您向收件者發送電子郵件[電子郵件受保護]mail.example.com伺服器.
  • 在 mail.example.com 中,[電子郵件受保護]被別名為[電子郵件受保護]並且必須轉發至郵件.example.net
  • 有一天郵件.example.net拒絕你的消息所以mail.example.com必須將退回郵件傳送到您的伺服器。
  • 不幸的是,您伺服器中的郵件日誌將具有“dsn = 2”,因為mail.example.com已接受該訊息但未能轉發至郵件.example.net

這裡是第二種類型退回電子郵件的範例。雅虎郵件伺服器有轉送規則[電子郵件受保護]->[電子郵件受保護]。不幸的是 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. 解析主體,確定它們是軟拒絕還是硬拒絕。

對於第二個功能,您可以穀歌一些常見的拒絕訊息。例子是這樣的彈跳正規表示式列表.xml經過雅庫布·利斯卡


埃薩·約基寧製作下面評論中的一個好點關於這兩種反彈類型。如果您的目標是保持伺服器聲譽,那麼處理第一個退回類型應該就足夠了。第二次反彈是關於清理你的清單。因此,應刪除無效電子郵件,從而釋放一些您伺服器中的資源。

一些郵件清單管理器(例如 PHPlist 和 Mailman)也透過解析電子郵件正文來處理這種退回問題,因為它們沒有資源來解析郵件日誌。

相關內容