什麼是DKIM
DKIM (Domain Keys Identified Mail),是一種網域金鑰認證的郵件。
DKIM採用公私鑰數位簽章方式。在發送郵件時由發信服務器對郵件以私鑰進行簽章,發送之後,郵件接收伺務器上,會透過 DNS 查詢寄件者網域的DKIM公鑰資料,然後對這封郵件做簽章驗證,如果解碼成功,代表郵件確實為原始郵件伺服器所寄出,來避免郵件伺服器、寄信者被仿冒發送。
我安裝DKIM的原因
因為設定過程有點麻煩,而且我的發信伺服器有12台,要為每一台設定金鑰,又共用同一個設定檔,之前試過幾次都是失敗收場,就懶得再去處理
但是Gmail自從2024/2/1起,強制規定每天發送超過5,000封電子報的郵件,必須認證SPF及DKIM,否則一律為垃圾郵件,甚至無法正常發送及接收,Gmail目前使用率超過五成以上,只好怪怪研究怎麼在郵件伺服器上安裝DKIM了
Google電子郵件寄件指南,需參照大神的規定來設定囉!
一.安裝DKIM服務(以Centos8為例)
DKIM是一種服務,請先安裝在Linux上
yum -y install epel-release
yum -y install opendkim
systemctl enable opendkim
systemctl start opendkim
就能開啟DKIM服務,預設Port為8891
二.修改opendkim設定檔
cd /etc
nano oepndkim.conf
# 修改為 Mode s,有3種模式,Mode s, Mode v, Mode sv。
# s代表寄出時簽章、v代表收信時檢查簽章。
Mode s
# 加上註解
#KeyFile /etc/opendkim/keys/default.private# 以下項目移除註解
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
InternalHosts refile:/etc/opendkim/TrustedHosts# 確認以下服務有開啟且為8891
Socket inet:8891@localhost
三.建立金鑰
因為我有12台郵件伺服器,相同的網域,不同的子網域來區分,所以原本以為要為每一個子網域建立金鑰,好麻煩
後來建立金鑰後,發現金鑰都一樣!喔,原來只要針對主要網域做金鑰及認證就好,這樣方便不少
opendkim-genkey -D /etc/opendkim/ -d XXX.com.tw -s dkim
參數的意義
XXX.com.tw 為我的主要網域,請改成自已的網域名稱,以下文章不再提醒
-D 產生的公私鑰目錄
-d 網域名
-s 稱之為選擇器(selector),可以隨便取,我就用預設的dkim文字
切記要將金鑰檔案的權限開啟,不然DKIM服務會無金鑰檔的讀取權限
chown oepndkim:opendkim /etc/opendkim/dkim.private
chown opendkim:opendkim /etc/opendkim/dkim.txt
四.其他相關設定檔
KeyTable,對應私有密鑰檔
/etc/opendkim/KeyTable 檔案裡,加上一行
dkim._domainkey.XXX.com.tw XXX.com.tw:dkim:/etc/opendkim/dkim.private
[選擇器名]._domainkey.[網域名] [網域名]:[選擇器名]:[私鑰檔路徑]
SigningTable,網域對應的DNS解析TXT名稱
/etc/opendkim/SigningTable 檔案裡,加上一行
*@XXX.com.tw dkim._domainkey.XXX.com.tw
TrustedHosts,設定哪個IP及網域寄出的信都要加上簽章
/etc/opendkim/TrustedHosts 檔案裡,加上自己的所有寄信網域(包括子網域名稱,不可省略)
當然如果只有1個,就加入1個就好
以下為我有12個伺服器的範例,每個都要加上
127.0.0.1
m1.XXX.com.tw
m2.XXX.com.tw
m3.XXX.com.tw
...
m12.XXX.com.tw
至此,DKIM的設定已完成,請重新執行DKIM服務
systemctl restart opendkim
五.設定posfix
修改 /etc/postfix/main.cf
在最後加上
### DKIM Settings
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
來將postfix的寄信服務,套用DKIM的8891加上金鑰
最後,重啟postfix服務
systemctl restart postfix
可使用 postconf -n 來查詢postfix的啟用參數狀態
六.設定DNS的TXT標籤
接下來設定DNS的記錄,收信伺服器會從你設定的DNS TXT取得公鑰,來進行加解密認證。
先將 /etc/opendkim/dkim.txt 打開,裡面大概長這樣:
dkim._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+WF2H4n+XdIFQ5BQGaBDF71YslxwtdKcqAjZDfE4tlNrhNUwhCCDwSA5Tf4pwoBuT7zbBCSOUD8R+5jY4SDihuZs8bzvtNLpamNE2wgxxIoUjwYF4SjDjwjVlcbkXhwGaZAxJgTyhz07ApABvQDOiAumtcKHAoHjzgbCgDISOVQIDAQAB" ) ; ----- DKIM key dkim for XXX.com.tw
請去DNS新增一個TXT標籤,名稱及內文依檔案填寫(不要v=DKIM1;)
P.S. 之前一直不成功,後來將”v=DKIM1;”文字移除就可以了,不知為什麼,反正能用就好
再來設定另一個DNS TXT
_adsp._domainkey.XXX.com.tw TXT 3600 "dkim=discardable"
“all” 指定所有此網域的信都會有簽章
“discardable” 指定所有此網域的信都會有簽章,如果沒有的話請丟棄(最嚴格)。我是設定這個。
“unknown” 指定所有此網域的信有可能會有簽章 (最寬鬆看待,等於沒設)。
七.檢查收信伺服器是否能取得DNS TXT的公鑰
請先檢查是否DNS TXT有設定正確,收信伺服器是從這個去取得你的公鑰,如果檢查失敗也代表取不到公鑰,那收信端一定會DKIM驗證失敗的,驗證失敗的信會連收都收不到
八.最後可檢查整個寄出信件的分數

至 Mail-Tester 頁面,會給你一個隨機的email(如上圖),將你的信件寄至這個email(只有一次機會),就會給你一份完整的信件報告
一天有三封免費分析結果,可善加利用
九.其他電子報設定
一鍵取消訂閱
Google另有一項規定,”當發送行銷郵件時,必須支援一鍵取消訂閱功能,且郵件內文應包含清晰可見的取消訂閱連結。”
我是使用PHPMailer發信,所以在PHP程式上,加上Header標頭來符合規定
$mail->addCustomHeader(
'List-Unsubscribe',
"<mailto:unsubscribe@cineferte.fr?subject=Unsubscribe-[[email]]>,<https://cineferte.fr/abo.php?unsub=[[email]]>"
);
$mail->addCustomHeader(
'List-Unsubscribe-Post',
'List-Unsubscribe=One-Click'
);
其中[[email]]請用程式帶入收件者email,比較理想是帶入message id
垃圾信回報比率不能太高
Google規定,回報的垃圾郵件比率需低於 0.10%,切勿達到 0.30% 以上。如果垃圾郵件比率偏高,就會導致較多郵件遭歸類為垃圾郵件。
改善垃圾郵件比率後,遭歸類為垃圾郵件的郵件數量可能要過一段時間才會減少。
Google提供的郵件管理員工具,由此可以查詢目前被回報的垃圾郵件比率
