Cyrus IMAPdからDovecotへ移行

作業メモ。

環境

  • 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_certssl_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_hostsmtp_hostの定義を書き換える。書き換えのポイントは次の3点。

  • スキームを追加
  • localhostではなくホスト名を指定
  • smtp_auth_typeLOGINを指定
$config['imap_host'] = 'ssl://mail.server.jp:993';
$config['smtp_host'] = 'tls://mail.server.jp:587';
$config['smtp_auth_type'] = 'LOGIN';

localhost:993localhost: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。

参考

タイトルとURLをコピーしました