Home 電子報設定 安裝DKIM電子報發信認證

安裝DKIM電子報發信認證

by carl

什麼是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

參數的意義
-D 產生的公私鑰目錄
-d 網域名
-s 稱之為選擇器(selector),可以隨便取,我就用預設的dkim文字

XXX.com.tw 為我的主要網域,請改成自已的網域名稱,以下文章不再提醒

切記要將金鑰檔案的權限開啟,不然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驗證失敗的,驗證失敗的信會連收都收不到

DKIM Record Checker

八.最後可檢查整個寄出信件的分數

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提供的郵件管理員工具,由此可以查詢目前被回報的垃圾郵件比率

我要留言