大量電子報發送排程簡易思路與 Yahoo Deferral 處理

在發送大量電子報時,你是否思考過該怎麼寄呢?如果有一萬個信箱,你會選擇一次寄出去還是分散在不同的時間寄呢?大多數的人會選擇一次寄出去,基本上不會有問題,如果你信用好而且常常在做這種事情的話,你大量發信對電子郵件服務提供的業者來說是常態,這時候幾乎都會進到收件夾,但有個最近很火紅的傢伙 Yahoo,他家不知道為什麼,你只要短時間內寄太多信就會被退信(Deferral),你可以重新再嘗試一次,多嘗試幾次種會成功的,以我個人來說看過最多重新寄 100 次才成功寄進去的,針對 Yahoo 的情況來看,似乎無論信用多少都會遇到這種短時間高頻率(無視內容)被退信的問題,這邊我嘗試了幾個做法來解決問題。

針對這情況,基本上 DKIM 之類的憑證要過、不要發送垃圾信、養信用等等,但這些我們都做到了,寄信到 Gmail、Hotmail 也有 98% 以上的到達率,基本上沒問題,卻偏偏 Yahoo 問題很大,一次寄個 300 封就瘋狂退信,人家 Gmail 一分鐘被我們寄了 2000 封以上都沒說話了,好吧但無論如何,我歸納出幾個解法可以互相搭配使用:

  • 控制發信頻率,把信攤開到一段時間內寄完,即使晚點進去總比被退信好(而且退信後自動重寄,會導致滾雪球效應)
  • 信件分不同的優先權,並搭配多個獨立 IP 發信

綜合以上做法,我想了一個流程來處理:

我這邊需要發送的信件分成兩種,一種信必須寄到,例如註冊完成信、信箱驗證信;另一種可以稍微晚寄到,例如電子報、廣告信等等。(個人認為可加上第三種優先權:最高級,可以插隊)

每封信件再寄出時都會規劃一個時間,安排後就不能修改,時間儘量靠前安排,能越快送出就越快送。

因為有這兩種信件的差別,所以我把排程分成兩個 Channel,假設經過測試 Yahoo 每分鐘 60 封信是上限,那麼「必須寄到」的信可能佔有 30 封信的額度,剩下的則是給可以稍微晚到的信;會這樣分配是因為要考量大量發送電子報的情況,可能瞬間就讓你一小時內無法寄信,這時候如果是重要的系統信卻寄不出去問題會很大,分成兩個 Channel 可以在某種程度上避免這件事情。

為了加快時間的運用,如果 5 分鐘內的 Channel 有空閑的話,就不分兩個 Channel 直接混著寄,這樣意味著即使信件超級多,重要必須到的信件最慢五分鐘會寄達。

當然這樣的做法,還是無法保障信件能夠在時間內寄到,所以要加上預估的功能,一但預估信件會超過預定時間才寄達,就要調整每分鐘的頻率、Channel Size 或是增加獨立 IP 來處理。

除此之外,也可以提交你的相關資訊給 Yahoo,表單連結在此

這算是蠻基本的做法,還有些地方需要修正,也希望大家如果願意的話可以分享自家的做法讓小弟學習!

偷偷提醒,如果你使用 Mandrill、Mailgun 之類的 ESP 服務,他們會提供你信件的「到達率」,但我沒猜錯的話,寄到垃圾郵件夾也算到達哦,而且你幾乎沒辦法分辨他是寄到哪個收件夾,雖然在記錄裡可以看到「Spam」這個選項,但事實上他是指「被抱怨」這個動作,如果伺服器一開始就把信放到垃圾郵件夾,並不會被計算在 Spam 裡面,會發現這件事情是因為在寄 Yahoo 的信件時,明明就只有 2 Spam,但我問了幾個朋友,發現信都被寄到垃圾信件夾,此外同樣是忘記密碼信,寄給 Gmail 的開信率是 95%,寄給 Yahoo 只有 40%,但明明到達率都是 100% 呀。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料