メールサーバーの構築方法を探る
前々からメールサーバーの構築をしてみたいと思っていたが、なかなか実現できなかった。 以前同様の投稿を残そうとした記憶もあるのだが、すぐに見つからないので今回リンクは割愛する。
いくつかメールサーバーを構築するためのオプションはあるのだが、前提としてはLAN内でのみ動作させることを目的としている。 例えば所定のジョブが完了したとか、そういった通知目的のためだ。 Ntfyサーバーを以前用意したけれども、単純なメールサーバーも併用しようとは思っている。
今回作りたいイメージ図はこれ。
送信元サーバーにもPostfixをインストールしてはみたのだが、よくよく考えると不要だった。
メールサーバーはポート25
を開放して、SMTPサーバーを指定すればよいだろう。
それでは以下に設定方法を残していく。
Postfixのインストールと設定
sudo apt update
sudo apt install postfix
インストール時の設定:
- 「インターネットサイト」
- メール名 →
mail-recv.local
/etc/postfix/main.cf
の主要設定:
myhostname = mail-recv.local
mydomain = local
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8, 192.168.X.0/24
home_mailbox = Maildir/
Maildir形式を使用(各ユーザーに /home/youruser/Maildir
)
sudo apt install mailutils # mailコマンドなどが使えるようになります(任意)
sudo mkdir /home/youruser/Maildir
sudo chmod 700 /home/youruser/Maildir
sudo chown youruser:youruser /home/youruser/Maildir
Dovecot(IMAPサーバー)設定
sudo apt install dovecot-core dovecot-imapd
/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
/etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
}
サービスの再起動
sudo systemctl restart postfix dovecot
テスト:メールを送信してみる
別のマシンや同じマシンから以下でテストできます:
echo "テスト本文" | mail -s "テスト件名" youruser@mail-recv.local
→ 送信後、Maildir内の new/
ディレクトリに .eml
ファイルが生成されれば成功です:
ls ~/Maildir/new/
Webメールの導入(RainLoop)
NOTE: RainLoopそのものはすでに開発が止まっているようだが、最低限の機能さえあればよいので容認する。
sudo apt install apache2 php php-curl php-xml unzip
cd /var/www
sudo wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
sudo unzip rainloop-community-latest.zip -d rainloop
sudo chown -R www-data:www-data rainloop
/etc/apache2/sites-available/rainloop.conf
<VirtualHost *:80>
ServerName mail-recv.local
DocumentRoot /var/www/rainloop
<Directory /var/www/rainloop>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/rainloop_error.log
CustomLog ${APACHE_LOG_DIR}/rainloop_access.log combined
</VirtualHost>
① サイトを有効化
sudo a2ensite rainloop.conf
sudo systemctl reload apache2
Apacheのエラーログなどにエラーがないかを確認する:
sudo journalctl -xe
sudo tail -n 50 /var/log/apache2/error.log
② デフォルト仮想ホストを削除(無効化)する方法
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
有効なサイト設定を確認する:
sudo apache2ctl -S
③ hosts ファイル(クライアント側)に追加(※DNSがない場合)
192.168.X.X mail-recv.local
④ RainLoop 管理画面にアクセス
ブラウザから以下にアクセス:
http://mail-recv.local/?admin
初回ログイン情報(デフォルト):
- ユーザー名:
admin
- パスワード:
12345
ログイン後、以下のように設定する:
- ドメインの追加:
mail-recv.local
- IMAPサーバー:
127.0.0.1
ポート143
- SMTPサーバー:空欄または
127.0.0.1
ポート25
- SSLなし(LAN内なので不要)
- 認証方式:プレーン
- IMAPサーバー:
⑤ RainLoop にアクセス
http://mail-recv.local/
任意のローカルユーザー(例:youruser
)のアカウントでログイン
パスワードはそのUNIXユーザーのパスワード
ログインできれば、IMAPでメール一覧を取得できる状態
RailsのActionMailer設定(development)
Mailcatcherを起動:
docker run -p 1080:1080 -p 1025:1025 sj26/mailcatcher
config/environments/development.rb
config.action_mailer.asset_host = "http://localhost:3000"
config.action_mailer.default_url_options = { host: "localhost", port: 3000 }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { address: "localhost", port: 1025 }
Deviseなどで毎回この設定を特に気にせず行っていたが、URLを指定しないとメール側のリンクや画像が機能しない。 その意味も込めて今回Mailcatcherの設定例も残している。
app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "no-reply@example.org",
to: "youruser@mail-recv.local"
layout "mailer"
end
メールの受信を確認する(development):
RailsのActionMailer設定(production)
config/environments/production.rb
config.action_mailer.asset_host = "https://example.com"
config.action_mailer.default_url_options = { host: "example.com", port: 443 }
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "mail-recv.local",
port: 25,
authentication: nil, # 認証を完全に無効
enable_starttls_auto: false
}
メールの受信を確認する(production):
興味深いことにRainloop上ではそのままメールを表示するのではなく、レンダリングエンジンを実装しているようだ。 そのため画像のレンダリングやCSSの表示が崩れてしまうようだが、画像のURLは正しく機能しているし、リンクも問題ない。
まとめ
あくまで今回はLAN内という前提なので、本来行うべき認証は行っていない。 そのため他のアプリケーションから呼び出すにはまだ若干使いにくい。
それでも普段無視しがちだったActionMailerを自分で深ぼりできたのはよかった。
現時点ではRainloopのみの確認方法のみだけれども、もう少し余裕ができれば認証を使えるようにすることも視野にいれていこうと考えている。