我已经通过 安装了dovecot
。但出于某种原因,自从 Apple 更新系统以来,我无法让它完全正常工作。当 dovecot 想要访问 INBOX 时,创建 dotlock 文件时会出现某种无法解决的权限问题。有趣的是,postfix 在OS X Yosemite
同一个目录中创建 dotlock 文件没有任何问题。Homebrew
10.10.3
$ dovecot --version
2.2.18
OS X 中的默认路径设置,也由 dovecot wiki 正式支持/记录。我希望保持原样,因为系统更新通常会将此处的权限改回来:
$ ls -lae /var/
...
drwxrwxr-x 3 root mail 102 Aug 14 18:52 mail
...
$ ls -lae /var/mail
...
-rw------- 1 haru mail 542 Aug 14 18:53 haru
...
这是我最初的设置,直到OS X 10.10.2
。我从输出中删除了一堆不相关的选项:
$ cat /usr/local/etc/dovecot/local.conf
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail
一切都运行正常,直到OS X 10.10.3
更新后,提取邮件时突然dovecot[PID]: pop3(haru): Error: setegid(privileged) failed: Operation not permitted
出现错误。它仍然可以提取邮件,但无法从收件箱中删除它们,因此每次提取时,相同的邮件都会一次又一次地出现。
经过大量研究和随机尝试后,我最终将其添加mail_access_groups = mail
到了 dovecot 配置中。但我不太明白这个选项到底有什么用。
$ cat /usr/local/etc/dovecot/local.conf
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail
mail_access_groups = mail
一切原本都运行良好,直到OS X 10.10.5
昨天更新后突然一切都变得一团糟,系统完全崩溃dovecot[PID]: pop3(haru): Fatal: setgroups(mail,) failed: Too many extra groups
。删除修复了这个错误,但又出现了之前描述的从 10.10.3 开始的错误行为。最后,我不得不通过从选项中删除默认条目来mail_access_groups = mail
禁用点文件锁定:dotlock
mbox_write_locks
$ cat /usr/local/etc/dovecot/local.conf
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail
mbox_read_locks = fcntl
mbox_write_locks = fcntl
我是不是漏掉了什么或者没理解对吗?为什么默认权限设置(如 dovecot 文档中所述)不起作用?也许是与 OS X 10.10.3 开始出现某种不兼容性,或者是 dovecot 中存在一些错误?
答案1
失败的setgroups()
原因是运行 Dovecot 的机器上的用户分配了超过 16 个组。
以 root 身份(或以该用户身份)运行id -G <user>
或id <user>
以查看组数。
不幸的是,macOS 为用户分配了大量的组,以对屏幕共享等内容进行细粒度的访问控制。幸运的是,Dovecot 有一个选项可以设置“有效”组 ID 的范围。因此,您可以设置
last_valid_gid = 100
您的号码可能有所不同。
我刚刚遇到这个问题并在这里写了出来:http://pilhuhn.blogspot.com/2018/10/solution-for-dovecot-and-setgroups.html