使用 dovecot 和簡單內容過濾器(Postfix)將訊息重複傳送到always_bcc

使用 dovecot 和簡單內容過濾器(Postfix)將訊息重複傳送到always_bcc

我正在嘗試使用以下命令設定一個流量非常低的 postfix 郵件伺服器:

  • 一個簡單的內容過濾器(http://www.postfix.org/FILTER_README.html#simple_filter)。它比高級的簡單得多,而且流量也很低。
  • 鴿子作為遞送代理人。 (因為maildir配額和篩子過濾器)
  • always_bcc保留每封發送的郵件的副本。 (業務規則)

我的相關配置是:

大師.cf

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 角色的成員 ([電子郵件受保護]
  • 我是其他一些角色的成員,但我的主要角色是“IT部門”
  • 因為我是這個群組/角色的成員,所以我擁有某些特權,就像其他成員和發送到的每封郵件一樣[電子郵件受保護]將到達我和其他成員。

到目前為止,一切順利...但我的老闆希望我發送的每封郵件都使用[電子郵件受保護](角色)地址而不是[電子郵件受保護](用戶)。即,發送的每封郵件都使用主體角色電子郵件,而不是使用者電子郵件。

/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。 「寄件者」僅在電子郵件內部的標題中發生更改,因此不會顯示在日誌中。

除了這個雙重交付細節之外,一切都在正常運作。我還沒有嘗試過,但我確信如果我從等式中刪除鴿舍,一切都會起作用。但我失去了篩選規則和 maildir 配額。所以...

知道如何修復它嗎?

答案1

Tl;dr:原始電子郵件到達 Postfix,後者添加always_bcc 並發送副本,根據過濾器丟棄電子郵件。您的篩選器會向 Postfix 發送新訊息,後者會新增always_bcc 並傳送副本,然後傳送電子郵件。

閱讀最後三段。


到達 Postfix 的第一封電子郵件將是原始電子郵件DD925380C87seccopies,因此它會直接將其副本發送到總是密件抄送規則。第二AAEF380C8D是由過濾器翻譯的郵件(將「寄件者」標頭更改為您的群組),並且seccopies也被發送到,但兩次,因為第一封電子郵件已經有 的密件抄送seccopies,現在Postfix 認為需要將其發送到密件抄送,seccopies所以它再次得到它。

所以你應該得到三份副本seccopies,但是2和 [3] 被識別為同一電子郵件(AAEF380C8D):

  1. 第一個從y.hernandezy.hernandez>>always_bccseccopies
  2. 第二個從informatics到 到y.hernandez>>always_bccseccopies
  3. 第三個從informaticsseccopies >>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=110是在哪裡2已創建,並且有兩份交付,一份是因為它是 TO,y.hernandez另一份是因為它是 BCCd,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)

重複資料刪除可以防止這兩種情況發生AAEF380C8D電子郵件被發送到seccopies,但我不認為這會阻止DD925380C87電子郵件,因為這是一封單獨的電子郵件。

我認為你需要遵循指令,以便內容過濾器看到的是原始郵件地址,而不是...自動密件副本的結果,然後它將電子郵件重新註入到 Postfix 中,然後應用always_bcc:

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

來自接收覆蓋選項:當在 main.cf 檔案中指定「BEFORE 內容過濾器」receive_override_options 設定時,請在 master.cf 中指定「AFTER 內容過濾器」receive_override_options 設定(反之亦然)。

相關內容