作業メモ。
環境
- FreeBSD 14.1
- Postfix 3.9.0
- Dovecot 2.3.21
- Dovecot Pigeonhole 0.5.21
- Roundcube 1.6.8
背景
Cyrus IMAPdのsieveでは、事実上、日本語フォルダ名が使えない。一応、IMAP UTF-7形式にデコードされた形で指定すれば使えるけれども、可読性が低すぎる。
その点、Dovecotのsieveではきちんと日本語フォルダ名も扱えるという話なので、移行してしまうことにした。
- IMAP4のみ利用。POP3は使わない
- AUTHはDovecotのSASL AUTHを使用し、Postfixとも共有する
- とりあえずDBは使わない
- ユーザ認証にはシステムパスワードを使用する
インストール
Dovecot
portsからインストール。
# sudo portmaster mail/dovecot
設定例のファイルをコピー。
# cd /usr/local/etc/dovecot
# sudo cp example-config/dovecot.conf .
# sudo cp -r example-config/conf.d .
Dovecot Pigeonhole
portsからインストール。
# sudo portmaster mail/dovecot-pigeonhole
設定
dovecot.conf
/usr/local/etc/dovecot/dovecot.conf
を編集してprotocols
の設定値を書き換え、protocol lda
を追加する。
protocols = imap lmtp sieve
10-ssl.conf
/usr/local/etc/dovecot/conf.d/10-ssl.conf
を編集し、ssl_cert
とssl_key
に証明書と認証キーを指定する。
ssl_cert = </etc/letsencrypt/live/mydomain.name/fullchain.pem
ssl_key = </etc/letsencrypt/live/mydomain.name/privkey.pem
パスの前の<
は重要。これを忘れると、証明書が読み込まれない。
証明書の所有権もcyrusからdovecotに変更しておく。
# sudo chown -R dovecot:dovecot /etc/letsencrypt
10-mail.conf
/usr/local/etc/dovecot/conf.d/10-mail.conf
を編集し、次の行を追加してメール格納形式を指定する。
mail_location = maildir:~/Maildir
10-auth.conf
/usr/local/etc/dovecot/conf.d/10-auth.conf
を編集し、次のようにauth_mechanisms
の設定を追加する。
auth_mechanisms = plain login
さらにauth_username_format
の設定を追加する。これは宛て先からドメイン部分を削除する設定。これを入れておかないと、「User does not exist: uid@domain」のようなエラーが出てしまう。
auth_username_format = %Ln
10-master.conf
/usr/local/etc/dovecot/conf.d/10-master.conf
を編集し、次のようにservice auth
ブロック内にsmtp-authの設定を追加する。また、ブロックの外側にauth_mechanisms
の設定を追加する。
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
(略)
}
auth_mechanisms = plain login
service lmtp
ブロック内に、次のようにLMTPソケットの設定を追加する。
service lmtp {
unix_listener lmtp {
mode = 0600
user = postfix
group = postfix
}
}
15-lda.conf
/usr/local/etc/dovecot/conf.d/15-lda.conf
を編集し、次のようにsieveの設定を追加する。
protocol lda {
mail_plugins = $mail_plugins sieve
}
20-lmtp.conf
/usr/local/etc/dovecot/conf.d/20-lmtp.conf
を編集し、次のようにsieveの設定を追加する。
protocol lmtp {
mail_plugins = $mail_plugins sieve
}
20-imap.conf
/usr/local/etc/dovecot/conf.d/20-imap.conf
を編集し、次のようにsieveの設定を追加する。
protocol imaps {
mail_plugins = $mail_plugins imap_sieve
}
90-plugin.conf
/usr/local/etc/dovecot/conf.d/90-plugin.confを編集し、次のようにsieveの設定を追加する。
mail_attribute_dict = file:%h/Maildir/dovecot-attributes
service managesieve-login {
inet_listener sieve {
port = 4190
}
}
service managesieve {
}
protocol sieve {
}
plugin {
recipient_delimiter = +
sieve_plugins = sieve_imapsieve
imapsieve_url = sieve://localhost
sieve_extensions = +editheader
sieve = file:~/sieve;active=~/.dovecot.sieve
}
/etc/pam.d/dovecot
次の内容で作成。
auth required pam_unix.so no_warn try_first_pass
account required pam_unix.so
/usr/local/etc/postfix/main.cf
/usr/local/etc/postfix/main.cf
を編集し、lmtpの設定を次のように書き換える。
mailbox_transport = lmtp:unix:/var/run/dovecot/lmtp
fallback_transport = lmtp:unix:/var/run/dovecot/lmtp
SASL AUTHにDovecotを利用する設定を追加。
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
Roundcube: config.inc.php
Roundcubeのconfig/config.inc.php
を編集し、imap_host
とsmtp_host
の定義を書き換える。書き換えのポイントは次の3点。
- スキームを追加
localhost
ではなくホスト名を指定smtp_auth_type
にLOGIN
を指定
$config['imap_host'] = 'ssl://mail.server.jp:993';
$config['smtp_host'] = 'tls://mail.server.jp:587';
$config['smtp_auth_type'] = 'LOGIN';
localhost:993
やlocalhost:587
のままだと、次のようなエラーが出るため。
IMAP Error: Login failed for user2 against localhost from 111.112.113.114. Empty startup greeting (localhost:993)
rc.conf
/etc/rc.conf
に次の記述を追加。
dovecot_enable="YES"
サーバーを起動。
# sudo service postfix restart
# sudo service dovecot start
データ移行
mbsyncインストール
mbsyncを使った。
昔はCyrus IMAPdからの移行ツールをDovecotで用意していたらしいが、現在はマニュアルから記載が消えている。需要がないのか、Pro版でしか対応するつもりがないのかは不明。
別のサーバからの移行なら、imapsyncでもいいと思う。
portsからインストール。
# sudo portmaster mail/isync
パッケージ名がisyncなのは、プロジェクト名がisyncだから。mbsync
はコマンド名。
.mbsyncrc
データを移行するユーザごとに~/.mbsyncrc
を作成する。
IMAPAccount cyrus
Host imap.server.jp
User username
Pass password
SSLType IMAPS
AuthMechs LOGIN
IMAPStore cyrus-imap
Account cyrus
MaildirStore dovecot-maildir
Inbox ~/Maildir
SubFolders Maildir++
Channel cyrus
Far :cyrus-imap:
Near :dovecot-maildir:
Create Both
SyncState *
Patterns *
usernameとpasswordの部分には、実際のユーザ名とパスワードを指定する。
データ移行
ユーザごとにログインし、mbsync
コマンドを実行してデータコピー。
# mbsync -a
なぜかメールボックスの名称が、すべて先頭にピリオドを付加されていたので、取り除く。
# cat << EOF > ~/rmexperiod
#!/bin/bash
while read -r mboxname; do
if [[ $mboxname =~ ^\.\. ]]; then
new_mboxname=${mboxname#.}
mv "$mboxname" "$new_mboxname"
echo "Renamed $mboxname to $new_mboxname"
fi
done
EOF
# chmod a+x ~/rmexperiod
# cd ~/Maildir
# ls -ld1 '..'* | ~/rmexperiod
# rm ~/rmexperiod
取り込んだメールを、doveadm
でインポートする。
# sudo doveadm import -u username maildir:/home/username/Maildir "" all
インポートしたフォルダを購読状態にする。
# sudo doveadm mailbox subscribe -u username `sudo doveadm mailbox list -u username`
きちんとインポートできていることを確認。
# sudo doveadm mailbox list -s -u username
インポートしたフォルダ名が一覧表示されていればOK。
参考
- Dovecot manual
- Dovecot (公式サイト)
- isync (mbsync公式サイト)
- Roundcube Settings Reference Guide
- IMAPSIEVE with dovecot and user scripts