user icon

Dovecotで共有フォルダ

Dovecotで、他人と同じメールフォルダを共有する設定を追加してみます。
ユーザのいないフォルダを全員で共有するケースと、個人のフォルダを誰かに共有するケースの2つを設定してみます。

1. パブリック共有のケース

こちらはユーザのフォルダを他ユーザに見せるのではなく、全員が見れるような共有フォルダを作成します。
まずは、誰でもメールを置いたり削除したり出来る最小限の構成を作って見ます。
  • conf.d/10-mail.conf
# default側はseparatorを追加するだけ
namespace inbox {
  separator = /
  # ...
}
# add public
namespace {
  type = public
  # should use the same separator for all
  separator = /
  prefix = Public/
  location = maildir:/var/mail/public
  subscriptions = no
}
public用フォルダをmkdirします。ついでにtestフォルダも作成。
mkdir /var/mail/public/
mkdir /var/mail/public/.test
chown -R vmb.vmb /var/mail/public
これでdovecotリロード後、RoundCubeにログインして、設定>フォルダを見るとPublic/testが追加されています。
※Public自体にメールは置けませんので、その下にフォルダを作り置きます。誰かがメールを置けば見れるし、削除すれば消えるし、閲覧すれば全員が閲覧済となります。

1-1. 一般ユーザは閲覧のみ可能にする

次にユーザは閲覧のみで、管理者を一人設定してそのユーザにメールを置いたりする権限を与えるようにACLを設定してみます。
  • conf.d/10-mail.conf
mail_plugins = $mail_plugins acl
  • conf.d/90-acl.conf
plugin {
  acl = vfile:/etc/dovecot/global-acls:cache_secs=300
  # (v2.2.31+)
  #acl_globals_only = yes
}
  • /etc/dovecot/global-acls
Public/* anyone lrs
Public user=aikawa@virtual.localdomain lrswtipekxa
Public/* user=aikawa@virtual.localdomain lrswtipekxa
これでPublic下のフォルダは、誰でも閲覧可能、aikawa@virtual.localdomainが管理者としてフォルダの作成やメールを設置したり出来るようになりました。
acl_globals_onlyは今回設定しませんので、ユーザのフォルダごとにdovecot-acl設置も可能です。
ついでに、閲覧について個人ごとに既読・未読を切り替えられるようにします。
conf.d/10-mail.conf のnamespace{type=public}のlocationに、オプションを設定します。
※Dovecot 2.3以降はINDEXPVTを設定する事で、そこに閲覧フラグの管理ファイルを設置出来ます。
  location = maildir:/var/mail/public:CONTROL=~/Maildir/public:INDEXPVT=~/Maildir/public

1-2. RoundCubeのACLプラグイン

RoundCubeでもaclプラグインを有効にしてみます。
  • conf.d/20-imap.conf
protocol imap {
 mail_plugins = $mail_plugins imap_acl
}
RoundCube側のroundcube/config/config.inc.phpでaclを追加します。
$config['plugins'] = ['acl'];
再度ログインし直して、設定>フォルダでPublicを見ると、一般ユーザは以下のように表示されます。
管理者aikawa@virtual.localdomainでは、権限の編集とフォルダの作成が可能になっています。
Public/testフォルダはglobalで設定した内容が反映されています。

2. ユーザ間のメール共有

こちらはユーザ間で、指定ユーザのメールを閲覧可能にしてみます。
(ユーザ間の方はファイルの書き方とか記載の無い所が多くて、調べて行くのが面倒でした。Publicの方が使いやすいし楽だし、ほぼ使わないんじゃないかと思います)
  • conf.d/10-mail.conf
# default側はseparatorを追加するだけ
namespace inbox {
  separator = /
  # ...
}
# add shared
namespace {
  type = shared
  separator = /
  prefix = shared/%%n/
  location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%n:INDEXPVT=~/Maildir/shared/%%n
  subscriptions = no
  list = children
}
# virtual mailbox owner
mail_access_groups = vmb
  • conf.d/20-imap.conf
protocol imap {
 mail_plugins = $mail_plugins imap_acl
}
  • conf.d/90-acl.conf
plugin {
  acl = vfile:/etc/dovecot/global-acls:cache_secs=300
}
plugin {
  # vmb can access
  acl_shared_dict = file:/var/mail/shared/shared-mailboxes
}
  • /etc/dovecot/global-acls
shared/* anyone lrs
acl_shared_dict のファイル /var/mail/shared/shared-mailboxes を作成します。
mkdir /var/mail/shared
touch /var/mail/shared/shared-mailboxes
chown -R vmb.vmb /var/mail/shared
この時点で、各ユーザのMaildir/subscriptionsにshared/username を追加する事で閲覧出来るのですが、フォルダー一覧には出ず、ほぼ実質閲覧が不可能なため、追加設定が必要です。
  • /var/mail/shared/shared-mailboxes
1設定につき2行構成で、1行目はユーザ、2行目はフラグを記載するようです。
ユーザ個別に閲覧させる場合、shared/shared-boxes/user/$to/$from の形式で記載します。
2行目は1固定のようですが、割と他の文字列でも有効フラグ扱いになるようです。
shared/shared-boxes/user/user1@virtual.localdomain/aikawa@virtual.localdomain
1
上記ではaikawa@virtual.localdomainのフォルダをuser1@virtual.localdomainが閲覧可能になります。
あるユーザを全員に閲覧させる場合、shared/shared-boxes/anyone/$from の形式で記載します。
shared/shared-boxes/user/user1@virtual.localdomain/aikawa@virtual.localdomain
1
shared/shared-boxes/anyone/test@virtual.localdomain
1
これで全員がtest@virtual.localdomainを閲覧可能になります。
user1@virtual.localdomainから見た場合
他のユーザ(test@virtual.localdomain以外)から見た場合

2-1. SQLで管理する

共有するユーザをファイルでなくSQLで管理してみます。
  • conf.d/90-acl.conf
plugin {
  acl_shared_dict = proxy::acl
}
dict {
  acl = pgsql:/usr/local/etc/dovecot/dovecot-dict-shared-sql.conf.ext
}
  • /usr/local/etc/dovecot/dovecot-dict-shared.sql.conf.ext
connect = host=localhost user=mail password=testpass dbname=mail
map {
  pattern = shared/shared-boxes/user/$to/$from
  table = user_shares
  value_field = dummy
  fields {
    from_user = $from
    to_user = $to
  }
}
map {
  pattern = shared/shared-boxes/anyone/$from
  table = anyone_shares
  value_field = dummy
  fields {
    from_user = $from
  }
}
テーブルを作成します。
CREATE TABLE user_shares (
  from_user varchar(100) not null,
  to_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user, to_user)
);
COMMENT ON TABLE user_shares IS 'User from_user shares folders to user to_user.';
CREATE INDEX to_user ON user_shares (to_user); -- because we always search for to_user
CREATE TABLE anyone_shares (
  from_user varchar(100) not null,
  dummy char(1) DEFAULT '1',    -- always '1' currently
  primary key (from_user)
);
COMMENT ON TABLE anyone_shares IS 'User from_user shares folders to anyone.';
先ほどのファイルと同じ設定の場合、INSERTは以下になります。
INSERT INTO user_shares(from_user, to_user) VALUES('aikawa@virtual.localdomain', 'user1@virtual.localdomain');
INSERT INTO anyone_shares(from_user) VALUES('test@virtual.localdomain');
Facebooktwitterlinkedintumblrmail
名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)