
Bcc'ing der[email geschützt]Benutzer, wirnichtmöchten, dass die Leute diese Bcc-Liste erhalten, abgesehen von der[email geschützt]"Benutzer".
Ziel
- 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.
Wir möchten die Bcc-Empfänger in das Nachrichtenarchiv aufnehmen.
Wir tunnichtmöchten, dass die Leute diese Bcc-Liste erhalten, abgesehen von der[email geschützt]"Benutzer".
Versuch
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.
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).
- 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-To
Header. 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";
}