抄送[电子邮件保护]用户,我们不是希望人们收到密件抄送列表,除了[电子邮件保护]“用户”。
目标
- 我们希望存档所有通过 postfix 发送和接收的邮件。设置使用:
- 后缀,
- 使用 Pam (从 Ldap 中提取) 用户进行 dovecot 身份验证,
- 并通过以下方式投递到邮箱Dovecot 的 LMTP。
我们希望将密件抄送收件人包含在邮件存档中。
我们的确是不是希望人们收到密件抄送列表,除了[电子邮件保护]“用户”。
审判
使用 always_bcc =[电子邮件保护] 可以。但是密件抄送收件人(根据权限,它们位于信封中的 RCPT TO 中,而不是在标题中)丢失了。
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 包括收件人和抄送人,以及外部域收件人)。
- 消除 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";
}