Postfix未为Maildir添加,S=邮件大小标记,求Dovecot兼容解决方法
解决Postfix给Maildir邮件添加
,S=标记的问题 搞定这个问题其实不难,Postfix本身确实没有直接给Maildir文件名添加,S=大小标记的原生配置,但有几个成熟的方案能完美满足你的需求,而且都是生产环境常用的做法:
方法1:用Dovecot的dovecot-lda接管Postfix投递(最推荐)
因为,S=是Dovecot扩展的Maildir格式标记,让Dovecot自己来处理投递是最稳妥的,它会自动给邮件加上正确的,S=大小标记,还能顺便处理Dovecot的其他功能(比如配额、sieve过滤)。
步骤如下:
- 确保你的Dovecot安装了
dovecot-lda组件(绝大多数发行版默认自带,如果没有的话,用包管理器安装,比如apt install dovecot-imapd或yum install dovecot) - 修改Postfix的主配置文件
/etc/postfix/main.cf,添加或修改以下配置:
注意:mailbox_command = /usr/lib/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT"dovecot-lda的路径可能因发行版不同,比如Debian/Ubuntu是/usr/lib/dovecot/dovecot-lda,RHEL/CentOS是/usr/libexec/dovecot/dovecot-lda,可以用which dovecot-lda命令确认路径。 - 重启Postfix和Dovecot服务:
之后新投递的邮件就会自动带上systemctl restart postfix systemctl restart dovecot,S=xxx的标记了。
方法2:自定义投递脚本(适合不想依赖Dovecot投递的场景)
如果你的场景不适合用dovecot-lda,可以自己写一个简单的shell脚本,作为Postfix的投递命令,手动计算邮件大小并添加,S=标记。
示例脚本(保存为/usr/local/bin/maildir-add-s-tag.sh):
#!/bin/bash # 接收Postfix传递的收件人参数 RECIPIENT="$1" # 替换成你的Maildir路径(如果是虚拟用户,需要动态获取路径) MAILDIR="/var/mail/$RECIPIENT/Maildir" # 创建临时文件保存邮件内容 TEMP_FILE=$(mktemp) cat > "$TEMP_FILE" # 计算邮件大小 FILE_SIZE=$(stat -c%s "$TEMP_FILE") # 生成符合Maildir规范的文件名 TIMESTAMP=$(date +%s) PID=$$ FILENAME="${TIMESTAMP}.M${PID}P${PPID}.mailserver,S=${FILE_SIZE}:2,S" # 将临时文件移动到Maildir的new目录 mv "$TEMP_FILE" "${MAILDIR}/new/${FILENAME}"
然后做以下配置:
- 给脚本添加执行权限:
chmod +x /usr/local/bin/maildir-add-s-tag.sh - 修改Postfix的
main.cf:mailbox_command = /usr/local/bin/maildir-add-s-tag.sh "%u" - 确保Postfix的运行用户(一般是
postfix)有读写目标Maildir的权限。 - 重启Postfix生效。
方法3:用LMTP协议投递(适合虚拟用户环境)
如果你的邮件系统用的是虚拟用户(不是系统用户),可以用Postfix的LMTP传输模块,把邮件交给Dovecot的LMTP服务处理,同样会自动生成带,S=标记的文件名。
配置步骤:
- 修改Postfix的
main.cf,添加或修改:virtual_transport = lmtp:unix:private/dovecot-lmtp - 修改Dovecot的
/etc/dovecot/conf.d/10-master.conf,配置LMTP监听:service lmtp { unix_listener private/dovecot-lmtp { mode = 0660 user = postfix group = postfix } } - 重启Postfix和Dovecot服务,之后虚拟用户的邮件就会通过LMTP投递,自动带上
,S=标记。
内容的提问来源于stack exchange,提问作者Raynet
相关产品推荐
相关产品推荐

