WSLを使ってメーリングリストを作成(番外編2)

 しばらく運用して問題点が出てきたので解決する。

  1. サブドメインから送ったメールがAuthentication-Resultsセクションでdkim-adsp=noneとなる。
  2. 毎日06:30ごろにroot宛にCronのエラーメールが来る。
  3. リンゴの絵がついた携帯から投稿すると文字化けして配送される。

1.サブドメインから送ったメールがAuthentication-Resultsセクションでdkim-adsp=noneとなる

 サブドメインml.mydomain.comにspfとdkimが必要らしい。以下のサブドメインに対してそれぞれ設定を行う。

mail.mydomain.com
ml.mydomain.com

・サブドメインにSPFレコードを追加する

TXT,mail.mydomain.com v=spf1 include:mydomain.com -all

・Amazon SESでサブドメインにDKIMを追加する

Amazon SESコンソールを開く
Configurationの下のVerified identitiesをクリック
Create identityを押す、identity typeのDomainをチェック
Domainにサブドメイン名を入力 mail.mydomain.com
    Assign a default configuration set: off
    Use a custom MAIL FROM domain: off
Create identifyを押す
作成されたLegacy TXT RecordsとPublish DNS recordsをDNSに追加する

TXT,_amazonses.mail.mydomain.com,xxxxx
TXT,mail.mydomain.com,amazonses:xxxxx
CNAME,xxx._domainkey.mail.mydomain.com,xxx.dkim.amazonses.com
CNAME,yyy._domainkey.mail.mydomain.com,yyy.dkim.amazonses.com
CNAME,zzz._domainkey.mail.mydomain.com,zzz.dkim.amazonses.com

 しばらくしてAWS側の検証が完了すると、DKIM setup SUCCESS for ドメイン という件名のメールがAWSアカウント宛に届く

これでdkim-adsp=passとなっているはずなので、サブドメインからメールを送って確認する。

・元のドメインのDKIMを見てみるとキー長が1024ビットだったので2048ビットに変えておく。

SESではキー長を変更する場合には以下の制限があるらしい

・同じ長さには変えられない
・24時間内に別のキー長に2回以上変えられない(その期間の最初のダウングレードを除く)

キー長の変更手順

Amazon SESコンソールを開く
Configurationの下のVerified identitiesをクリック
対象のアイテム(ドメイン)をクリックする
AuthenticationタブのDomainKeys Identified Mail (DKIM)にあるEditを押す
DKIM signing key lengthの RSA_2048_BIT か RSA_1024_BIT を選ぶ
Save changesを押す
次に送られるメールからは、キー長が変わるらしい。

・追加したサブドメインにバウンス対応用のSNS通知を設定しておく

2.毎日06:30ごろにroot宛にCronのエラーメールが来る

Cron <root@xxxx> test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

  /etc/cron.daily/logrotate:
  invoke-rc.d: could not determine current runlevel

WSLではinvoke-rc.dはエラーとなるが、誰かが動かそうとしているらしい。

実行階層の解析
/etc/crontab: ( cd / && run-parts --report /etc/cron.daily )
 /etc/cron.dairy/logrotate
  /usr/sbin/logrotate /etc/logrotate.conf: include /etc/logrotate.d
   /etc/logrotate.d/rsyslog
    /usr/lib/rsyslog/rsysrog-rotate
     invoke-rc.d rsyslog rotate > /dev/null

rsysrog-rotate内でinvoke-rc.d が実行されていた。

invoke-rc.d rsyslog rotate > /dev/null

rsysrog-rotateファイルを書き換える。

$ sudo vi /usr/lib/rsyslog/rsysrog-rotate
invoke-rc.d rsyslog rotate > /dev/null
   ↓
/etc/init.d/rsyslog rotate > /dev/null

リンゴの絵がついた携帯から投稿すると文字化けして配送される

届いたメールのヘッダーにによるとutf-8エンコードされた後にbase64エンコードされている。

Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

mailmanがbase64デコードをせずに、base64エンコードされた文字列をそのままutf-8として解釈して転送しているので文字化けしているのかもしれない。

以下のサイトにあるbase64デコードフィルターを追加することにした。

https://yamagata.int21h.jp/tool/gmail-filter/

上記サイトの内容でスクリプトファイルを作成する。先頭行は環境に合わせて書き換える。

$ sudo vi /usr/local/bin/base64-filter.pl
  #!/usr/bin/perl
    ...
$ sudo chomd +x /usr/local/bin/base64-filter.pl

postfix用のaliasesファイルですべてのメーリングリスト名の行を書き換える。

$ sudo vi /var/lib/mailman/data/aliases
  mailman:             "|/var/lib/mailman/mail/mailman post mailman"
    ↓
  mailman:             "|/usr/local/bin/base64-filter.pl |/var/lib/mailman/mail/mailman post mailman"
$ sudo newaliases

aliasデータベースを更新するのを忘れずに。

$ sudo newaliases

注意点として、メーリングリストの追加・削除や手動で/usr/lib/mailman/bin/genaliasesを実行したときには、このファイルが更新され、フィルターの記述が消えるので、都度編集する必要がある。