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

 前回までのpostfix+mailmanでUbuntu内、ローカルWindows、および同じネットワーク内の別PCからメーリングリストへの送受信が可能になった。

 ただし、インターネットからのメールは受け付けることはできない。メーリングリスト用のサーバーが外部に露出して無く、MercuryMailも特定のMTAに転送する設定がないせいらしい。

 そこで5日ほど悩んで、何とか実現できそうな方法にたどり着いた。

 外部とはWindowsにxamppを入れて、MercuryMailで通信している。そのMercuryMailにはドメインメールボックスという機能があり、特定のホスト宛てのメールを全て単一のメールボックスに入れることができる。

 そして、fetchmailにはマルチドロップモードという機能があり、1か所に届いたメールを本来の宛先などを読み取って配送する機能がある。

 この二つの機能を組み合わせることで、外部から届いたメールを適切なmailmanの仮想アドレスに届けることができる。

・インストール

  $ sudo apt install fetchmail

・設定
 rootユーザーでの動作は推奨されていないが、システム上のアプリなのでrootで実行させる。

  $ sudo vi /root/.fetchmailrc
# ログファイルの指定
set logfile "/var/log/fetchmail.log"
# エラーの送信先
set postmaster postmaster@mydomain.com
set no bouncemail
# メールのチェック間隔(秒)
set daemon 300

# デフォルト設定
defaults
# 既読のチェックを行う
  uidl
  # 未読メールの取り込み(ex.全て取り込む場合[fetchall])
  no fetchall
  # サーバ上にメールを残す(ex.削除する場合[no keep])
  keep
  # mimed ecode(8ビットデータに変換しない)
  no mimedecode
  # RFC-822 のアドレスヘッダ (To, From, Cc, Bcc, Reply-To) を書き換えない
  no rewrite

# 外部メールサーバの設定(取り込み元) localdomainsではenvelopeが必要
poll mail.mydomain.com with proto imap envelope "X-Envelope-To"
  localdomains ml.mydomain.com
  # アカウント名、パスワード、宛先ユーザー
  user "mailman" with pass "mailパスワード" to * here

設定ファイルを所有者のみRead/Writeにする

  $ sudo chmod 600 /root/.fetchmailrc

ログファイルはあらかじめ作成しておかないとエラーになるので作成しておく。

  $ sudo touch /var/log/fetchmail.log
  $ sudo chown root:root /var/log/fetchmail.log
  $ sudo chmod 600 /var/log/fetchmail.log

・fetchmailの起動
起動と停止はfetchmail設定ファイルを作成したユーザー(つまりsudo )で起動する

$ sudo /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc

起動時にはsslを使用しないオプション(–nosslcertck)を指定しないとSTARTTLSで以下のエラーとなる
fetchmail: POP3< -ERR SSL/TLS services unavailable.
このオプションはコマンドラインでしか指定できないようなので、起動時は毎回指定する。

・fetchmailの停止

  $ sudo fetchmail --quit
or sudo fetchmail -q

・fetchmailの強制フェッチ
set daemonの設定にかかわらず即座にメールボックスのチェックを行う。

  $ sudo fetchmail

・テスト実行

  $ sudo fetchmail --nosslcertck -f /root/.fetchmailrc -v -c

・ログの確認

  $ sudo less +F /var/log/fetchmail.log

・logrotateの設定

  $ sudo vi /etc/logrotate.d/fetchmail
/var/log/fetchmail.log {
    su root root
    weekly
    rotate 10
    notifempty
    create 600 root root
    prerotate
        /usr/bin/fetchmail --quit > /dev/null 2>&1
    endscript
    postrotate
        /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc > /dev/null 2>&1
    endscript

}

apache2のlogrotate設定
 postrotate部分でinvoke-rc.dを使うようになっていたが、WSLでは動作しないらしいため置き換える。

  $ sudo vi /etc/logrotate.d/apache2
-----
	postrotate
                if  ps -ef | grep -vw "^`whoami`" | grep -w apache2 > /dev/null 2>&1; then \
                    apache2ctl graceful > /dev/null 2>&1; \
                fi;
	endscript
-----

cronのログを有効にする

  $ sudo vi /etc/rsyslog.d/50-default.conf
#cron. /var/log/cron.log
↓
cron.* /var/log/cron.log

rsyslogを再起動する

  $ sudo /etc/init.d/rsyslog restart

logrotateは以下のファイル内の日付を見て処理しているので、無理矢理実行させるなら日付を書き換える

/var/lib/logrotate/status

おまけ

 新しいメッセージがない時のfatchmailのログにはタイムスタンプがないので、ログを見ただけでは動いているかどうかわかりにくい。

 定期的にタイムスタンプを挿入するスクリプトを動かす。

  $ sudo vi /root/fetchmail_time.sh
-----
#!/bin/bash
sleep 60
while true
do
  if [ -w /var/log/fetchmail.log ]; then
    echo '          ' `date '+%Y/%m/%d %H:%M:%S'`>> /var/log/fetchmail.log
  fi
  sleep 3600
done
-----
  $ sudo chown root.root /root/fetchmail_time.sh

  $ sudo chmod 700 /root/fetchmail_time.sh

  $ sudo vi /etc/sudoers.d/auto-start
%sudo ALL=NOPASSWD: /root/fetchmail_time.sh

  $ vi ~/.bash_aliases
    ps -ef | grep -vw "^`whoami`" | grep -w fetchmail_time  || sudo /root/fetchmail_time.sh &