目标

目标

抄送[电子邮件保护]用户,我们不是希望人们收到密件抄送列表,除了[电子邮件保护]“用户”。

目标

  1. 我们希望存档所有通过 postfix 发送和接收的邮件。设置使用:
  • 后缀,
  • 使用 Pam (从 Ldap 中提取) 用户进行 dovecot 身份验证,
  • 并通过以下方式投递到邮箱Dovecot 的 LMTP
  1. 我们希望将密件抄送收件人包含在邮件存档中。

  2. 我们的确是不是希望人们收到密件抄送列表,除了[电子邮件保护]“用户”。

审判

  1. 使用 always_bcc =[电子邮件保护] 可以。但是密件抄送收件人(根据权限,它们位于信封中的 RCPT TO 中,而不是在标题中)丢失了。

  2. 使用:(按照有哪些选项可以存档 Postfix 电子邮件并保留标题中的任何 BCC 信息

main.cf
smtpd_recipient_restrictions =
  check_recipient_access pcre:/etc/postfix/prepend.pcre

而 pcre 表达式为:

prepend.pcre
/(.+)/          PREPEND X-Envelope-To: $1

非常有效:我存储的邮件标题为收件人:;抄送;X-Envelope-To。如果有一天我们需要深入研究它,我们可以知道谁收到了邮件,即使是密件抄送也是如此。(注意:X-Envelope-To 包括收件人和抄送人,以及外部域收件人)。

  1. 消除 X-Envelope-To:发送出去:
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks.pcre

内容如下:

smtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

到那为止一切都好。

问题

为了消除未离开服务器的电子邮件的 X-Envelope-To。我做了:

lmtp_header_checks = pcre:/etc/postfix/lmtp_header_checks.pcre

lmtp_header_checks.pcre
/^X-Envelope-To:/               IGNORE

但这不是选择性的,甚至[电子邮件保护]丢失“保存”的密件抄送列表的标题。

我找不到选择性地检查该标题的方法,因为它仅评估行本身并且不能使用收件人来制定条件(即使使用 pcre 的“if”)。http://www.postfix.org/pcre_table.5.html

有没有可以使用的变量?一个想法是:包括“[电子邮件保护]“在 lmtp_header_checks.pcre 中的 X-Envelope-To 标头中添加以下内容:[电子邮件保护]不等于 $LMTP_DELIVERY_RECIPIENT Delivered-To 或 X-Delivered-To 仍然是一个单独的标题,pcre 无法将其评估为变量。

否则,有没有办法让 lmtp 触发一些 milter?我可以使用一个简单的 lmtp_milter 过滤器来实现这一点?

我已经在所有可能的文档中搜索了好几天,提前谢谢大家

答案1

哦是的!非常感谢。

筛选语言不允许对多个X-Envelope-To标头进行迭代。因此需要将其传递给外部程序。

以下是我的想法:

require "fileinto";
require "imap4flags";
require ["editheader", "envelope"];
require "vnd.dovecot.filter";
if header :contains "X-Spam-Flag" "YES"
{
   fileinto "Junk";
   stop;
}
if envelope :is "to" "[email protected]" {
   filter "EnvelopeToBcc.sh";
} else {
   deleteheader "X-Envelope-To";
}
#!/bin/bash
# Store mail in a variable
# input stream
mail=`cat /dev/stdin`
# Extract headers
envelope=$(echo "$mail" | formail -x X-Envelope-To | tr -d '\015')
tos=$(echo "$mail" | formail -x To  | tr -d '\015')
copies=$(echo "$mail" | formail -x Cc  | tr -d '\015')

# Loop excluding the To: fields and concatenate in variable
bcc=""
for i in $envelope; do
        if [[ ${tos} != *"${i}"* && ${copies} != *"${i}"* ]];then
                bcc="${bcc} ${i},"
        fi
done
# Eliminate trailing comma
bcc=$(echo $bcc | sed s/,$//)
# Add Bcc header to mail 
echo "${mail}" | formail -a "Bcc: $bcc"

如果您使用任何 MUA 打开档案,则可以看到重建的密件抄送。注意:脚本稍长,但它可以避免在密件抄送列表中重复收件人。

答案2

使用 Sieve 语言。

由于您的邮件是通过 LMTP 传送到 Dovecot 的,因此您将在那里拥有所有的寻址和标头编辑功能,以及比简单的 Postfix 标头检查所提供的一系列更复杂的逻辑功能。

如果您尚未使用 Pigeonhole sieve,您可能需要将其作为 Dovecot 插件启用,在脚本中启用所需的扩展,并配置合适的脚本。

# step1 enable sieve (append to $mail_plugins to *add*)
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}
# step2 enable sieve extensions, as required (prefix with + to *add*)
plugin {
    sieve_extensions = +editheader
}
# step3 configure the path a of a script to be executed

然后在全局执行的脚本中,或者专门为那些看不到信封地址的用户执行的脚本中,删除标题 - 除非发送到存档邮箱:

require ["editheader", "envelope"];
if not envelope :is "to" "[email protected]" {
    deleteheader "X-Envelope-To";
}

相关内容