DKIM 目前仍不是一個標準, 但是在不久之後, 很有可能成為一個 RFC. 光看名字應該也可以想像, DKIM 是一個很像 DomainKeys 的東西.
基本上, DKIM 使用了與 DomainKeys 相同的 DNS 設定, 只是檢驗的方式有些不同 (大同小異, 使用的 header 不同). 所以, 知道怎麼安裝 DomainKeys milter, 就應該會安裝 DKIM 的 milter.
下載這個 milter, 使用和 DomainKeys milter 一樣的方式安裝. 最後執行的參數與 dk-filter 有些不同. 如果要和 dk-filter 一起使用, 記得使用不同的 port 來執行即可.
比較詳細的英文安裝說明可以參考這兒.
同樣, 在搭配 postfix 時, 注意這兒所提到的修改.
或是抓這個 patch 回去使用:
diff -Nur dkim-milter-0.5.1.orig/dkim-filter/dkim-filter.c dkim-milter-0.5.1/dkim-filter/dkim-filter.c
--- dkim-milter-0.5.1.orig/dkim-filter/dkim-filter.c 2006-06-13 01:44:09.000000000 +0800
+++ dkim-milter-0.5.1/dkim-filter/dkim-filter.c 2006-08-22 08:43:07.375808454 +0800
@@ -2296,6 +2296,13 @@
dfc = cc->cctx_msg;
assert(dfc != NULL);
+ /* Determine the job ID for logging. */
+ if (dfc->mctx_jobid == 0 || strcmp(dfc->mctx_jobid, JOBIDUNKNOWN) == 0) {
+ char *jobid = smfi_getsymval(ctx, "i");
+ if (jobid != 0)
+ dfc->mctx_jobid = jobid;
+ }
+
/* get hostname; used in the X header and in new MIME boundaries */
hostname = smfi_getsymval(ctx, "j");
if (hostname == NULL)
@@ -3572,7 +3579,7 @@
(void) config_get(cfg, "DNSTimeout", &tmo);
if (become == NULL)
- (void) config_get(cfg, "Userid", &selector);
+ (void) config_get(cfg, "Userid", &become);
if (version == NULL)
(void) config_get(cfg, "Version", &version);
@@ -4535,7 +4542,7 @@
}
#if _FFR_SELECT_SIGN_HEADERS
- if (cf != NULL)
+ if (cfg != NULL)
(void) config_get(cfg, "SignHeaders", &signhdrs);
if (signhdrs != NULL)
{
在 0.5.1 版中, 有兩個小問題:
- 在 dkim-filter/dkim-filter.c 的 3575 行的那個 Userid 的變數應該是 become 才對. 如果不修改, 在使用設定檔時, 如果設定 Userid 這個參數, 反而變成去設定 Selector 這個參數.
- 如果有打開 FFR_SELECT_SIGN_HEADERS 支援時, 在 dkim-filter/dkim-filter.c 的 4538 行那個 cf 應該是 cfg 才對.
不過, 在我安裝之後, 雖然送出的信件都有含所應該產生的 header, 不過, 在前述那幾個測試的信箱中, 沒有一個認為那個是正確的值. 目前仍不知道為什麼. 不過, 由那幾個信箱回覆的信件中, 如果有 DKIM 的設定時, 在我的伺服器上頭, 倒是可以正常的判斷出來. 等有空或有出新版時, 再來試看看好了.