Dovecotで、他人と同じメールフォルダを共有する設定を追加してみます。 ユーザのいないフォルダを全員で共有するケースと、個人のフォルダを誰かに共有するケースの2つを設定してみます。
1. パブリック共有のケース
こちらはユーザのフォルダを他ユーザに見せるのではなく、全員が見れるような共有フォルダを作成します。
まずは、誰でもメールを置いたり削除したり出来る最小限の構成を作って見ます。
# 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を設定してみます。
mail_plugins = $mail_plugins acl
plugin {
acl = vfile:/etc/dovecot/global-acls:cache_secs=300
# (v2.2.31+)
#acl_globals_only = yes
}
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プラグインを有効にしてみます。
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の方が使いやすいし楽だし、ほぼ使わないんじゃないかと思います)
# 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
protocol imap {
mail_plugins = $mail_plugins imap_acl
}
plugin {
acl = vfile:/etc/dovecot/global-acls:cache_secs=300
}
plugin {
# vmb can access
acl_shared_dict = file:/var/mail/shared/shared-mailboxes
}
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で管理してみます。
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');
この投稿は 2023年3月9日 木曜日 17:10 に 未分類 カテゴリーに公開されました。 この投稿へのコメントは RSS 2.0 フィードで購読することができます。
このページの一番下でコメントを残すことができます。トラックバック / ピンバックは現在受け付けていません。