【SPF/SenderID】
SPF/SenderID是利用DNS 紀錄,用來宣告某一網域允許哪些郵件伺服器以網域的名義傳送電子郵件。SPF/SenderID 紀錄的用途是防止垃圾郵件製造者偽造您網域的寄件者來傳送郵件。收件者可以參考 SPF/SenderID 紀錄,依據寄件者 Email Address 的網域名稱判斷是否真的由授權的郵件伺服器所傳送。
由於SMTP規範的瑕疵(或者為了方便),寄件人的 Mail Address/Domain 和實際寄信的 Mail Server 是可以不一樣的。就像您可以在台北寄信,但是寄件人的住址卻可以填寫高雄的地址一樣。雖然可以由郵戳追蹤是由哪個郵局寄出的,但是一般收件者大多不會去注意這個。
同樣的,雖然Mail Server 也會在每一封寄出的信件加註郵件主機等相關資料在郵件標頭中,但是一般的收件者也不會去注意這些。產生的問題就是您可能會收到假冒你的 Mail Address透過你公司的Mail Server寄給你自己,或透過其它Mail Server寄給其它公司。
為了解決這種冒名寄信的問題,最簡單的方式就是透過SPF 或Microsoft SenderID的機制,SPF與SenderID是不同的東西,但是設定並不相衝突,都是用來驗明寄件者身份以防制垃圾、釣魚郵件的機制,網域的所有人可以透過SenderID 的設定,宣告網域的信件只會來自那些郵件主機(IP、網址、MX…),除了這些主機以外,其他的郵件主機寄出去的信,都不是這個網域寄件者寄出的。

當寄件者寄送Mail給收件者時,收件者的Mail Server將依寄件者 Mail Address 的網域名稱查詢DNS SPF Record,檢查寄件者的Mail Server 的IP是否列於SPF Record的IP清單中,如果寄件者的Mail Server IP列於SPF Record的IP清單中,則這封信件可取得授權並可正常傳送至收件者信箱。
假設您的網域沒有 SPF 紀錄,某些收件者網域可能會拒絕您的使用者發出的郵件,原因是他們無法驗證郵件是從授權的郵件伺服器所寄送。
實作 SPF 不需要特別的工具或軟體,只要依照以下的步驟就可以完成了。
1.登入您網域的管理控制台。
2.新增一筆 TXT 紀錄。
3.將您的網域對應到SPF設定值。例如:
Host Name (TXT Name) : @
TXT Value: v=spf1 ip:210.202.94.225 mx ~all
※ DNS 紀錄的變更可能要 48 小時才會傳輸到整個網際網路。
※ 有的 DNS 管理控制台不支援 @ 的主機紀錄,可能要直接輸入網域名稱。
※ 不同的網域註冊商對 TXT 記錄的欄位名稱可能不同,但基本上就是 Key-Value 的關係。因此無論您使用哪一家供應商,請將Host Name (TXT Name)輸入到第一個欄位,然後將 TXT Value輸入到第二個欄位。
有關設定值的表示及參數的意義,可以參考 http://www.openspf.org/ 的說明
下圖是 RainbowServer.com 的設定範例,表示只有 210.202.94.225 這個 IP 以及 RainbowServer.com 的 MX 紀錄所對應的郵件主機可以代表網域寄信,其他主機寄出的都是冒名、非法的。

【DKIM/DomainKeys】
和SPF/SenderID一樣,DKIM/DomainKeys的目的也是用來防止垃圾郵件製造者偽造您網域的寄件者來傳送郵件,而且同樣是使用 DNS 查詢的技術來處理。不同的地方是 SPF 是指定合法寄件主機的 IP、網址…等;DKIM 則是使用簽章的方式,在外寄郵件的郵件標頭加上一個數位簽章,收件者只要檢查郵件中是否包含這個網域簽名,即可確認該郵件的寄件者地址確實屬於您網域中的地址,而且未在寄件途中遭到竄改。

如要在外寄郵件中加上 DKIM 簽名,必須執行以下三大步驟:
1.建立網域的網域金鑰
2.將公開金鑰加入您網域的 DNS 紀錄,如此收件者才能取得該公開金鑰以解密 DKIM 標頭
3.開啟 Mail Server 的 DKIM 簽章功能,將 DKIM 標頭添加到外寄郵件中
看完這三個步驟,馬上產生兩個問題:
* 如何建立、管理金鑰?
* Mail Server 是否支援 DKIM 簽章?
嚴格說來,其實只有一個問題,因為絕大部分支援 DKIM 簽章的郵件伺服器,都有提供金鑰管理工具。
所以先確認一下您的 Mail Server 有沒有支援 DKIM 簽章,如果有參考軟體的說明書,或參考以下的做法,雖然介面不同的是原理一樣。
如果您的 Mail Server 不支援 DKIM,或是您的信件是透過 IIS 的 SMTP 寄送,網路上也有很多套件、服務、外掛程式可以使用,不過大部分都是要錢的。
以下介紹的這一套是弈飛資訊所開發的免費軟體 DkimRelay,沒有廣告、沒有使用限制。請自行到弈飛資訊的免費軟體區下載。
網站除了提供 x86 與 x64 兩種安裝檔以外,如果您和小弟一樣有一點點技術上的潔癖,還可以選擇下載 exe 執行檔的格式,解壓縮之後就只有兩個檔案:

RelayManager.exe 控制台
RelayService.exe 外寄服務
不要小看這兩個檔案,功能可是非常完整,執行 RelayManager.exe 即可開啟控制台,執行服務的安裝與系統管理工作,不過沒有說明書,只能線上看。
如果您是下載安裝檔,您可以在桌面上找到控制台的捷徑,並有說明書可以看。

詳細功能請自行參考軟體的說明,以下僅就軟體的運作原理和 DKIM 的實作。
【工作原理與環境設定】
在運作原理部分,DKIM Relay 是以獨立的外寄伺服器模式執行,並使用 IP 驗證模式,接收信件、簽章、外寄。

所以您有三種使用方式:
1.利用 DKIM Relay 架設一台 Smart Host,所有對外的信件都交由 DKIM Relay 負責。
* 到原有的 mail server 設定外寄主機,全部指向 DKIM Relay。
* 將原有 Mail Server 的 IP 加入 DKIM Relay 授權 IP 清單中。
2.將 DKIM Relay 與 Mail Server 裝在一起,當作外掛系統服務。
* 因為 DKIM Relay 本身就是一台 Mail Server,所以必須變更 DKIM Relay 的 SMTP 通訊埠,例如 2500。
* 同樣的,您必須設定原來 Mail Server 的外寄通訊埠為 2500,並將外寄主機指向 localhost 或是 127.0.0.1
3.如果是網站用的,例如 IIS,也可以選擇停掉 IIS 的 SMTP ,直接透過 DKIM Relay 寄信。
【DKIM 設定】
環境設定好了之後,並確認可以正常運作之後,我們就可以開始實作 DKIM 部分。包括:建立金鑰、發佈金鑰、執行簽章。
1. 建立金鑰
DKIM 簽章使用的是非對稱加密的技術,因此必須有一組包含公開金鑰與私密金鑰的金鑰組。
開啟 DKIM Relay 控制台,點選 DKIM 管理。

DKIM Relay Server 內建 DKIM 憑證產生器與管理功能。您可以按下新增按鈕,依指示輸入金鑰名稱,系統將自動為您產生一組加密長度 1024 bit 的金鑰組。

您可以按下檢視按鈕,即可以檢視公開金鑰,以及建議的 DKIM 設定值。
私密金鑰因安全考量,無法直接檢視,如果您需要檢視完整的金鑰內容,可以選擇匯出,再以文字檔方式開啟。

除了新增,您有可以選擇用匯入的方式,或是您同時架設多台 mail server,需要使用相同的金鑰,也可以匯出後,再匯入到另一台主機。

因為取得金鑰的人,就可能偽裝您的網域寄信,因此匯出金鑰的時候,建議設定密碼。

您可以新增多組金鑰,並且依需要啟用任何一組已發布到外部 DNS Server 的金鑰。
※請注意,DNS 變更需要 24~28 小時才會完全更新,所以要改用任何一組金鑰之前,請先確認這組金鑰已經可以透過 DNS 查詢得到了。
2. 發布公開金鑰
取得了金鑰後,金鑰中有分公開金鑰和私密金鑰。您必須將公開金鑰的內容發布到到您的DNS伺服器上才能讓其他需要解開金鑰簽章的郵件主機來取得。
首先,您要在DNS伺服器上設定金鑰名稱(selector)和網域的對應關係。告訴收件的一方您要使用哪一組金鑰。
這部份需要在DNS上設定一個子網域的TXT記錄,您可以參考下方的圖,每家的DNS設定畫面會有所不同但是基本上是key和value的對應。

金鑰名稱selector所用的格式是 <selector>._domainkey.<domain-name>
例如 : mykey._domainkey.rainbowserver.com 那麼金鑰名稱selector就是mykey。
當您設定完名稱,接下來就要設定value的部分。
以下為 TXT Value 的範例 :
"v=DKIM1; k=rsa; t=y; p=MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgMudeDa/tqGbYJoD4tUJpZtPMHPvucMho
+TK8k6M3qcjVzT55aIu1iykjquRySfg6x/8Kxqs8rO7SpbfqIujhDV2ir52n
+Z763ClI5PNWK1m8rdnqgWYqUev4lpbGSA7UzWZNCrvLw0gg5OwCBev61RjVY008KE8il7z59+ANOztAgMBAAE="
"k" 是加密演算法
"t" 是用來設定DKIM是否為測試模式。t=y為測試,t=s為非測試。
"p" 公開公鑰內容
當您可以按下檢視按鈕,即可以檢視公開金鑰,以及建議的 DKIM 設定值。直接按下畫面中的複製按鈕,即可將完整的設定值複製到剪貼簿。

3.簽章
DNS上設定完之後就可以用啟用簽章。
所謂的簽章就是在所有外的的郵件,利用金鑰的私密金鑰對郵件標頭及內容做加密動作,並產生類似以下的簽名檔附加於郵件標頭。收件主機,將依據查詢到的公開金鑰,驗證這段簽名檔的正確性。
您只要勾選【啟用外寄郵件 DKIM 簽署】,DKIM Relay 寄送信件前,就會依您選用的金鑰簽署 DomainKeys,以提供郵件伺服器的可信任度。
以下是 Gmail 收信之後的標頭驗證結果。

【金鑰變更】
一個網域可以有不同的簽章。管理者只需設定不同的selector就可以隨意切換,但是切換後有些DNS要等24小時後才生效。
如果您要作廢某一個金鑰,請務必先切換到其他已經發佈到 DNS Server 的金鑰,等完全生效了,再將舊的金鑰刪除。
參考資料 :
http://www.dkim.org
http://en.wikipedia.org/wiki/DomainKeys_Identified_Mail