You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置Postfix/Dovecot+MySQL服务器时遇用户主目录未设置错误

解决Dovecot "Home directory not set for user" 错误

这个错误的核心原因很明确:Dovecot通过MySQL认证用户后,没办法获取到该用户的主目录(home directory),所以没法解析~/myserver.io/mail/路径里的~符号。咱们一步步来修复:

1. 确认MySQL用户表的结构

首先登录你的MySQL服务器,检查存储用户信息的表(通常叫users)有没有存储主目录的字段:

DESCRIBE users;

你需要确保表中有一个home字段(或者类似命名的字段,比如mail_home),类型为VARCHAR,用来存储用户的主目录绝对路径,比如/var/mail/vhosts/myserver.io/john。

如果没有这个字段,赶紧添加:

ALTER TABLE users ADD COLUMN home VARCHAR(255) NOT NULL DEFAULT '/var/mail/vhosts/myserver.io/%u';

这里的%u会被Dovecot自动替换为用户名,生成每个用户的专属路径。

2. 修正Dovecot的SQL查询配置

打开Dovecot的SQL配置文件(一般是/etc/dovecot/dovecot-sql.conf.ext),找到user_query参数——这个查询是Dovecot用来获取用户核心信息的,必须返回home、uid、gid三个关键字段:

user_query = SELECT home, uid, gid FROM users WHERE username = '%u'

如果你的用户表中存储主目录的字段不是home(比如叫mail_home),记得用AS重命名适配:

user_query = SELECT mail_home AS home, uid, gid FROM users WHERE username = '%u'

3. 备选方案:直接指定邮件存储路径(绕过~解析)

如果你不想依赖用户主目录,也可以直接在Dovecot配置里写死邮件存储的绝对路径。打开/etc/dovecot/conf.d/10-mail.conf,修改mail_location:

mail_location = maildir:/var/mail/vhosts/myserver.io/%u/mail

这里的%u会自动替换为当前登录的用户名,确保这个路径已经创建,并且Dovecot的运行用户(比如vmail或dovecot)拥有读写权限:

mkdir -p /var/mail/vhosts/myserver.io/testuser/mail
chown -R vmail:vmail /var/mail/vhosts/myserver.io/testuser

4. 验证配置并重启服务

最后检查配置是否存在语法错误:

dovecot -n

查看输出里的user_query和mail_location是否和你设置的一致,然后重启Dovecot:

systemctl restart dovecot

现在再测试IMAP/SMTP登录,应该就能解决这个初始化错误了。

内容的提问来源于stack exchange,提问作者Barry Chapman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:26:31