使用 dovecot 和简单内容过滤器 (Postfix) 将消息重复传递到 always_bcc

使用 dovecot 和简单内容过滤器 (Postfix) 将消息重复传递到 always_bcc

我正在尝试使用以下命令设置流量非常低的 Postfix 邮件服务器:

  • 一个简单的内容过滤器(http://www.postfix.org/FILTER_README.html#simple_filter)比高级版简单很多,流量也低。
  • dovecot 作为投递代理。(由于 maildir 配额和筛选过滤器)
  • always_bcc保留每封已发送邮件的副本。(商业规则)

我的相关配置是:

主配置文件

smtp      inet  n       -       y       -       -       smtpd
        -o content_filter=filter:dummy
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
filter    unix  -       n       n       -       10      pipe
  flags=Rq user=filter null_sender=
  argv=/var/spool/filter/scripts/filter.sh -f ${sender} -- ${recipient}
dovecot    unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

main.cf(仅相关部分)

always_bcc = [email protected]
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

/var/spool/filter/scripts/filter.sh

#!/bin/sh

/usr/bin/cat | /var/spool/filter/scripts/mailfilter | /usr/sbin/sendmail -G -i "$@"

exit $?

  • 我的所有用户的电子邮件都在“(初始)[电子邮件保护]“ 格式
  • 有充当角色的安全组,每个安全组都有电子邮件“[电子邮件保护]“ 格式。
  • 基本上,角色电子邮件充当多个用户的别名。

因此,我可以重复使用用于设置权限的相同角色/组,而不必直接使用用户。

例如

  • 我的用户电子邮件是[电子邮件保护]
  • 我是 ITDepartment 角色的成员([电子邮件保护]
  • 我是其他一些角色的成员,但我的主要角色是“ITDepartment”
  • 因为我是这个组/角色的成员,所以我拥有某些特权,就像其他成员一样,并且每封发送给[电子邮件保护]将传达给我和其他成员。

到目前为止一切顺利...但我的老板希望我发送的每封邮件都使用[电子邮件保护](角色)地址而不是[电子邮件保护](用户)。即,发送的每封邮件都使用主要角色电子邮件,而不是用户电子邮件。

/var/spool/filter/scripts/mailfilter是一个内部制作的过滤器,它只执行此操作(将“发件人”地址从“(初始).surname@”更改为“role@”检查 LDAP 服务器)。

它永远不会失败(如果出现任何错误情况,它只会将标准输入复制到标准输出中并且不进行任何修改,因此地址不会改变,但邮件不会丢失)。

问题是,当我发送电子邮件时,它会向[电子邮件保护]从日志中可以看出,并没有像预期的那样有一个副本。


Dec 16 16:23:08 correo2 postfix/smtpd[32453]: connect from informatica1.mydomain.example[10.128.159.15]
Dec 16 16:23:08 correo2 postfix/smtpd[32453]: DD925380C87: client=informatica1.mydomain.example[10.128.159.15], sasl_method=LOGIN, [email protected]
Dec 16 16:23:08 correo2 postfix/cleanup[32456]: DD925380C87: message-id=<[email protected]>
Dec 16 16:23:09 correo2 postfix/qmgr[32275]: DD925380C87: from=<[email protected]>, size=2749, nrcpt=2 (queue active)
Dec 16 16:23:09 correo2 postfix/pickup[32274]: AAFEF380C8D: uid=110 from=<[email protected]>
Dec 16 16:23:09 correo2 postfix/pipe[32457]: DD925380C87: to=<[email protected]>, relay=filter, delay=0.81, delays=0.11/0/0/0.7, dsn=2.0.0, status=sent (delivered via filter service)
Dec 16 16:23:09 correo2 postfix/pipe[32457]: DD925380C87: to=<[email protected]>, orig_to=<[email protected]>, relay=filter, delay=0.81, delays=0.11/0/0/0.7, dsn=2.0.0, status=sent (delivered via filter service)
Dec 16 16:23:09 correo2 postfix/qmgr[32275]: DD925380C87: removed
Dec 16 16:23:09 correo2 postfix/cleanup[32456]: AAFEF380C8D: message-id=<[email protected]>
Dec 16 16:23:09 correo2 postfix/qmgr[32275]: AAFEF380C8D: from=<[email protected]>, size=2927, nrcpt=3 (queue active)
Dec 16 16:23:10 correo2 dovecot: lda([email protected])<32488><2DSfML3hnGPofgAA0V72BQ>: msgid=<[email protected]>: saved mail to INBOX
Dec 16 16:23:10 correo2 postfix/pipe[32473]: AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.28, dsn=2.0.0, status=sent (delivered via dovecot service)
Dec 16 16:23:10 correo2 dovecot: lda([email protected])<32490><Au2fML3hnGPqfgAA0V72BQ>: msgid=<[email protected]>: saved mail to INBOX
Dec 16 16:23:10 correo2 postfix/pipe[32471]: AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.34, dsn=2.0.0, status=sent (delivered via dovecot service)
Dec 16 16:23:10 correo2 dovecot: lda([email protected])<32489><BE2gML3hnGPpfgAA0V72BQ>: msgid=<[email protected]>: saved mail to INBOX
Dec 16 16:23:10 correo2 postfix/pipe[32470]: AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.35, dsn=2.0.0, status=sent (delivered via dovecot service)
Dec 16 16:23:10 correo2 postfix/qmgr[32275]: AAFEF380C8D: removed
Dec 16 16:23:11 correo2 postfix/smtpd[32453]: disconnect from informatica1.mydomain.example[10.128.159.15] ehlo=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=6

uid=110 是“过滤”用户 uid。“发件人”仅在电子邮件内的标题中更改,因此不会显示在日志中。

除了这个双重交付细节之外,一切都运行正常。我还没有尝试过,但我确信如果我从方程式中移除 dovecot,一切都会正常。但我失去了筛选规则和 maildir 配额。所以...

我知道该如何修复它吗?

答案1

Tl;dr:原始电子邮件到达 Postfix,Postfix 会添加 always_bcc 并发送副本,然后根据过滤器删除电子邮件。您的过滤器会向 Postfix 发送一封新邮件,Postfix 会添加 always_bcc 并发送副本,然后发送电子邮件。

阅读最后三段。


Postfix 收到的第一封电子邮件将是原始邮件DD925380C87seccopies,因此它会直接将副本发送给总是密送规则。第二AAFEF380C8D是由过滤器翻译的(将发件人标题更改为您的组)并且seccopies也被发送到,但是两次,因为第一封电子邮件已经有密件抄送seccopies,现在 Postfix 认为它需要将其发送到密件抄送,seccopies因此它再次获取它。

所以你应该得到三份seccopies,但是2和 [3] 被识别为同一电子邮件(AAFEF380C8D):

  1. 第一个发件人y.hernandez>> y.hernandezalways_bccseccopies
  2. 第二个从informatics到到y.hernandez>> always_bccseccopies
  3. 第三个来自informatics>> seccopies always_bcc seccopies(作为 BCC2

原件单份副本送达seccopies

**DD925380C87**: to=<[email protected]>, relay=filter, delay=0.81, delays=0.11/0/0/0.7, dsn=2.0.0, status=sent (delivered via filter service)

线uid=1102已创建,并且两个交付(一个因为它是 TO y.hernandez,另一个因为它是 BCCd to)seccopies如下行:

AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.34, dsn=2.0.0, status=sent (delivered via dovecot service)
AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.28, dsn=2.0.0, status=sent (delivered via dovecot service)

最后,修改后的电子邮件将发送给预期的收件人:

AAFEF380C8D: to=<[email protected]>, relay=dovecot, delay=1.1, delays=0.79/0/0/0.35, dsn=2.0.0, status=sent (delivered via dovecot service)

重复数据删除将阻止两者AAFEF380C8D电子邮件被发送到seccopies,但我不认为这会阻止DD925380C87电子邮件,因为那是一封单独的电子邮件。

我认为你需要关注指令,以便内容过滤器看到的是原始邮件地址,而不是自动密件抄送的结果然后它会将电子邮件重新注入 Postfix,然后应用 always_bcc:

/etc/postfix/main.cf:
content_filter = scan:localhost:10025
receive_override_options = no_address_mappings

来自接收覆盖选项:当在 main.cf 文件中指定了“内容过滤器之前”receive_override_options 设置时,请在 master.cf 中指定“内容过滤器之后”receive_override_options 设置(反之亦然)。

相关内容