2026年8月6日

2026年8月6日

Postfix + DovecotでIMAPメールサーバーを構築する手順(受信・送信認証・TLS)

PostfixでSMTPの受信と送信を、DovecotでIMAPによるメールボックスの読み出しとSMTP認証を受け持たせると、自分のドメインのメールをThunderbirdやスマートフォンのメールアプリで送受信できるメールサーバーになります。この記事では、Ubuntu/Debianを例に、DNSとTLS証明書の準備、Postfixの受信設定と送信用ポート587、DovecotのIMAP設定、PostfixとDovecotの認証連携、動作確認までを順番に説明します。Postfixを送信専用として入れる基本設定とは目的が異なり、ここでは外部からの接続を受け付けるサーバーを作ります。

構成の全体像と事前の判断

完成形では、次の3つのポートを使います。

  • 25番(SMTP): 他のメールサーバーから自ドメイン宛のメールを受け取る。Postfixが担当します。
  • 587番(Submission): 利用者のメールアプリから送信を受け付ける。TLSとユーザー認証を必須にします。認証の確認はDovecotに任せます。
  • 993番(IMAPS): メールアプリがメールボックスを読み出す。Dovecotが担当します。

自前のメールサーバーは、迷惑メール対策、TLS証明書の更新、ブラックリストへの登録監視、メールデータのバックアップなど、継続的な運用が要ります。届かないメールの調査も自分で行うことになるため、業務の主要な連絡手段にする前に、ホスティング型のメールサービスとの比較を一度しておくことをおすすめします。

前提:DNS・逆引き・ポート

メールサーバーのホスト名を mail.example.com、メールアドレスのドメインを example.com とします。

  • Aレコード: mail.example.com がサーバーのIPアドレスを指すようにします。
  • MXレコード: example.com のMXを mail.example.com に向けます。既存のメールサービスからの移行では、MXを切り替えた瞬間に受信先が変わるため、切り替えのタイミングを決めてから変更します。
  • 逆引き(PTR): サーバーのIPアドレスの逆引きが mail.example.com を返すように、VPSやクラウドの管理画面で設定します。
  • ポート: クラウドやVPSによっては、ポート25の通信が既定で制限されています。受信・送信の両方に関わるため、事業者の制限と解除方法を先に確認します。
  • ファイアウォール: 25、587、993番を開けます(証明書の取得にHTTPを使う場合は80番も)。
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 993/tcp

既存のサーバーで作業する場合は、/etc/postfix/ と /etc/dovecot/ をバックアップしてから進めます。可能なら、本番のMXを向ける前に検証用のドメインで一通り試します。

TLS証明書を用意する

メールアプリはサーバー証明書を検証するため、mail.example.com の正式な証明書が要ります。Let's Encryptを使う例です。Webサーバーが動いていない場合は --standalone(80番を一時的に使う)、動いている場合は --webroot などを使います。

sudo apt install certbot
sudo certbot certonly --standalone -d mail.example.com \
  --deploy-hook "systemctl reload postfix dovecot"

--deploy-hook を付けておくと、証明書が更新されたときにPostfixとDovecotが新しい証明書を読み込み直します。この指定は更新用の設定に保存されるため、自動更新でも同じ処理が実行されます。更新が通るかは sudo certbot renew --dry-run で確認できます。

Postfixを受信用に設定する

Postfixが入っていない場合は sudo apt install postfix で入れ、設定の種類は「Internet Site」を選びます。続いて main.cf を受信用に設定します。

sudo postconf -e 'myhostname = mail.example.com'
sudo postconf -e 'mydomain = example.com'
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e 'inet_interfaces = all'
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain'
sudo postconf -e 'home_mailbox = Maildir/'

# TLS(受信側)
sudo postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem'
sudo postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtp_tls_security_level = may'

# Dovecot による SMTP 認証
sudo postconf -e 'smtpd_sasl_type = dovecot'
sudo postconf -e 'smtpd_sasl_path = private/auth'

# 中継の制限:ローカルと認証済みユーザーだけが他ドメイン宛に送れる
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'

ポイントを補足します。

  • mydestination に $mydomain を入れることで、user@example.com 宛のメールをこのサーバーで受け取ります。
  • home_mailbox = Maildir/ は、各ユーザーのホームディレクトリの Maildir/ にメールを1通1ファイルで保存する指定です。Dovecot側もこの場所を読むように設定します。
  • smtpd_relay_restrictions の最後が reject_unauth_destination になっていることが、第三者に勝手に中継される「オープンリレー」を防ぐ要です。

送信用ポート587を有効にする

/etc/postfix/master.cf には、submission の行がコメントアウトされた状態で用意されていることが多いです。次のように有効にします。先頭の submission の行は行頭から書き、-o の行は行頭に空白を入れて継続行にします。

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject

5列目付近の y(chroot)の値は、同じファイルの smtp inet の行に合わせてください。Debian/Ubuntuの既定ではchrootが有効です。この設定により、587番ではTLSを確立してからでないと認証できず、認証したユーザーだけが送信できます。25番ではSMTP認証を受け付けない(smtpd_sasl_auth_enable を全体では有効にしない)ことで、パスワードの総当たりの入口を減らせます。

sudo postfix check
sudo systemctl restart postfix

DovecotでIMAPを設定する

sudo apt install dovecot-imapd
dovecot --version

Dovecotは2.3系と2.4系で設定項目の名前が大きく変わっています。以下はUbuntu 24.04 LTSなどに含まれる2.3系の書き方です。Debian 13など2.4系を採用したディストリビューションでは、mail_location が mail_driver と mail_path に、ssl_cert が ssl_server_cert_file に、disable_plaintext_auth が auth_allow_cleartext に変わるなどの違いがあるため、公式ドキュメントの移行ガイドで対応表を確認してください(2026年10月現在)。

設定は /etc/dovecot/conf.d/ の各ファイルで行います。

# 10-mail.conf:Postfixの home_mailbox と同じ場所を読む
mail_location = maildir:~/Maildir

# 10-auth.conf:TLSなしの平文パスワード認証を禁止
disable_plaintext_auth = yes
auth_mechanisms = plain login

# 10-ssl.conf:TLS必須と証明書(パスの前の < はファイルの中身を読む指定)
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2

auth_mechanisms の login は、古いメールアプリとの互換のために入れています。plain も login もパスワードをそのまま送る方式ですが、disable_plaintext_auth = yes と ssl = required によってTLSの内側でしか使えません。

PostfixにDovecotの認証を使わせる

10-master.conf の service auth の中に、Postfix向けの待ち受けを追加します。既存の unix_listener の記述がコメントアウトされていれば、それを有効にして値を合わせます。

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

/var/spool/postfix/private/auth は、Postfixの smtpd_sasl_path = private/auth に対応します。Postfixはchroot内(/var/spool/postfix)から相対パスで参照するため、この組み合わせになります。imap の port = 0 は、暗号化なしの143番を閉じ、993番だけを使う指定です。

sudo doveconf -n          # 実際に効いている設定の確認
sudo systemctl restart dovecot

ユーザーを作成する

この構成では、Linuxのユーザーがそのままメールアカウントになります。

sudo adduser taro

これで taro@example.com 宛のメールが /home/taro/Maildir/ に保存されます。メール用の利用者にサーバーへのSSHログインまで許したくない場合は、SSHの設定でログインできるユーザーを制限します。利用者が多い、またはドメインを複数扱う場合は、Linuxユーザーを作らない「仮想ユーザー」構成(データベースやパスワードファイルで管理)に進みますが、設定が増えるため、まずはこの構成で動作を理解してからが安全です。

動作確認

順に確かめると、どこで止まっているかが分かります。

  1. 待ち受けの確認: sudo ss -ltnp | grep -E ':(25|587|993)\b' で3つのポートが開いているかを見ます。
  2. 認証の確認: sudo doveadm auth test taro を実行し、パスワードを入力して認証が通るかを見ます。パスワードはコマンドの引数に書かず、入力を求められたときに入れます。
  3. TLSの確認: 別のマシンから openssl s_client -connect mail.example.com:993 -quiet と openssl s_client -connect mail.example.com:587 -starttls smtp を実行し、証明書の検証が通るかを見ます。
  4. 受信の確認: 外部のメールアドレスから taro@example.com に送り、/var/log/mail.log で status=sent (delivered to maildir) のような記録が出るかを確かめます。
  5. メールアプリの設定: 受信はIMAP・993番・SSL/TLS、送信はSMTP・587番・STARTTLS、ユーザー名は taro、パスワードはLinuxユーザーのものです。

認証に失敗する場合は journalctl -u dovecot に理由が出ます。送信できない場合は mail.log の postfix/submission の行を見ます。

公開後に続けること

  • 総当たり対策: 認証の失敗を繰り返すIPアドレスをfail2banなどで遮断します。
  • 送信ドメイン認証: SPF・DKIM・DMARCを設定しないと、送ったメールが相手先で迷惑メール扱いされやすくなります。
  • 迷惑メール対策: 受信側のスパム判定(Rspamdなど)を導入します。
  • バックアップ: 各ユーザーの Maildir を定期的にバックアップし、復元の手順も試しておきます。
  • 監視: ディスク容量、メールキューの滞留(postqueue -p)、証明書の期限を監視します。

まとめ

  • Postfixは25番で受信、587番で認証付きの送信を、Dovecotは993番のIMAPとSMTP認証を受け持ちます。
  • MX・A・逆引きの3つのDNSと、mail.example.com の正式なTLS証明書を先に用意します。
  • home_mailbox = Maildir/ と mail_location = maildir:~/Maildir で保存場所をそろえ、private/auth で認証を連携します。
  • オープンリレーを防ぐ reject_unauth_destination と、TLS必須の認証設定を確認します。
  • Dovecotは2.3系と2.4系で設定名が違うため、インストールされたバージョンを確認してから設定します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲