前回までの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 &