サムネイル画像

前々からメールサーバーの構築をしてみたいと思っていたが、なかなか実現できなかった。 以前同様の投稿を残そうとした記憶もあるのだが、すぐに見つからないので今回リンクは割愛する。

いくつかメールサーバーを構築するためのオプションはあるのだが、前提としては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内なので不要)
    • 認証方式:プレーン

⑤ 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):

メールの受信を確認する(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):

メールの受信を確認する(production)

興味深いことにRainloop上ではそのままメールを表示するのではなく、レンダリングエンジンを実装しているようだ。 そのため画像のレンダリングやCSSの表示が崩れてしまうようだが、画像のURLは正しく機能しているし、リンクも問題ない。

まとめ

あくまで今回はLAN内という前提なので、本来行うべき認証は行っていない。 そのため他のアプリケーションから呼び出すにはまだ若干使いにくい。

それでも普段無視しがちだったActionMailerを自分で深ぼりできたのはよかった。

現時点ではRainloopのみの確認方法のみだけれども、もう少し余裕ができれば認証を使えるようにすることも視野にいれていこうと考えている。