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

Postfix未为Maildir添加,S=邮件大小标记,求Dovecot兼容解决方法

解决Postfix给Maildir邮件添加,S=标记的问题

搞定这个问题其实不难,Postfix本身确实没有直接给Maildir文件名添加,S=大小标记的原生配置,但有几个成熟的方案能完美满足你的需求,而且都是生产环境常用的做法:

方法1:用Dovecot的dovecot-lda接管Postfix投递(最推荐)

因为,S=是Dovecot扩展的Maildir格式标记,让Dovecot自己来处理投递是最稳妥的,它会自动给邮件加上正确的,S=大小标记,还能顺便处理Dovecot的其他功能(比如配额、sieve过滤)。

步骤如下:

  1. 确保你的Dovecot安装了dovecot-lda组件(绝大多数发行版默认自带,如果没有的话,用包管理器安装,比如apt install dovecot-imapd或yum install dovecot)
  2. 修改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命令确认路径。
  3. 重启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}"

然后做以下配置:

  1. 给脚本添加执行权限:
    chmod +x /usr/local/bin/maildir-add-s-tag.sh
    
  2. 修改Postfix的main.cf:
    mailbox_command = /usr/local/bin/maildir-add-s-tag.sh "%u"
    
  3. 确保Postfix的运行用户(一般是postfix)有读写目标Maildir的权限。
  4. 重启Postfix生效。

方法3:用LMTP协议投递(适合虚拟用户环境)

如果你的邮件系统用的是虚拟用户(不是系统用户),可以用Postfix的LMTP传输模块,把邮件交给Dovecot的LMTP服务处理,同样会自动生成带,S=标记的文件名。

配置步骤:

  1. 修改Postfix的main.cf,添加或修改:
    virtual_transport = lmtp:unix:private/dovecot-lmtp
    
  2. 修改Dovecot的/etc/dovecot/conf.d/10-master.conf,配置LMTP监听:
    service lmtp {
      unix_listener private/dovecot-lmtp {
        mode = 0660
        user = postfix
        group = postfix
      }
    }
    
  3. 重启Postfix和Dovecot服务,之后虚拟用户的邮件就会通过LMTP投递,自动带上,S=标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:16:21