如何在不使用Procmail的情况下配置Postfix将邮件以Maildir格式投递到/var/spool/mail/$USER目录
我太懂这种找了半天解决方案却一无所获的抓狂感了,别慌,不需要Procmail也能完美实现你的需求,咱们一步步来搞定:
核心思路
要让Postfix把Maildir格式的邮件投递到/var/spool/mail/$USER目录,关键是直接指定投递路径,同时明确告诉Postfix使用Maildir格式,避开默认的mbox模式冲突。
具体操作步骤
提前准备用户目录并设置正确权限
首先要确保每个用户对应的父目录存在,并且权限允许Postfix写入、用户自己能访问:# 以用户regine为例,替换成实际用户名 mkdir -p /var/spool/mail/regine chown regine:mail /var/spool/mail/regine chmod 700 /var/spool/mail/regine如果你有很多用户,可以写个小脚本批量处理,避免手动重复操作。
修改Postfix主配置文件
打开Postfix的主配置文件(通常是/etc/postfix/main.cf),做以下调整:- 先注释或者删除你当前设置的
home_mailbox = ./ - 添加或修改以下两个配置项:
mailbox_path = /var/spool/mail/%u/Maildir/ mailbox_command =%u是Postfix的内置变量,会自动替换成收件人的用户名,确保每个用户都有独立的Maildir目录- 路径末尾的
/是关键!它会告诉Postfix这是Maildir格式的投递目录,Postfix会自动帮你创建cur、new、tmp这三个子目录 mailbox_command =是清空这个配置,避免Postfix调用其他投递工具(比如Procmail),完全用自身的投递逻辑
- 先注释或者删除你当前设置的
重新加载Postfix配置
修改完配置后,让Postfix生效:postfix reload
为什么之前的配置会出错?
你之前遇到的报错cannot update mailbox /var/spool/mail/regine for user regine. cannot open file: Is a directory,是因为mail_spool_directory默认是针对mbox格式的——Postfix会尝试在这个目录下创建一个和用户名同名的mbox文件,但你已经提前创建了同名的目录,自然就冲突报错了。
而home_mailbox = ./会让Postfix把Maildir创建在用户的家目录下,这就是为什么你之前看到邮件都跑到/home/regine/{cur,new,tmp}里的原因。
验证效果
可以发一封测试邮件给目标用户,比如:
echo "测试内容" | mail -s "Postfix Maildir测试" regine
然后检查/var/spool/mail/regine/目录下是否出现了cur、new、tmp三个子目录,并且测试邮件在new目录里,就说明配置成功了!
备注:内容来源于stack exchange,提问作者Chris972

