コンテンツにスキップ

IMAP・Dovecot・Maildir

DovecotはLMTPで受け取ったメールをMaildirへ保存し、認証済みユーザーへ同じメールボックスをIMAPで提供する。


IMAPは、メールをサーバー上に置いたまま一覧取得、本文取得、検索、既読フラグ、フォルダー操作を行うプロトコルである。複数のクライアントから接続しても、既読状態やフォルダー構成をサーバー側で共有できる。

IMAPによるメールの閲覧と、SMTPによるメールの送信は別の通信である。DovecotへIMAPログインできても、それだけでPostfixからメールを送信できるわけではない。メール送信ではPostfixのSubmissionへ接続し、SMTP AUTHを行う。


この構成でDovecotは次の3つを担当する。

メールクライアントからIMAP接続を受け、ユーザーのメールボックスを読み書きする。平文IMAPはTCP 143、Implicit TLSを使うIMAPSはTCP 993で待ち受ける。

PostfixからUNIXドメインソケット経由でメールを受け取り、受信者のMaildirへ保存する。LMTP配送ではパスワードを使わず、Dovecotのuserdbで受信者のUID、GID、ホームディレクトリを検索する。

IMAPログインの資格情報を検証する。SMTP AUTHを構成した場合は、PostfixからUNIXドメインソケットで受け取った認証要求も検証する。認証結果だけをPostfixへ返し、SMTPメッセージ自体はこの認証ソケットを通らない。


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は、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へローカル配送する構成で使用する。


Debian 13のDovecotは2.4系であり、設定ファイルの最初の設定をdovecot_config_versionにする必要がある。dovecot_storage_versionはDovecotが作る保存データ形式の互換性基準を指定する。新しい構成ではどちらも2.4.0とする。

dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0

Dovecot 2.3以前のmail_location = maildir:~/Maildirに相当する設定は、2.4では次の2つに分かれている。

mail_driver = maildir
mail_path = ~/Maildir

TLS証明書の設定も、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、メール設定を確認する。認証成功とメールボックスの所有者情報は別々に確認する。