概要
Postfixは高性能なメールサーバソフトウェア (MTA : Mail Transfer Agent) であり、Dovecotは電子メールの受信と管理を担うソフトウェア (MDA : Mail Delivery Agent) である。
Docker / Podmanコンテナとして実行することにより、開発環境や本番環境で簡単にメールサーバを構築することができる。
PostfixはSMTPによるメール送信を処理、DovecotはIMAP/POP3によるメール受信とメールボックス管理を行う。
| 機能 | プロトコル | デフォルトポート | 説明 |
|---|---|---|---|
| SMTP受信 | SMTP | 25 | 外部からのメール受信 |
| SMTP送信認証 | SMTP / STARTTLS | 587 | 認証付きメール送信 (Submission) |
| IMAP受信 | IMAPS | 993 | メールクライアントからのIMAP接続 |
| POP3受信 | POP3S | 995 | メールクライアントからのPOP3接続 |
| SASL認証 | - | - | DovecotによるSMTP認証機能 |
ディレクトリ構成
メールサーバの設定ファイルを管理するためのディレクトリ構成を以下に示す。
mailserver/
├── docker-compose.yml
├── postfix/
│ ├── main.cf
│ ├── master.cf
│ ├── vmailbox
│ └── virtual
├── dovecot/
│ ├── dovecot.conf
│ ├── users
│ └── conf.d/
│ ├── 10-auth.conf
│ ├── 10-mail.conf
│ ├── 10-master.conf
│ └── 10-ssl.conf
├── certs/
│ ├── mail.crt
│ └── mail.key
└── vmail/
└── (メールボックスデータ)
Containerfile
Containerfileを作成する。
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && \
apt install -y \
postfix \
dovecot-imapd \
dovecot-pop3d \
dovecot-lmtpd \
supervisor \
rsyslog && \
apt clean && \
rm -rf /var/lib/apt/lists/*
COPY postfix/ /etc/postfix/
COPY dovecot/ /etc/dovecot/
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN mkdir -p /var/mail/vmail && \
groupadd -g 5000 vmail && \
useradd -u 5000 -g vmail -s /usr/sbin/nologin -d /var/mail/vmail vmail && \
chown -R vmail:vmail /var/mail/vmail
EXPOSE 25 587 993 995
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
コンテナイメージをビルドする。
podman build -t mailserver:custom -f Containerfile .
ビルドしたイメージからコンテナを実行する。
podman run -d \
--name mailserver \
--hostname mail.example.com \
-p 0.0.0.0:25:25 \
-p 0.0.0.0:587:587 \
-p 0.0.0.0:993:993 \
-v ./vmail:/var/mail/vmail \
-v ./certs:/etc/ssl/certs/mail \
mailserver:custom
Compose
Composeファイルを作成する。
version: '3.8'
services:
mailserver:
image: ubuntu:22.04
container_name: mailserver
hostname: mail.example.com
ports:
- "0.0.0.0:25:25" # SMTP
- "0.0.0.0:587:587" # SMTP Submission
- "0.0.0.0:993:993" # IMAPS
- "0.0.0.0:995:995" # POP3S
volumes:
- ./postfix/main.cf:/etc/postfix/main.cf
- ./postfix/master.cf:/etc/postfix/master.cf
- ./dovecot/dovecot.conf:/etc/dovecot/dovecot.conf
- ./dovecot/conf.d:/etc/dovecot/conf.d
- ./certs:/etc/ssl/certs/mail
- ./vmail:/var/mail/vmail
- mailserver-spool:/var/spool/postfix
- mailserver-logs:/var/log
environment:
- DOMAIN=example.com
- HOSTNAME=mail.example.com
restart: unless-stopped
command: |
/bin/bash -c "apt update && \
apt install -y postfix dovecot-imapd dovecot-pop3d supervisor && \
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf"
volumes:
mailserver-spool:
mailserver-logs:
Composeファイルを実行して、コンテナを作成および実行する。
podman-compose up -d # または podman-compose -f <Composeファイル名> up -d
Postfix設定ファイル
main.cf
main.cfファイルは、サーバのホスト名、受信するドメイン、認証方式、TLS暗号化、セキュリティポリシー、バーチャルメールボックスの設定等のメールサーバの基本的な動作を定義する。
postfix/main.cfファイルを作成する。
# 基本設定
myhostname = mail.example.com # メールサーバのホスト名(FQDN)
mydomain = example.com # 所属するドメイン名
myorigin = $mydomain # 送信メールの送信元ドメイン
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # 最終配送先として受け取るドメイン
relayhost = # 外部SMTPリレーサーバ(空白の場合は直接配送)
mynetworks = 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 # 信頼するネットワーク範囲
inet_interfaces = all # 待ち受けるネットワークインターフェース (all : 全て)
inet_protocols = ipv4 # 使用するプロトコル (ipv4 / ipv6 / all)
# メールボックス設定
home_mailbox = Maildir/ # メールボックス形式 (Maildir形式)
mailbox_command = # メール配送時の外部コマンド (空白 : 標準配送)
# SASL認証設定 (Dovecot経由)
smtpd_sasl_type = dovecot # SASL認証のバックエンドタイプ
smtpd_sasl_path = private/auth # Dovecot認証ソケットのパス
smtpd_sasl_auth_enable = yes # SMTP認証機能の有効化
smtpd_sasl_security_options = noanonymous # 匿名認証の無効化
smtpd_sasl_local_domain = $mydomain # SASL認証で使用するローカルドメイン
broken_sasl_auth_clients = yes # 古いクライアントとの互換性維持
# TLS設定
smtpd_use_tls = yes # TLS暗号化機能の有効化
smtpd_tls_cert_file = /etc/ssl/certs/mail/mail.crt # サーバ証明書ファイルのパス
smtpd_tls_key_file = /etc/ssl/certs/mail/mail.key # 秘密鍵ファイルのパス
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache # サーバ側TLSセッションキャッシュ
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # クライアント側TLSセッションキャッシュ
smtpd_tls_security_level = may # TLSセキュリティレベル (may : 任意、encrypt : 必須)
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 # 使用禁止プロトコル (! : 禁止)
smtpd_tls_ciphers = high # 暗号化方式の強度 (high : 高強度のみ)
smtpd_tls_mandatory_ciphers = high # TLS必須時の暗号化方式強度
# セキュリティ設定
# 受信者アドレスに対する制限ルール(上から順に評価)
smtpd_recipient_restrictions =
permit_mynetworks, # 信頼ネットワークからの接続を許可
permit_sasl_authenticated, # SASL認証済みクライアントを許可
reject_unauth_destination, # 未認証の外部ドメイン宛を拒否 (オープンリレー防止)
reject_invalid_hostname, # 無効なホスト名を拒否
reject_non_fqdn_sender, # 送信者がFQDNでない場合を拒否
reject_non_fqdn_recipient, # 受信者がFQDNでない場合を拒否
reject_unknown_sender_domain, # 送信者ドメインのDNS解決失敗を拒否
reject_unknown_recipient_domain # 受信者ドメインのDNS解決失敗を拒否
# バーチャルメールボックス設定
virtual_mailbox_domains = example.com # バーチャルドメインとして扱うドメイン
virtual_mailbox_base = /var/mail/vmail # バーチャルメールボックスのベースディレクトリ
virtual_mailbox_maps = hash:/etc/postfix/vmailbox # メールアドレスとメールボックスの対応ファイル
virtual_minimum_uid = 1000 # 使用する最小UID値
virtual_uid_maps = static:5000 # バーチャルメールボックスで使用する固定UID
virtual_gid_maps = static:5000 # バーチャルメールボックスで使用する固定GID
virtual_alias_maps = hash:/etc/postfix/virtual # メールエイリアス (転送設定) ファイル
master.cf
master.cfファイルは、Postfixのサービスプロセスを制御する設定ファイルである。
各サービスの起動方法、プロセス数、実行ユーザ、コマンドラインオプション等を定義する。
また、SMTP、SMTP Submission、LMTPなどの各種サービスの動作を個別に設定することができる。
特に、SMTP Submission (ポート587) の設定では、認証必須やTLS暗号化必須等のオプションを追加することにより、セキュアなメール送信環境を構築することができる。
postfix/master.cfファイルに、SMTP Submissionポート (587番) の設定を追加する。
# SMTP Submission (ポート587) の設定 # サービス定義 : submission / inet / smtpdプロセスを起動 submission inet n - y - - smtpd -o syslog_name=postfix/submission # syslogでの識別名 -o smtpd_tls_security_level=encrypt # TLS暗号化を必須化 -o smtpd_sasl_auth_enable=yes # SASL認証を有効化 -o smtpd_reject_unlisted_recipient=no # 受信者リスト外への配送を許可 -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject # 認証済みのみ許可 -o milter_macro_daemon_name=ORIGINATING # メールフィルタに内部送信を通知
バーチャルメールボックスの設定
vmailboxファイルは、メールアドレスとそれに対応するメールボックスのディレクトリパスを関連付ける。
各行には、左側にメールアドレス、右側にそのメールボックスの相対パスを記述する。
このファイルを編集した後は、postmapコマンドでハッシュデータベースに変換する必要がある。
Postfixは、このハッシュデータベースを参照して、受信したメールを適切なメールボックスに配送する。
postfix/vmailboxファイルを作成して、仮想メールボックスを定義する。
# 形式 : メールアドレス メールボックスの相対パス
# パスはvirtual_mailbox_base (/var/mail/vmail) からの相対パス
user1@example.com example.com/user1/ # user1のメールボックス
user2@example.com example.com/user2/ # user2のメールボックス
info@example.com example.com/info/ # infoのメールボックス
ハッシュデータベースを生成する。
postmap /etc/postfix/vmailbox postmap /etc/postfix/virtual
Dovecot設定ファイル
dovecot.conf
dovecot.confはDovecotのメイン設定ファイルであり、使用するプロトコル、待ち受けアドレス、ベースディレクトリ等の基本設定を定義する。
このファイルでは、他の設定ファイルをインクルードする指定も行う。
dovecot/dovecot.confファイルを作成する。
protocols = imap pop3 lmtp # 使用するプロトコル (IMAP、POP3、LMTP)
listen = *, :: # 待ち受けアドレス (* : IPv4全て、:: : IPv6全て)
base_dir = /var/run/dovecot/ # ランタイムファイルのベースディレクトリ
instance_name = dovecot # インスタンス名 (複数のDovecotを区別する場合に使用)
!include conf.d/*.conf # conf.dディレクトリ内の全設定ファイルをインクルード
!include_try local.conf # local.confが存在する場合にインクルード (エラーを無視)
認証設定 (10-auth.conf)
10-auth.confファイルは、Dovecotの認証設定ファイルである。
平文認証の可否、認証メカニズム、パスワードデータベース、ユーザデータベースの設定を定義する。
dovecot/conf.d/10-auth.confファイルを作成する。
disable_plaintext_auth = yes # 平文認証の無効化 (TLS接続時のみ認証を許可)
auth_mechanisms = plain login # 使用する認証メカニズム (PLAIN、LOGIN)
# パスワードデータベースの設定
passdb {
driver = passwd-file # パスワードファイル形式を使用
args = scheme=CRYPT username_format=%u /etc/dovecot/users # パスワードハッシュ方式とファイルパス
}
# ユーザデータベースの設定
userdb {
driver = static # 静的設定を使用 (全ユーザに同じ設定を適用)
args = uid=vmail gid=vmail home=/var/mail/vmail/%u # UID、GID、ホームディレクトリの指定
}
メールボックス設定 (10-mail.conf)
10-mail.confファイルは、メールボックスの保存場所、形式、アクセス権限等を定義する設定ファイルである。
Maildir形式のメールボックス設定と有効なUID / GID範囲を指定する。
dovecot/conf.d/10-mail.confファイルを作成する。
mail_location = maildir:/var/mail/vmail/%u # メールボックスの場所と形式 (Maildir形式)
namespace inbox { # 受信トレイの名前空間設定
inbox = yes # このネームスペースを受信トレイとして使用
}
mail_privileged_group = mail # メールファイルへのアクセスに使用する特権グループ
first_valid_uid = 5000 # 有効な最小UID (これより小さいUIDは拒否)
last_valid_uid = 5000 # 有効な最大UID (これより大きいUIDは拒否)
first_valid_gid = 5000 # 有効な最小GID (これより小さいGIDは拒否)
last_valid_gid = 5000 # 有効な最大GID (これより大きいGIDは拒否)
サービス設定 (10-master.conf)
10-master.confファイルは、Dovecotの各サービスプロセスの動作を制御する設定ファイルである。
認証サービスのソケット設定、IMAP / POP3の待ち受けポート設定、SSL / TLS認証の有効化等を定義する。
dovecot/conf.d/10-master.confファイルを作成して、Postfix用のSASL認証ソケットを設定する。
# 認証サービスの設定
service auth {
# Postfix用のUNIXソケットリスナー
unix_listener /var/spool/postfix/private/auth {
mode = 0666 # ソケットファイルのパーミッション
user = postfix # ソケットの所有ユーザ
group = postfix # ソケットの所有グループ
}
}
# IMAPログインサービスの設定
service imap-login {
inet_listener imap {
port = 0 # 平文IMAPポートを無効化 (0 : 無効)
}
inet_listener imaps {
port = 993 # IMAPS (SSL / TLS) ポート
ssl = yes # SSL / TLSを有効化
}
}
# POP3ログインサービスの設定
service pop3-login {
inet_listener pop3 {
port = 0 # 平文POP3ポートを無効化 (0 : 無効)
}
inet_listener pop3s {
port = 995 # POP3S (SSL / TLS) ポート
ssl = yes # SSL / TLSを有効化
}
}
SSL/TLS設定 (10-ssl.conf)
10-ssl.confファイルは、SSL / TLS暗号化通信の設定ファイルである。
証明書と秘密鍵のパス、使用するTLSプロトコルバージョン、暗号化方式、Diffie-Hellmanパラメータ等を定義する。
dovecot/conf.d/10-ssl.confファイルを作成する。
ssl = required # SSL / TLSを必須化 (required : 必須、yes : 任意)
ssl_cert = </etc/ssl/certs/mail/mail.crt # サーバ証明書ファイルのパス (<は内容を読み込む)
ssl_key = </etc/ssl/certs/mail/mail.key # 秘密鍵ファイルのパス (<は内容を読み込む)
ssl_min_protocol = TLSv1.2 # 使用する最小TLSプロトコルバージョン
ssl_cipher_list = HIGH:!aNULL:!MD5 # 使用する暗号化方式 (HIGH : 高強度、!で除外指定)
ssl_prefer_server_ciphers = yes # サーバ側の暗号化方式優先順位を使用
ssl_dh = </etc/dovecot/dh.pem # Diffie-Hellmanパラメータファイルのパス
SSL / TLS証明書
自己署名証明書の作成
テスト環境用に自己署名証明書を作成する例を以下に示す。
mkdir -p ./certs
openssl req -x509 -nodes -days 365 -newkey rsa:4096 \ -keyout ./certs/mail.key \ -out ./certs/mail.crt \ -subj "/C=JP/ST=Tokyo/L=Tokyo/O=MyCompany/CN=mail.example.com"
chmod 600 ./certs/mail.key chmod 644 ./certs/mail.crt
Diffie-Hellmanパラメータの生成
Dovecotで使用するDHパラメータを生成する。
openssl dhparam -out ./dovecot/dh.pem 2048
Let's Encrypt証明書の使用
本番環境では、Let's Encryptを使用した正規の証明書を取得することを推奨する。
certbot certonly --standalone -d mail.example.com
# 証明書をコピー cp /etc/letsencrypt/live/mail.example.com/fullchain.pem ./certs/mail.crt cp /etc/letsencrypt/live/mail.example.com/privkey.pem ./certs/mail.key
ユーザ管理
ユーザの追加
Dovecotのusersファイルにユーザを追加する。
パスワードハッシュは、doveadm コマンドで生成する。
# コンテナ内でパスワードハッシュを生成
podman exec -it mailserver doveadm pw -s SHA512-CRYPT
# Enter new password: (パスワードを入力)
# Retype new password: (パスワードを再入力)
# {SHA512-CRYPT}$6$...
dovecot/usersファイルに生成したハッシュを追加する。
user1@example.com:{SHA512-CRYPT}$6$...
user2@example.com:{SHA512-CRYPT}$6$...
info@example.com:{SHA512-CRYPT}$6$...
メールボックスディレクトリの作成
ユーザごとのメールボックスディレクトリを作成する。
mkdir -p ./vmail/example.com/user1 mkdir -p ./vmail/example.com/user2 mkdir -p ./vmail/example.com/info chown -R 5000:5000 ./vmail
ユーザの削除
usersファイルから該当行を削除して、メールボックスディレクトリを削除する。
# usersファイルから削除 sed -i '/user1@example.com/d' dovecot/users # メールボックスディレクトリを削除 rm -rf ./vmail/example.com/user1
メールの送受信
SMTP接続テスト
telnetコマンドを使用してSMTP接続をテストする。
telnet mail.example.com 25
以下に示すコマンドを順に入力する。
EHLO test.local MAIL FROM:<sender@example.com> RCPT TO:<user1@example.com> DATA Subject: Test Mail This is a test message. . QUIT
SMTP Submission接続テスト (認証付き)
opensslコマンドを使用してSMTP Submissionポートへの接続をテストする。
openssl s_client -connect mail.example.com:587 -starttls smtp
接続後、以下に示すコマンドを入力する。
EHLO test.local AUTH LOGIN # Base64エンコードされたユーザ名とパスワードを入力
Base64エンコードは以下に示すコマンドで生成する。
echo -n 'user1@example.com' | base64 echo -n 'password' | base64
IMAP接続テスト
opensslコマンドを使用してIMAPS接続をテストする。
openssl s_client -connect mail.example.com:993
接続後、以下に示すコマンドを入力する。
a001 LOGIN user1@example.com password a002 LIST "" "*" a003 SELECT INBOX a004 LOGOUT
POP3接続テスト
opensslコマンドを使用してPOP3S接続をテストする。
openssl s_client -connect mail.example.com:995 # 接続後、以下のコマンドを入力 USER user1@example.com PASS password LIST RETR 1 QUIT
メールクライアントでの接続テスト
ThunderbirdやOutlook等どのメールクライアントで接続する場合の設定を以下に示す。
| 項目 | 受信サーバ (IMAP) | 送信サーバ (SMTP) |
|---|---|---|
| サーバ名 | mail.example.com | mail.example.com |
| ポート番号 | 993 | 587 |
| セキュリティ | SSL / TLS | STARTTLS |
| 認証方式 | 通常のパスワード認証 | 通常のパスワード認証 |
| ユーザー名 | user1@example.com | user1@example.com |
ログの管理
Postfixログの確認
Postfixのログをリアルタイムで確認する。
podman exec mailserver tail -f /var/log/mail.log # または podman exec mailserver tail -f /var/log/syslog | grep postfix
特定のメールアドレスに関連するログを検索する。
podman exec mailserver grep "user1@example.com" /var/log/mail.log
Dovecotログの確認
Dovecotのログをリアルタイムで確認する。
podman exec mailserver tail -f /var/log/mail.log | grep dovecot
認証失敗のログを確認する。
podman exec mailserver grep "auth failed" /var/log/mail.log
コンテナログの確認
podman logsコマンドでコンテナ全体のログを確認する。
podman logs -f mailserver # 最新100行のみ表示 podman logs --tail 100 mailserver # タイムスタンプ付きで表示 podman logs -t mailserver
ログのローテーション設定
ログファイルが肥大化しないように、logrotateを設定する。
- /etc/logrotate.d/mailserver ファイルの例
/path/to/logs/mail.log { daily rotate 30 compress delaycompress notifempty create 0640 syslog adm sharedscripts postrotate podman exec mailserver postfix reload podman exec mailserver doveadm reload endscript }
メールキューの管理
キュー内のメール一覧表示
キューに滞留しているメールを確認する。
podman exec mailserver postqueue -p
特定のメールをキューから削除
キューIDを指定してメールを削除する。
podman exec mailserver postsuper -d <キューID>
全てのメールをキューから削除する。
podman exec mailserver postsuper -d ALL
キューの再送信
キューに滞留しているメールを強制的に再送信する。
podman exec mailserver postqueue -f
保留中のメールの確認
保留 (hold) 状態のメールを確認する。
podman exec mailserver postqueue -p | grep -A 2 "^[A-F0-9]*\*"
セキュリティ設定
SPFレコードの設定
DNSにSPFレコードを追加して、送信元の正当性を検証する。
example.com. IN TXT "v=spf1 ip4:203.0.113.10 ~all"
DKIMの設定
OpenDKIMを使用してメールに電子署名を付与する。
これは、OpenDKIMをコンテナに追加する。
# OpenDKIMのインストール apt install -y opendkim opendkim-tools # 鍵の生成 mkdir -p /etc/opendkim/keys/example.com opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s mail # DNSにTXTレコードを追加 cat /etc/opendkim/keys/example.com/mail.txt
DMARCレコードの設定
DNSにDMARCレコードを追加して、SPFとDKIMの検証結果を管理する。
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
接続制限の設定
Postfixで接続数とレート制限を設定する。
これは、main.cfに以下に示す設定を追加する。
# 接続数制限
smtpd_client_connection_count_limit = 10
smtpd_client_connection_rate_limit = 30
# メッセージサイズ制限
message_size_limit = 10240000
mailbox_size_limit = 102400000
# レシピエント制限
smtpd_recipient_limit = 100
アクセス制御リストの設定
特定のIPアドレスやドメインからのアクセスを制御する。
postfix/accessファイルを作成する。
# 許可するIPアドレス 192.168.1.0/24 OK 10.0.0.0/8 OK # 拒否するドメイン spam-domain.com REJECT bad-sender.net REJECT
ハッシュデータベースを生成して、main.cfに設定を追加する。
postmap /etc/postfix/access
main.cfに追加する設定を以下に示す。
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/access,
permit_mynetworks,
reject_unknown_client_hostname
スパムフィルタの設定
SpamAssassinを使用して、スパムメールをフィルタリングする。
SpamAssassinのインストール
コンテナ内にSpamAssassinをインストールする。
apt install -y spamassassin spamc
SpamAssassinの設定
/etc/default/spamassassinファイルを編集して、SpamAssassinを有効化する。
ENABLED=1
SPAMD_HOME="/var/lib/spamassassin/"
OPTIONS="--create-prefs --max-children 5 --username spamd --helper-home-dir ${SPAMD_HOME} -s ${SPAMD_HOME}spamd.log"
Postfixとの連携
master.cfにSpamAssassinの設定を追加する。
smtp inet n - y - - smtpd
-o content_filter=spamassassin
spamassassin unix - n n - - pipe
user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
バックアップと復元
メールボックスのバックアップ
vmailディレクトリをtarで圧縮してバックアップする。
tar Jcf mailbox-backup-$(date +%Y%m%d).tar.xz -C ./vmail .
設定ファイルのバックアップ
設定ファイルをまとめてバックアップする。
tar Jcf config-backup-$(date +%Y%m%d).tar.xz postfix/ dovecot/ certs/
メールボックスの復元
バックアップからメールボックスを復元する。
tar xf mailbox-backup-20250107.tar.xz -C ./vmail chown -R 5000:5000 ./vmail
定期バックアップスクリプト
Cronで定期的にバックアップを実行することもできる。
#!/usr/bin/env sh
BACKUP_DIR="/backup/mailserver"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p ${BACKUP_DIR}
# メールボックスのバックアップ
tar Jcf ${BACKUP_DIR}/vmail-${DATE}.tar.xz -C /path/to/vmail .
# 設定ファイルのバックアップ
tar Jcf ${BACKUP_DIR}/config-${DATE}.tar.xz postfix/ dovecot/ certs/
# 古いバックアップの削除 (30日以上前)
find ${BACKUP_DIR} -name "*.tar.gz" -mtime +30 -delete
パフォーマンスチューニング
Postfixの同時接続数設定
main.cfファイルを編集して、同時接続数を調整する。
# デフォルトのプロセス数
default_process_limit = 100
# SMTPデーモンのプロセス数
smtpd_client_connection_count_limit = 50
# 配信プロセスの数
maximal_queue_lifetime = 5d
bounce_queue_lifetime = 5d
Dovecotのプロセス数設定
10-master.confファイルを編集して、プロセス数を調整する。
service imap-login {
process_min_avail = 4
process_limit = 100
}
service pop3-login {
process_min_avail = 2
process_limit = 50
}
service auth {
process_limit = 100
}
メールボックスキャッシュの設定
Dovecotのキャッシュ設定を最適化する。
これは、10-mail.confファイルに設定を追加する。
mail_cache_min_mail_count = 10
mailbox_list_index = yes
mail_location = maildir:/var/mail/vmail/%u:LAYOUT=fs
ディスクI/O最適化
メールボックスのディスクI/Oを最適化する。
# Postfixのキュー配置最適化
queue_directory = /var/spool/postfix
# Dovecotのインデックスファイル配置
mail_location = maildir:/var/mail/vmail/%u:INDEX=/var/indexes/%u
トラブルシューティング
コンテナが起動しない
設定ファイルの構文エラーを確認する。
# Postfixの設定確認 podman exec mailserver postfix check # Dovecotの設定確認 podman exec mailserver doveconf -n # コンテナログの確認 podman logs mailserver
メール送信ができない
SMTP接続とSASL認証を確認する。
# SMTP接続テスト telnet mail.example.com 25 # SASL認証機構の確認 podman exec mailserver postconf -n | grep sasl # Dovecot認証ソケットの確認 podman exec mailserver ls -la /var/spool/postfix/private/auth
メール受信ができない
メールボックスのパーミッションとDovecotの設定を確認する。
# メールボックスのパーミッション確認 ls -la ./vmail # Dovecotのユーザー設定確認 podman exec mailserver doveadm user user1@example.com # Dovecotログの確認 podman exec mailserver grep dovecot /var/log/mail.log
認証エラー
ユーザ設定とパスワードハッシュを確認する。
# usersファイルの確認 cat dovecot/users # パスワードハッシュの再生成 podman exec -it mailserver doveadm pw -s SHA512-CRYPT # 認証テスト podman exec mailserver doveadm auth test user1@example.com
TLS/SSL接続エラー
証明書とTLS設定を確認する。
# 証明書の有効性確認 openssl x509 -in ./certs/mail.crt -text -noout # TLS接続テスト openssl s_client -connect mail.example.com:587 -starttls smtp # Postfixの証明書設定確認 podman exec mailserver postconf | grep tls
メールキューの滞留
キューに滞留しているメールの原因を調査する。
# キューの状態確認 podman exec mailserver postqueue -p # 特定のメールの詳細確認 podman exec mailserver postcat -q <キューID> # ログでエラーを確認 podman exec mailserver grep "status=deferred" /var/log/mail.log
ポート番号の競合
他のサービスとポート番号が競合している場合、別のポートを使用する。
# 使用中のポート確認 netstat -tuln | grep -E ':(25|587|993|995)' # 別ポートで起動 podman run -d --name mailserver -p 0.0.0.0:2525:25 -p 0.0.0.0:2587:587 mailserver:custom
ファイヤーウォールの設定
同一ネットワーク上の外部PCからアクセスする場合は、ファイヤーウォールのポート開放を行う。
Linux
# Firewalldを使用している場合 sudo firewall-cmd --permanent --add-service=smtp sudo firewall-cmd --permanent --add-service=smtp-submission sudo firewall-cmd --permanent --add-service=imaps sudo firewall-cmd --permanent --add-service=pop3s sudo firewall-cmd --reload # またはポート番号で指定 sudo firewall-cmd --permanent --add-port=25/tcp sudo firewall-cmd --permanent --add-port=587/tcp sudo firewall-cmd --permanent --add-port=993/tcp sudo firewall-cmd --permanent --add-port=995/tcp sudo firewall-cmd --reload # UFWを使用している場合 sudo ufw allow 25/tcp sudo ufw allow 587/tcp sudo ufw allow 993/tcp sudo ufw allow 995/tcp
Windows 11
PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。
SMTPポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail SMTP" -Direction Inbound -Protocol TCP -LocalPort 25 -Action Allow
SMTP Submissionポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail SMTP Submission" -Direction Inbound -Protocol TCP -LocalPort 587 -Action Allow
IMAPSポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail IMAPS" -Direction Inbound -Protocol TCP -LocalPort 993 -Action Allow
POP3Sポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail POP3S" -Direction Inbound -Protocol TCP -LocalPort 995 -Action Allow
正常にポート開放が行われているかどうかを確認する場合、別PCからPowerShellを起動して、以下に示すコマンドを実行する。
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 25 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 587 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 993 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 995
ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。
Remove-NetFirewallRule -DisplayName "Mail SMTP" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail SMTP Submission" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail IMAPS" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail POP3S" -ErrorAction SilentlyContinue
Windows 10
PowerShellを管理者権限で起動して、以下に示すコマンドを実行する。
SMTPポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail SMTP" -Direction Inbound -Protocol TCP -LocalPort 25 -Action Allow
SMTP Submissionポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail SMTP Submission" -Direction Inbound -Protocol TCP -LocalPort 587 -Action Allow
IMAPSポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail IMAPS" -Direction Inbound -Protocol TCP -LocalPort 993 -Action Allow
POP3Sポートの受信ルールを追加する。
New-NetFirewallRule -DisplayName "Mail POP3S" -Direction Inbound -Protocol TCP -LocalPort 995 -Action Allow
正常にポート開放が行われているかどうかを確認する場合、別のPCからPowerShellを起動して、以下に示すコマンドを実行する。
Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 25 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 587 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 993 Test-NetConnection -ComputerName <Windows PCのIPアドレス> -Port 995
ファイアウォールルールを削除する場合は、以下に示すコマンドを実行する。
Remove-NetFirewallRule -DisplayName "Mail SMTP" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail SMTP Submission" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail IMAPS" -ErrorAction SilentlyContinue Remove-NetFirewallRule -DisplayName "Mail POP3S" -ErrorAction SilentlyContinue