Ziel

Ziel

Bcc'ing der[email geschützt]Benutzer, wirnichtmöchten, dass die Leute diese Bcc-Liste erhalten, abgesehen von der[email geschützt]"Benutzer".

Ziel

  1. Wir möchten alle E-Mails archivieren, die über Postfix gesendet und empfangen werden. Das Setup verwendet:
  • Postfix,
  • Dovecot-Authentifizierung mit Pam-Benutzern (Abrufen von LDAP),
  • und Zustellung in die Briefkästen überLMTP von Dovecot.
  1. Wir möchten die Bcc-Empfänger in das Nachrichtenarchiv aufnehmen.

  2. Wir tunnichtmöchten, dass die Leute diese Bcc-Liste erhalten, abgesehen von der[email geschützt]"Benutzer".

Versuch

  1. Verwenden von always_bcc =[email geschützt] Funktioniert. Allerdings gehen die Bcc-Empfänger (die laut Rechte im Umschlag als RCPT TO stehen und nicht in einer Kopfzeile) verloren.

  2. Verwendung: (gemäßWelche Möglichkeiten gibt es, Postfix-E-Mails zu archivieren und alle BCC-Informationen im Header beizubehalten?)

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

während der pcre-Ausdruck lautet:

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

das funktioniert wie ein Zauber: Meine gespeicherte Nachricht hat die Kopfzeilen An:; Cc; X-Envelope-To. Wenn wir uns irgendwann damit befassen müssen, können wir sogar in Bcc herausfinden, wer die Nachricht erhalten hat. (NB: X-Envelope-To umfasst die An- und Cc-Personen, Passcodes sowie die Empfänger in externen Domänen).

  1. So entfernen Sie das X-Envelope-To-Symbol: Zum Versenden:
smtp_header_checks = pcre:/etc/postfix/smtp_header_checks.pcre

Mit dem Inhalt:

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

Bis dahin alles ok.

Problem

Um das X-Envelope-To-Symbol für E-Mails zu entfernen, die den Server nicht verlassen, habe ich Folgendes getan:

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

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

Aber das ist nicht selektiv, auch[email geschützt]verliert den Header, der in der Bcc-Liste „gespeichert“ wurde.

Ich kann keine Möglichkeit finden, diese Header-Prüfung selektiv durchzuführen, da sie nur die Zeile selbst auswertet und den Empfänger nicht zur Festlegung einer Bedingung verwenden kann (auch nicht bei Verwendung des „if“ des PCRE). (http://www.postfix.org/pcre_table.5.html)

Gibt es eine Variable, die verwendet werden kann? Ein Gedanke war: include "[email geschützt]" im vorangestellten Header „X-Envelope-To“ in der Datei lmtp_header_checks.pcre, fügen Sie etwas wie Folgendes ein:[email geschützt]ungleich $LMTP_DELIVERY_RECIPIENT. „Delivered-To“ oder „X-Delivered-To“ bleiben ein separater Header, den der pcre nicht als Variable auswerten kann.

Gibt es sonst eine Möglichkeit, LMTP dazu zu bringen, Milter auszulösen? Und einen einfachen LMTP_Milter-Filter, den ich dafür verwenden kann?

Ich suche seit Tagen in allen möglichen Dokumenten, Danke im Voraus

Antwort1

Oh JA! Vielen Dank.

Die Sieve-Sprache erlaubt keine Iteration über mehrere X-Envelope-ToHeader. Daher muss sie an ein externes Programm übergeben werden.

Hier ist, was mir eingefallen ist:

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"

Wenn Sie das Archiv mit einem beliebigen MUA öffnen, können Sie sehen, wie der BCC neu erstellt wurde. NB: Das Skript ist etwas länger, vermeidet jedoch eine Duplizierung der An-Personen in der BCC-Liste.

Antwort2

Verwenden Sie die Sieve-Sprache.

Da Ihre E-Mail über LMTP an Dovecot übermittelt wird, stehen Ihnen dort sämtliche Adressierungs- und Header-Bearbeitungsfunktionen zur Verfügung, mit einer ganzen Reihe komplexerer Logikfunktionen als sie bei einfachen Postfix-Header-Prüfungen verfügbar sind.

Wenn Sie Pigeonhole Sieve noch nicht verwenden, müssen Sie es möglicherweise als Dovecot-Plugin aktivieren, die in Ihrem Skript benötigten Erweiterungen aktivieren und ein geeignetes Skript konfigurieren.

# 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

Löschen Sie dann in einem Skript, das global oder speziell für Benutzer ausgeführt wird, die die Umschlagadresse nicht sehen sollen, den Header – es sei denn, die Zustellung erfolgt an das Archivpostfach:

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

verwandte Informationen