message-expired 是什麼?以及為什麼你的延遲率會超過 100%
有一天你打開寄送報表,看到這樣的數字:
寄送 31,100 封,延遲 284,159 封,延遲率 913%
第一反應通常是「報表壞了吧」。
沒壞。 這個數字是對的,而且它在告訴你一件很重要的事。這篇就講清楚延遲率為什麼能超過 100%、message-expired 是怎麼來的,以及為什麼你的退信率會莫名其妙在幾天後突然跳高。
為什麼延遲率可以超過 100%
關鍵在分子和分母算的不是同一種東西。
- 分母:當天寄出的信件封數。一封信就是一封。
- 分子:延遲事件的次數。同一封信被重試十次,就記十次。
所以只要重試堆積起來,延遲率超過 100% 是數學上必然的結果。上面那個 913% 的例子,實際上是三萬多封信各自被重試了好幾次,累積出二十八萬次的延遲事件。
這代表延遲率不是一個比例,而是一個強度指標。 它不是在說「九成的信被延遲了」,是在說「重試的密度有多高」。理解這一點,你看報表的方式會完全不一樣:
- 延遲率 5%:正常,零星的重試。
- 延遲率 50%:有一批信在排隊,值得看一下是誰。
- 延遲率 300% 以上:某個收件方在大量擋你的信,而且你的系統正在不斷重試。
還有一個陷阱要提醒:當天寄的量越小,延遲率的數字會被放大得越誇張。 因為分母變小了,但佇列裡還積著前幾天的信在重試。所以看到一個嚇人的延遲率,先看一下當天的寄送量是不是特別少,那可能只是分母效應,不是真的惡化。
message-expired:重試視窗耗盡了
信不會無限期重試下去。每個寄送平台都會設一個重試視窗,常見是 24 到 72 小時。時間到了信還是送不出去,系統就放棄,這筆紀錄的分類就變成:
message-expired(retry timeout exceeded)
我看過實際的重試紀錄,一封信在放棄之前被重試了大約七十次。也看過延遲時間累積到 23 小時 39 分的,那就是逼近 24 小時期限、隨時要轉成 expired 的狀態。
重點是:message-expired 是結果,不是原因。
它只告訴你「這封信最後沒送成」,沒告訴你為什麼。真正的原因發生在更早之前,是那批信一開始為什麼一直被延遲。所以看到 message-expired,不要去處理 message-expired,要往回查那個延遲的源頭。
這就是為什麼你的退信率會延後爆發
這是實務上最容易被誤判的一點,也是我認為這篇最值得帶走的東西。
延遲的信不會立刻算進退信率。它在佇列裡的那幾天,你的報表看起來是這樣:
退信率 2.38%,延遲率很高
看起來還好對吧。但幾天後重試視窗耗盡,那批信集體轉成 message-expired、計入退信,報表突然變成:
退信率 18.42%
你會在星期五看到一個爆炸的退信率,但真正的問題是星期二發生的。
如果你不知道這個時間差,就會在錯誤的日期找原因,查那天的名單、那天的內容、那天的設定,全部都查不出問題,因為那天什麼事都沒發生。
所以看到退信率突然跳高,第一件事是往前推幾天,看那幾天的延遲率是不是先漲上去了。 如果是,那就是延遲到期轉退信,你要查的是幾天前那批信被誰擋住。
往回查:那批信當初為什麼被延遲
延遲的成因就那幾種,逐一排除:
| 成因 | 特徵 | 會自己好嗎 |
|---|---|---|
| 收件方節流 | 集中在單一大型 ISP,代碼是 4xx | 會,降速就好 |
| 灰名單 | 訊息寫著 greylisted、幾分鐘後重試 | 會 |
| 偽裝成灰名單的長期封鎖 | 訊息裡有一個很遠的到期日 | 不會 |
| 空殼 tenant(ATTR5) | 訊息裡有 ATTR5 |
不會 |
| 退信網域 DNS 解不出來 | 多家 ISP 同時在 MAIL FROM 階段拒絕 | 不會,要修 DNS |
前兩種你可以放著,最後三種放著只會讓它們全部逾時,變成一筆延後引爆的退信率。
最後那一種特別值得講:如果你的 Return-Path 網域 DNS 掛掉了(例如 CNAME 被誤刪),會有好幾家 ISP 同時在收信的第一階段就把你退回,而且退的都是 4xx。這種會造成大規模的重試風暴,延遲率可以衝到一兩百趴,而且因為是暫時碼,系統會很勤勞地一直重試。這種問題修好 DNS 之後,通常 24 到 48 小時內佇列就會消化掉。
該怎麼看這幾個數字
整理成一句話版本:
- 延遲率高、退信率正常 → 有信在排隊,先查是誰擋的、會不會自己好。
- 延遲率高、而且成因是那三種不會自己好的 → 現在不處理,幾天後會變成退信率。
- 退信率突然跳高、前幾天延遲率也高 → 是延遲到期,往前推幾天找原因。
- 退信率高、延遲率接近零 → 跟延遲無關,是硬拒收,查驗證或名單。
還有一個操作上的建議:如果你確定某一批收件人是永遠送不到的,主動把他們排除,不要等系統重試到逾時。 這一步同時會降低你的延遲率和退信率,而且省下的重試資源會讓其他信送得更順。
至於送達率和真正的收件匣到達率差在哪,那是另一組容易搞混的數字,見Email 到達率是什麼。
一句話總結
延遲率超過 100% 不是報表壞掉,是因為它算的是重試次數不是信件封數。message-expired 則是重試視窗耗盡的結果,不是原因,而且它會讓你的退信率延後好幾天才爆發,害你在錯誤的日期找問題。看到退信率突然跳高,先往前推幾天看延遲率。
如果你的延遲率高得莫名其妙、或退信率無預警跳高卻找不到當天的原因,歡迎找我聊聊,我幫你把時間軸拉開來看。