Цель

Цель

Скрытая копия[email protected]пользователь, мы делаемнетхотите, чтобы люди получали этот список скрытых копий, помимо[email protected]"пользователь".

Цель

  1. Мы хотим архивировать все письма, проходящие через postfix, отправленные и полученные. Настройка использует:
  • постфикс,
  • аутентификация dovecot с пользователями Pam (извлечение из Ldap),
  • и доставка в почтовые ящики черезLMTP Dovecot.
  1. Мы хотим включить получателей скрытых копий в архив сообщений.

  2. Мы делаемнетхотите, чтобы люди получали этот список скрытых копий, помимо[email protected]"пользователь".

Пробный

  1. Использование always_bcc =[email protected] Работает. Но получатели 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

который работает как по волшебству: мое сохраненное сообщение имеет заголовки To:; Cc; X-Envelope-To. Если когда-нибудь нам понадобится в нем разобраться, мы можем узнать, кто получил сообщение, даже в Bcc. (Примечание: X-Envelope-To включает людей To и Cc, а также получателей внешних доменов).

  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

Но это не выборочно, даже[email protected]теряет заголовок, который был «сохранен» в списке скрытых копий.

Я не могу найти способ выборочной проверки заголовка, поскольку он оценивает только саму строку и не может использовать получателя для создания условия (даже используя «if» pcre). (http://www.postfix.org/pcre_table.5.html)

Есть ли какая-нибудь переменная, которую можно использовать? Была мысль: включить "[email protected]" в предварительно добавленном заголовке X-Envelope-To в lmtp_header_checks.pcre включите что-то вроде:[email protected]не равно $LMTP_DELIVERY_RECIPIENT Delivered-To или X-Delivered-To остается отдельным заголовком, который pcre не может оценить как переменную.

В противном случае есть ли способ заставить lmtp вызвать какой-нибудь milter? И простой фильтр lmtp_milter, который я могу использовать для этого?

Несколько дней гонялся за всеми возможными документами. Спасибо заранее.

решение1

О ДА! Большое спасибо.

Язык sieve не допускает итерации по нескольким 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";
}

Связанный контент