2011年2月21日 星期一

Amazon Simple Email Service (Amazon SES) 簡介

Amazon SES 提供一個容易使用並且發揮有效成本關於電子郵件的解決方案。

使用 Amazon SES 的好處
  • 容易使用:不需要知道信在網路上的寄送過程,也不需要管理郵件伺服器。
  • 高寄送品質:Amazon Web Service 和多個 ISP (Internet Service Provider) 合作,確保可信賴的寄信服務。
  • 提升高品質的郵件:寄信內容的品質由 Amazon 機制評估,例如:病毒、垃圾信。越高品質的信件被寄出,將來就能夠寄更多的信件。
  • 詳細的報告:例如:到目前為止寄出的信件數目、寄送信件品質、退信狀況、抱怨... 等等。
  • 可擴張性:提供快速高頻寬的服務。Amazon SES 可以短時間寄送大量的信件。
  • 與現有架構整合:如果已經有郵件伺服器,仍然可以透過 Amazon SES 外寄郵件,並不需要修改你的應用程式,它是透明的。
Amazon SES 工作流程
  1. 寄信者透過應用程式對Amazon SES 發出寄信需求,將信寄給一個或多個人。
  2. Amazon SES 會處理寄信需求,如果信件通過篩選(排除病毒、垃圾信...等等),就會將信件依序寄出。
  3. 信件最終會被送到收信者的 ISP 並且轉入收信者的信箱。
  4. 如果收信者的郵件信箱不存在,收信者的 ISP 會寄退信通知回 Amazon SES,再由 Amazon SES 轉到寄件者的信箱。
  5. 收信者如果不想收到該信件,可以對其 ISP 提出抱怨, ISP 會將抱怨轉給 Amazon SES。
圖示請看這裡。寄信有些限制必須遵守,這樣的目的是為了降低被 ISP 因為資料不全或是突然暴量信件數量而阻擋的可能性。如果你是個全新的寄信者,Amazon SES 每天會提供你少量的寄信配額。只要信件的品質提高,配額會快速的增加。

寄信須知

當 Amazon SES 接受寄信需求時會回傳一個唯一的 message ID,可以當做索引或是追蹤問題之用。太多的退信或是抱怨將有可能停止寄信者的 AWS 帳號。

在測試狀態下使用 Amazon SES 寄信,你必須驗證你想寄出郵件的來源地址和目的地址,每天只有 200 封信的配額,最快每秒寄一封信。如果想跳過驗證而寄信給其他人必須填寫這個表單將測試狀態改為產品狀態下使用 Amazon SES。驗證流程如下:
  1. 對你想寄的郵件地址提出驗證需求。
  2. Amazon SES 對該郵件地址寄出驗證訊息。
  3. 請收件者打開信件並且點選裡面的鏈結 (該鏈結六個小時後會失效)。
  4. 瀏覽器會顯示確認的訊息,也代表該郵件地址通過 Amazon SES 驗證了。
為了避免傳送不當的信件,ISP 會採取一些措施,這裡提出三種授權機制,SPF(Sender Policy Framework)、Sender ID、DKIM(DomainKeys Identified Mail)。為了保持高品質的寄信服務建議您遵守以上三種機制。

Sender Policy Framework (SPF)
  • SPF 依賴寄信者與 ISPs 之間的合作提供一種驗證信件的方法,該方法可從信件追蹤回發信系統。
  • 為了遵守 SPF,寄信者應建立並公開一個或多個 DNS records 用來建立寄信網域識別,這些 DNS records 標示了一群被授權可以寄信的主機。ISPs 就可以透過比較主機的 IP address 和 SPF record 所記載的 IP addresses 來驗證是否是個可信賴的主機。更多關於 SPF 的資訊可以看 http://www.openspf.org/
  • 如果寄信者的 "From:" 網域已經有 SPF record,請務必加入 "include:amazonses.com" 這個機制,否則有可能被 ISP 拒絕寄信。如果尚未有 SPF record,建議寄信者加入以確保不被 ISP 拒絕寄信。"v=spf1  include:amazonses.com  ?all" 這個設定可以讓你公開並啟動 SPF。
Sender ID
  • Sender ID 和 SPF 很像,也是依賴寄信者與 ISPs 之間的合作提供一種驗證信件的方法,該方法可從信件追蹤回發信系統。
  • 為了遵守 Sender ID,寄信者應建立並公開一個或多個 DNS records 用來建立寄信網域識別,a ISP 就可以透過 Purported Responsible Address (PRA) 演算法來驗證是否是個可信賴的主機。PRA 演算法會試著從信件資訊裡找出負責單位的信件地址,當該信件地址決定後,ISPs 就可以透過比較主機的 IP address 和 purported responsible address 的網域裏的 Sender ID record 所記載的 IP addresses 來驗證是否是個可信賴的主機。更多關於 Sender ID 的資訊可以看 http://www.microsoft.com/mscorp/safety/technologies/senderid/default.mspx
  • 如果寄信者的 "From:" 網域已經有 Sender ID record,請務必加入 "include:amazonses.com" 這個機制,否則有可能被 ISP 拒絕寄信。如果尚未有 Sender ID record,建議寄信者加入以確保不被 ISP 拒絕寄信。"spf2.0/pra include:amazonses.com ?all" 這個設定可以讓你啟動 Sender ID。
DomainKeys Identified Mail (DKIM)
  • DKIM 是個標準,用來讓寄信者對信件簽署,讓 ISP 使用該簽名來驗證信件的合法性。
  • 使用 DKIM 標準來寄信會含有一個 DKIM-Signature 表頭欄位,該欄位使用部分或全部信件訊息來做加密的簽名。接收信件的 ISP 可以使用寄信者的 DNS record 裏的 public key 來確定這信件是不是可信的。更多關於 DKIM 的資訊可以看 http://www.dkim.org/
  • 你可以使用 DKIM 技術配合支援 DKIM 的 ISPs 提高寄送的品質。請注意:為了確保最高的寄送率,請勿對 Message-Id、Date、Return-Path、Bounces-To 表頭資訊做 DKIM-sign。
為了確保最佳的寄送速度並避免被欺騙或網路釣魚,建議所有的 Amazon SES 使用者在 DNS 伺服器同時使用 SPF records (v=spf1) 和 Sender ID records (spf2.0/pra)。

寄信方法
  • Formatted Email:只需提供來源郵件地址、目的郵件地址、信件標題、信件內容,剩下的設定由 Amazon SES 提供。
  • Raw Email:提供手動設定需要的郵件表頭和內容,對信件的組成與寄送有更多的掌握度。DKIM 機制就需使用 SendRawEmail API 來寄送信件。

管理寄信行為

一個 Amazon SES 的使用者在寄信上會有兩種限制:一是在某段時間內可以寄幾封信,一是信件可以多快寄出。而這兩限制會在使用者持續寄出高品質的信件時逐步的放寬。然而請勿在一開始使用 Amazon SES 的時候就寄出夾帶大資料量的信件,因為突然超過頻寬的寄信行為可能會被當作垃圾信件,導致 ISPs 會延遲或是阻止寄出信件。以下會介紹如何安全的增加寄信量使得最終可以大量的寄信而不會被阻礙。

監控寄信限制

基於一些參數,Amazon SES 會決定某段時間內可以寄多少信和多快寄出信。這限制如下定義:
  • 寄信配額 (Sending Quota):這指的是下一個 24 小時內可寄出的信件量。
  • 最大寄信速率 (Maximun Sending Rate):這指的是每秒可寄出的信件量。
每個使用者會有個獨一無二的寄信限制。當使用者持續寄出高品質的信件,這限制是會逐漸的放寬直到滿足需求。

使用者可以利用 ses-get-stats.pl 來得到下列寄信資訊,詳情請參閱這裡
  • 過去 24 小時內寄出的信件數量
  • 目前這 24 小時的寄信配額
  • 最大的寄信速率
監控使用情形統計數據

強烈建議使用者監控使用情形以確保尚未超過 Amazon SES 的寄信限制,也必須知道退件和抱怨的狀況並加以解決。

使用者可以利用 ses-get-stats.pl 來得到下列寄信資訊最近兩個星期內的資料量,每 15 分鐘一筆。詳情請參閱這裡
  • 時間郵戳
  • 嘗試寄信次數
  • 被拒絕次數
  • 被退件次數
  • 被抱怨次數

一些建議
  • 每天執行 ses-get-stats.pl 來監控寄信限制與統計數據。
  • 小心的監控每 24 小時的寄信量,並且注意與寄信限制的差距。盡量保持比寄信配額少一點,比最大寄信速率慢一點,這樣你的寄信限制就會被逐漸放寬。
  • 關注抱怨的情形。如果發現抱怨有上升的趨勢就必須花時間處理。
  • 關注退件的情形。如果發現退件有上升的趨勢就必須花時間處理。
  • 關注被拒絕寄送信件的情形。如果發現被拒絕次數有上升的情形就必須確認是否有應用程式一直在寄送被拒絕的信件。
預先規劃

寄信限制是會被動態調整的,無法知道將來某個時間放寬後的限制。不過大概的狀況可以看這裡

改用 Amazon SES 的策略

如果想從已經存在的郵件伺服器轉而使用 Amazon SES 服務,會遇到寄信限制問題。主要概念是慢慢的將寄信數量取一部分在不超過寄信限制下使用 Amazon SES 服務,假以時日,Amazon SES 的寄信限制已經放寬到可以容納所有的寄信需求後就可以整個從原有的郵件伺服器移轉到 Amazon SES 服務上了。有時候沒算好寄信數量還是會遇到超過寄信限制狀況,會收到 ThrottlingException,解決的方法是等個 10 分鐘後再重試看看。

使用 AWS API
請參閱這裡
PHP SDK 請參閱這裡
Amazon SES Script  請參閱這裡

參考文件
Getting Started Guide
Developer Guide

沒有留言:

張貼留言