IMAP・Dovecot・Maildir
DovecotはLMTPで受け取ったメールをMaildirへ保存し、認証済みユーザーへ同じメールボックスをIMAPで提供する。
IMAPが提供するもの
Section titled “IMAPが提供するもの”IMAPは、メールをサーバー上に置いたまま一覧取得、本文取得、検索、既読フラグ、フォルダー操作を行うプロトコルである。複数のクライアントから接続しても、既読状態やフォルダー構成をサーバー側で共有できる。
IMAPによるメールの閲覧と、SMTPによるメールの送信は別の通信である。DovecotへIMAPログインできても、それだけでPostfixからメールを送信できるわけではない。メール送信ではPostfixのSubmissionへ接続し、SMTP AUTHを行う。
Dovecotの役割
Section titled “Dovecotの役割”この構成でDovecotは次の3つを担当する。
IMAPサービス
Section titled “IMAPサービス”メールクライアントからIMAP接続を受け、ユーザーのメールボックスを読み書きする。平文IMAPはTCP 143、Implicit TLSを使うIMAPSはTCP 993で待ち受ける。
LMTPサービス
Section titled “LMTPサービス”PostfixからUNIXドメインソケット経由でメールを受け取り、受信者のMaildirへ保存する。LMTP配送ではパスワードを使わず、Dovecotのuserdbで受信者のUID、GID、ホームディレクトリを検索する。
認証サービス
Section titled “認証サービス”IMAPログインの資格情報を検証する。SMTP AUTHを構成した場合は、PostfixからUNIXドメインソケットで受け取った認証要求も検証する。認証結果だけをPostfixへ返し、SMTPメッセージ自体はこの認証ソケットを通らない。
passdbとuserdb
Section titled “passdbとuserdb”Dovecotは認証とユーザー属性の取得を分けている。
passdb pam {}は、提示されたユーザー名とパスワードをPAMへ渡して正しいか検証する。LinuxアカウントのパスワードはIMAPのログインに使われ、SMTP AUTHを構成した場合はその認証にも使われる。passdb ldap {}を使うと、DovecotがLDAP検索と認証Bindを直接行う。
userdb passwd {}はNSSを通してシステムユーザーを検索し、メールボックスへアクセスするためのUID、GID、ホームディレクトリを得る。userdb ldap {}では同じ3項目をLDAP属性から取得する。LMTPは配送時にユーザーのパスワードを受け取らないため、passdbだけでは配送先ディレクトリを決められない。
auth_username_format = %{user | username}は、alice@example.comのようなログイン名からドメイン部分を取り除き、システムユーザーaliceとしてPAMとpasswdを検索する。aliceだけでログインした場合も結果はaliceになる。
この変換はドメイン名を検証しない。alice@wrong.exampleもaliceへ変換されるため、1つのメールドメインとLinuxユーザーを単純に対応させる構成で使用する。複数ドメインを区別する構成では、ドメインを保持したユーザー名と、それを検索できるuserdb・passdbを設計する。
Maildir
Section titled “Maildir”Maildirは、1通のメールを1つのファイルとしてディレクトリへ保存するメールボックス形式である。この構成では各ユーザーの~/Maildirを使用する。
/home/alice/Maildir/ ├─ tmp/ ├─ new/ ├─ cur/ ├─ .Sent/ └─ .Trash/tmpは書き込み途中の一時ファイル、newは未読として新しく配送されたメール、curはIMAPなどで処理され、状態フラグを持つメールを格納する。.Sentや.Trashのように.で始まるディレクトリは、Maildir++レイアウトの追加メールボックスである。
Dovecot 2.4では、mail_driver = maildirで保存形式を選び、mail_path = ~/Maildirでメールボックスのパスを指定する。LMTPの保存先とIMAPの参照先がこの2つの設定で一致するため、配送されたメールをIMAPですぐに参照できる。
namespace inboxは、クライアントに見せるメールボックスの名前空間を定義し、inbox = yesでその名前空間のINBOXを利用者の受信箱として扱う。Maildir上のパスと、IMAPクライアントが扱うINBOXやフォルダー名を対応付ける設定である。
PostfixとDovecotのUNIXドメインソケット
Section titled “PostfixとDovecotのUNIXドメインソケット”flowchart TD
P["Postfix"]
A["Dovecot Auth"]
L["Dovecot LMTP"]
PASS["PAMまたはLDAP passdb"]
USER["passwd / NSSまたはLDAP userdb"]
M["~/Maildir"]
P -.->|"SMTP AUTHを使う場合の資格情報"| A
A -->|"パスワード検証"| PASS
P -->|"配送するメッセージ"| L
L -->|"UID・GID・homeを検索"| USER
L -->|"メールを保存"| M
/var/spool/postfix/private/authはSMTP AUTHを使う構成で作る認証用ソケットである。Dovecotのservice authが作成し、所有者とグループをpostfix、モードを0660にすることでPostfixから接続できるようにする。Postfixのsmtpd_sasl_path = private/authは、このソケットをqueue directoryからの相対パスで指定する。SMTP AUTHを使わない構成では、このソケットをPostfixへ公開しない。
/var/spool/postfix/private/dovecot-lmtpは配送用ソケットである。Dovecotのservice lmtpが作成し、Postfixのmailbox_transportが接続する。SMTP AUTHの有無にかかわらず、Dovecot LMTPへローカル配送する構成で使用する。
Dovecot 2.4の設定形式
Section titled “Dovecot 2.4の設定形式”Debian 13のDovecotは2.4系であり、設定ファイルの最初の設定をdovecot_config_versionにする必要がある。dovecot_storage_versionはDovecotが作る保存データ形式の互換性基準を指定する。新しい構成ではどちらも2.4.0とする。
dovecot_config_version = 2.4.0dovecot_storage_version = 2.4.0Dovecot 2.3以前のmail_location = maildir:~/Maildirに相当する設定は、2.4では次の2つに分かれている。
mail_driver = maildirmail_path = ~/MaildirTLS証明書の設定も、2.4ではssl_server_cert_fileとssl_server_key_fileを使用する。ssl_certやssl_keyは2.3系の設定名である。
doveconf -nは既定値から変更された有効設定を表示する。分割設定ファイルを目視するだけでは、後から読み込まれた設定による上書きを判断できないため、最終的な設定はdoveconf -nで確認する。
doveadm auth test aliceはpassdbによるパスワード認証を確認する。doveadm user aliceはuserdbが返すUID、GID、home、メール設定を確認する。認証成功とメールボックスの所有者情報は別々に確認する。