なぜかcron実行エラーやnextcloudの通知メールにdkim署名されなかった件

 メーラーやroundcubeから送付したメールにはちゃんとDKIM署名されていたためすぐには気付けなかったが、cronのエラーメールやsendmailコマンドで送付する設定のnextcloudの通知メールにDKIM署名されていなかった。

 Postfixの設定に通暁されている方なら、上記の現象を聞いただけでなんとなく原因を特定できるのではないかと思われる。

 正解だけ書いてしまえば、postfixのmain.cfに
 non_smtpd_milters = $smtpd_milters
 と追記すればよいのだが、後学のためなぜこの設定が必要なのかを説明したい。

 実は、Postfixではメールの送信経路が2つ存在する。
 一つはSMTPフィルタ(Milter)を経由する経路。通常、メールサーバのメール送信ポートに対してセッションを張ってメールを送付する場合はこちらの経路となる。そのため、メーラーやroundcubeでのメール送付はこちらの経路を使用することになる。
 それとは別に、SMTPフィルタを経由しない経路でメールを送付することができる。この経路は主にsendmailコマンドを使用したメールの送付等が該当する。

 実は問題発生時、postfixのmain.cfには以下の記述のみがあった。
 smtpd_milters = local:/run/opendkim/opendkim.sock,local:/run/opendmarc/opendmarc.sock
 この設定はSMTPフィルタ経由のメール送信に対してOpendkim,Oendmarcを適用する設定である。
 つまり、上記の設定のみが適用されている場合、SMTPフィルタを経由しないsendmailコマンドで送付されるメールについては上記の設定は適用されず、結果としてOpendkimの署名がされないのである。

 非SMTPフィルタ経由のメールへの処理については前述のnon_smtpd_milters を設定することで対応する。
 SMTPフィルタと同様の設定で問題ないのであれば$smtpd_miltersとしてSMTPフィルタ経由の設定を反映するようにすればよい(当然、個別に処理を記載しても問題ない)

 サクッとネット上の設定をコピペしてサーバを動かしていると時にこういう問題に遭遇する。
 こういった経験から使用するツールの設定についてはある程度理解をしておく必要があると再度認識するのであった。

Linux