Postfix に DKIM を設定する
メールを送信していると何故か迷惑メール扱いになる事があった。
SPF は設定していたのだが DKIM は設定していなかったので、新たに設定してみる事にした。
OpenDKIM のインストール
OpenDKIM は次の方法でインストールする。
# dnf install opendkim opendkim-tools
インストールすると「/etc/opendkim/」ディレクトリが作成される。
しかし何故か設定ファイルは「/etc/opendkim.conf」として作成される。
キーファイルの作成
ここで、自宅のメールサーバーは「mail.magic-object.mydns.jp」なのでそれに対するキーを作成する。
ここを参考にする場合は、自分のメールアドレスの「ユーザー@ドメイン」のドメイン部分に対するキーを作成して下さい。
「/etc/opendkim/keys/」はキーを格納するディレクトリですが、インストールした段階でカラで作成されます。
そして「-s」の後に指定する部分は「セレクタ」と呼ばれる部分なのですが、Postfix で使用するために作成しますので「postfix」としています。
# opendkim-genkey -D /etc/opendkim/keys/ -b 1024 -d magic-object.com -s postfix
# chown -R opendkim:opendkim /etc/opendkim/keys/
# ls -l keys
合計 8
-rw-------. 1 opendkim opendkim 916 3月 26 01:27 postfix.private
-rw-------. 1 opendkim opendkim 330 3月 26 01:27 postfix.txt
これで公開キー「postfix.txt」と秘密キー「postfix.private」が作成されました。
公開キーは DNS で使用します。(DNSのTXTレコード形式で記述されています。)
「/etc/opendkim.conf」の編集
次の項目を編集します。
ドメイン部分(Domain)は自分のモノに変更して下さい。
セレクタ(Selector)は「postfix」にします。
キーファイル(Keyfile) には秘密キーを指定します。(公開キーはDNSで使用しますので指定する必要はありません)
ソケット(Socket)はネットワーク形式で記述します。(UNIXドメインソケット形式は後術)
その他は変更の必要はありません。
# 送信時は署名を行い、受信時は検証する Mode sv Domain mail.magic-object.mydns.jp Selector postfix KeyFile /etc/opendkim/keys/postfix.private Socket inet:8891@localhost
ソケットをUNIXドメインソケット形式にするには次の様に設定します。(個人的には非推奨)
ですが、家の環境ではどうしても接続エラーになってしまいました。
Socket local:/run/opendkim/opendkim.sock Umask 000
「/etc/opendkim/KeyTable」の編集
# OPENDKIM KEY TABLE
# To use this file, uncomment the #KeyTable option in /etc/opendkim.conf,
# then uncomment the following line and replace example.com with your domain
# name, then restart OpenDKIM. Additional keys may be added on separate lines.
#default._domainkey.example.com example.com:default:/etc/opendkim/keys/default.private
postfix._domainkey.magic-object.com magic-object.com:postfix:/etc/opendkim/keys/postfix.private
「/etc/opendkim/SigningTable」の編集
# OPENDKIM SIGNING TABLE
# This table controls how to apply one or more signatures to outgoing messages based
# on the address found in the From: header field. In simple terms, this tells
# OpenDKIM "how" to apply your keys.
# To use this file, uncomment the SigningTable option in /etc/opendkim.conf,
# then uncomment one of the usage examples below and replace example.com with your
# domain name, then restart OpenDKIM.
# WILDCARD EXAMPLE
# Enables signing for any address on the listed domain(s), but will work only if
# "refile:/etc/opendkim/SigningTable" is included in /etc/opendkim.conf.
# Create additional lines for additional domains.
#*@example.com default._domainkey.example.com
# NON-WILDCARD EXAMPLE
# If "file:" (instead of "refile:") is specified in /etc/opendkim.conf, then
# wildcards will not work. Instead, full user@host is checked first, then simply host,
# then user@.domain (with all superdomains checked in sequence, so "foo.example.com"
# would first check "user@foo.example.com", then "user@.example.com", then "user@.com"),
# then .domain, then user@*, and finally *. See the opendkim.conf(5) man page under
# "SigningTable" for more details.
#example.com default._domainkey.example.com
*@magic-object.com postfix._domainkey.magic-object.com
OpenDKIM の起動とデフォルト化
# systemctl enable opendkim.service # systemctl start opendkim.service
Postfix の「/etc/postfix/main.cf」の編集
次の部分を追加します。
smtpd_milters = inet:127.0.0.1:8891 non_smtpd_milters = $smtpd_milters milter_default_action = accept milter_protocol = 2
UNIXドメインソケット形式では「smtpd_milters = unix:/run/opendkim/opendkim.sock」と指定します。
Postfix の再起動
# systemctl restart postfix
MyDNS での編集
「/etc/opendkim/keys/postfix.txt」(公開キー)の内容は次の様になっていました。
※ 必ず自分で作成した公開キーを参考にして下さい。こちらを参考にしても意味はありません。
postfix._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZOXGC1e0ASZTbYKkaDCdXFwMEm5KIBERA/Ej5+rC2Xo3koAlczPypQFR/ZDrDqVPjbPH7mQPZvBeVnaejft6qXoxhYBOQqdwxZtdDBESAzQfIkMf7Eke4ydmRkT1nQ0kU29r4Jik+Bg4wDrfN1+ceOJKQ2L8BfGUYqX9pM7EjqwIDAQAB" ) ; ----- DKIM key postfix for magic-object.com
ValueDomain では次の様に設定しました。
txt _adsp._domainkey.magic-object.com. dkim=unknown
txt postfix._domainkey.magic-object.com. v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZOXGC1e0ASZTbYKkaDCdXFwMEm5KIBERA/Ej5+rC2Xo3koAlczPypQFR/ZDrDqVPjbPH7mQPZvBeVnaejft6qXoxhYBOQqdwxZtdDBESAzQfIkMf7Eke4ydmRkT1nQ0kU29r4Jik+Bg4wDrfN1+ceOJKQ2L8BfGUYqX9pM7EjqwIDAQAB
ですので、MyDNS では次の様に設定しました。

追加するのは2項目「_adsp._domainkey.mail」と「postfix._domainkey.mail」です。
ポイントは「mail」が既にサブドメインですので、それに追加する形で「.mail」が必要な事です。(メールアドレスのドメイン部分が「XXX@mail.XXX」となっている場合はこうなるハズです。
どちらも「TXT」タイプで指定して「_adsp._domainkey.mail」には「dkim=unknown」と指定します。
では設定が上手くいっているか確認します。
# dig @8.8.8.8 _adsp._domainkey.magic-object.com TXT
; <<>> DiG 9.18.41 <<>> @8.8.8.8 _adsp._domainkey.magic-object.com TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46621
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_adsp._domainkey.magic-object.com. IN TXT
;; ANSWER SECTION:
_adsp._domainkey.magic-object.com. 60 IN TXT "dkim=unknown"
;; Query time: 27 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Nov 01 01:27:50 JST 2025
;; MSG SIZE rcvd: 87
# dig @8.8.8.8 postfix._domainkey.magic-object.com TXT
; <<>> DiG 9.18.41 <<>> @8.8.8.8 postfix._domainkey.magic-object.com TXT
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18263
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;postfix._domainkey.magic-object.com. IN TXT
;; ANSWER SECTION:
postfix._domainkey.magic-object.com. 60 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZOXGC1e0ASZTbYKkaDCdXFwMEm5KIBERA/Ej5+rC2Xo3koAlczPypQFR/ZDrDqVPjbPH7mQPZvBeVnaejft6qXoxhYBOQqdwxZtdDBESAzQfIkMf7Eke4ydmRkT1nQ0kU29r4Jik+Bg4wDrfN1+ceOJKQ2L8BfGUYqX9pM7EjqwIDAQAB"
;; Query time: 22 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat Nov 01 01:29:16 JST 2025
;; MSG SIZE rcvd: 311
# dig @8.8.8.8 _adsp._domainkey.mail.magic-object.mydns.jp TXT ; <<>> DiG 9.18.24 <<>> @8.8.8.8 _adsp._domainkey.mail.magic-object.mydns.jp TXT ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34157 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;_adsp._domainkey.mail.magic-object.mydns.jp. IN TXT ;; ANSWER SECTION: _adsp._domainkey.mail.magic-object.mydns.jp. 300 IN TXT "dkim=unknown" ;; Query time: 31 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP) ;; WHEN: Tue Mar 26 22:52:47 JST 2024 ;; MSG SIZE rcvd: 97
# dig @8.8.8.8 postfix._domainkey.mail.magic-object.mydns.jp TXT ; <<>> DiG 9.18.24 <<>> @8.8.8.8 postfix._domainkey.mail.magic-object.mydns.jp TXT ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58030 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;postfix._domainkey.mail.magic-object.mydns.jp. IN TXT ;; ANSWER SECTION: postfix._domainkey.mail.magic-object.mydns.jp. 300 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZOXGC1e0ASZTbYKkaDCdXFwMEm5KIBERA/Ej5+rC2Xo3koAlczPypQFR/ZDrDqVPjbPH7mQPZvBeVnaejft6qXoxhYBOQqdwxZtdDBESAzQfIkMf7Eke4ydmRkT1nQ0kU29r4Jik+Bg4wDrfN1+ceOJKQ2L8BfGUYqX9pM7EjqwIDAQAB" ;; Query time: 46 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP) ;; WHEN: Tue Mar 26 22:54:15 JST 2024 ;; MSG SIZE rcvd: 321
メールを送信してみて確認する
メールを Gmail に送信して、メールのソースを確認します。
dkim=pass header.i=@mail.magic-object.mydns.jp header.s=postfix header.b=lETfiDSh;
無事にパスしています。これで DKIM の設定は完了しました。
問題
SPF も設定してパスし、DKIM もパス、「dmarc=pass」となっているにも関わらず Gmail では迷惑メール扱いになる。どうやら MyDNS を利用している事に問題がありそうだ。
