如何配置Postfix通过Dovecot LMTP将邮件投递到本地Maildir目录
看起来你遇到的问题核心是Postfix自动给本地用户名加上了完整域名,而Dovecot的LMTP服务没把带域名的地址识别成对应的本地系统用户。咱们一步步调整配置,让这俩家伙配合好,把邮件稳稳投递到/var/mail/username的Maildir目录里。
1. 给Postfix“定规矩”:明确本地域名范围
首先编辑Postfix的主配置文件/etc/postfix/main.cf,确保它清楚哪些域名属于本地系统,避免乱加不必要的后缀:
# 定义Postfix视为本地的域名,把你的node12.xxxx.net加进去 mydestination = $myhostname, localhost.$mydomain, localhost, node12.xxxx.net # 让Postfix优先查询本地系统用户作为收件人 local_recipient_maps = $alias_maps $local_unix_maps # 留空,防止Postfix转发未知用户的邮件 luser_relay =
2. 让Postfix传递纯用户名给Dovecot
默认Postfix会把本地用户名转成完整邮箱地址再传给Dovecot,咱们可以直接指定本地投递规则,确保传递的是纯用户名。在/etc/postfix/main.cf里添加或修改:
# 本地投递直接对接Dovecot的LMTP服务 local_transport = lmtp:unix:private/dovecot-lmtp # 可选:关闭自动给本地用户名追加域名的行为(和下一步Dovecot配置二选一即可) append_at_myorigin = no
3. 给Dovecot“开绿灯”:自动识别带域名的本地用户
就算Postfix传了完整邮箱地址,咱们也能让Dovecot自动剥离域名,只认前面的用户名。编辑Dovecot的LMTP配置文件/etc/dovecot/conf.d/20-lmtp.conf:
# 从完整邮箱地址里提取纯用户名(比如从username@xxx.net里提取username) auth_username_format = %n # 关闭细节邮箱,确保邮件直接放到用户的Maildir根目录 lmtp_save_to_detail_mailbox = no
然后确认Dovecot知道用户的Maildir路径,编辑/etc/dovecot/conf.d/10-mail.conf:
# 指定用户的Maildir目录为/var/mail/用户名 mail_location = maildir:/var/mail/%u # 确保Dovecot使用系统用户数据库 passdb { driver = passwd } userdb { driver = passwd }
4. 重启服务+验证效果
配置改完后,重启俩服务让配置生效:
systemctl restart postfix systemctl restart dovecot
然后测试发邮件:
mail username -s "测试邮件" <<< "这是测试内容"
之后可以去/var/mail/username/new目录下看看有没有新生成的邮件文件,或者查日志/var/log/mail.log,如果看到status=sent就说明成功了!
额外排查小技巧
如果还是有问题,用Dovecot自带的命令测试用户识别:
doveadm user username@node12.xxxx.net
如果命令返回了用户的UID、GID和邮箱路径,说明Dovecot已经能正确识别这个带域名的用户了;如果返回错误,就再检查Dovecot的passdb和userdb配置,确保它在查询系统用户。
备注:内容来源于stack exchange,提问作者Rich

