自宅であればこれでもなんら問題は無いわけですが、たまにローカルフォルダに移動させたメールを外出先で確認したいときに都合が悪い構成となっていたため、なんとかしたいな、でもGmail一本にはあまりまとめたくないな、と考えていました。
もちろんGmail以外のIMAPサーバーにメールを保存する方法も考えましたが、容量や保存期間の問題があり、せっかく自宅のHyper-V仮想マシン上でpodmanが動いているのだし、そこにストアを作ってしまえば良いのではないか、と考え、早速作ってみることにしましたが、Thunderbirdの問題なのかDovecotの問題なのか分からない現象にややハマったので、ここにまとめておきます。
色々選択肢はあると思いますが、今回は実績や更新頻度を考えて、DovecotとRoundcubeを利用することにしました。
要件としてはこんな感じです。
IMAPのメールストアだけがあればよく、PostfixなどのMTAは要らない 一人だけがアクセスできればよいので、MySQLやPostgreSQLなども使わない 自宅ではThunderbirdでDovecotにアクセスするので、Roundcubeにはアクセスしない (このエントリーには含まれません)外部からRoundcubeへは、nginxのリバースプロキシでアクセスする
公式でdockerのレシピも公開しているしサクサクいけるだろう、と思っていたのですが、何故かThunderbirdで日本語を上手く取り扱えない問題に遭遇しました。
結局それが設定を含めたDovecot・Thunderbird・podmanのどこに問題があるのかは分かりませんでしたが、Dovecotのデフォルト文字コードをUTF-8からmUTF-7に変更することにより、回避しました。
注:このエントリーはDovecot 2.4.2、Roundcube 1.6.12の環境で構築した際の情報を元に記述しています。
まずはdocker-compose.ymlです。内部向けではありますが、IPアドレスやポート番号は伏せていますのでご了承ください。
docker-compose.yml:
—
services:
—
dovecot:
image: dovecot/dovecot:latest
container_name: dovecot
hostname: <ホスト名またはIP>
volumes:
- ./dovecot/data/vmail:/srv/vmail
- ./dovecot/config/90-mailloc.conf:/etc/dovecot/conf.d/90-mailloc.conf:ro
ports:
- <IMAPサーバーポート番号>:31143
environment:
- USER_PASSWORD=<ユーザーパスワード>
roundcubemail:
image: roundcube/roundcubemail:latest-nonroot
container_name: roundcubemail
volumes:
- ./roundcubemail/www:/var/www/html
- ./roundcubemail/db:/var/roundcube/db
- ./roundcubemail/data/nonroot-custom-php-config.ini:/usr/local/etc/php/conf.d/zzz-nonroot-custom-php-config.ini:ro
ports:
- <Roundcubeポート番号>:8000
environment:
- ROUNDCUBEMAIL_REQUEST_PATH=/<リバースプロキシでアクセスするパス>
- ROUNDCUBEMAIL_DB_TYPE=sqlite
- ROUNDCUBEMAIL_SKIN=elastic
- ROUNDCUBEMAIL_DEFAULT_HOST=<上のdovecot - hostnameで指定したホスト名またはIP>
- ROUNDCUBEMAIL_DEFAULT_PORT=<上のdovecot - portsで指定したIMAPサーバーポート番号>
- ROUNDCUBEMAIL_SMTP_SERVER=<MTAのIPアドレス(今回は使わないので適当)>
- ROUNDCUBEMAIL_SMTP_PORT=<MTAのポート番号(今回は使わないので適当)>
Dovecotはnon-root版なので、公式のドキュメントに従ってIMAPのコンテナ内部ポートは31143になります。volumesにはメールストアに加えて、mUTF7で動作させるための構成ファイルへのパスが追加されています。
Roundcube側の設定はDocker hubにありますが、データストアがSQLite、リバースプロキシ関連の設定を追加し、最大アップロードサイズ変更のためのコンフィグファイルを追加しています。
docker-compose.ymlを書いたら、volumesで設定するパーシステントボリュームを作成していきます。
ここではパーミッションやオーナーの設定は割愛していますが、適切なパーミッションあるいはオーナーに設定しておく必要があることに注意が必要です。
—
mkdir -p ./dovecot/data/vmail
—
mkdir -p ./dovecot/config/
mkdir -p ./roundcubemail/www
mkdir -p ./roundcubemail/db
mkdir -p ./roundcubemail/data
最後にDovecotとRoundcubeの追加コンフィグファイルを作成して配置します。
Dovecotのメールストアはsingle-dbox(多分mailbox_list_layoutは要らないと思いますが一応指定)でmUTF7を使用するように変更します。(詳細は公式のドキュメントを参照してください)
もしかしたらMaildirなどでも問題ないのかもしれませんが、当方の環境では上手くいきませんでした。
./dovecot/config/90-mailloc.conf:
—
mail_driver = sdbox
—
mailbox_list_layout = fs
mail_utf8_extensions = no
mailbox_list_utf8 = no
Roundcube側は、PHPのパラメーターを変更するようにします。
./roundcubemail/data/nonroot-custom-php-config.ini:
—
post_max_size=1024M
—
upload_max_filesize=1024M
あとはdocker-compose buildまたはpodman-compose buildしてエラーがなくビルドできれば、docker-compose up -dまたはpodman-compose up -dでコンテナを起動すればOKのはずです。必要に応じて、Dovecotのパーシステントボリュームを定期的にバックアップするcronジョブを追加したりするとなお安心でしょう。
複数ユーザーが個別のメールストアにアクセスしたり、MTAを使用したい場合には色々設定や別のコンテナを追加する必要が出てきますが、当方の用途ではこれで十分のため、満足の得られる結果となりました。
“podman+Dovecot+Roundcubeで自分専用メールストアを作る” に対するコメントはありません。