1 votes

Archive Postfix préservant Bcc avec X-Envelope-To - nettoyage de X-Envelope-To confidentiel avec Lmtp

En envoyant une copie conforme à l'utilisateur de archive@domain.tld, nous faisons pas vous voulez que des personnes reçoivent cette liste Bcc, en dehors de l'"utilisateur" archive@domain.tld.

Objectif

  1. Nous voulons archiver tous les mails passant par postfix, envoyés et reçus. La configuration utilise :
  • postfix,
  • Dovecot authentification avec les utilisateurs Pam (tirés de Ldap),
  • et la livraison aux boîtes aux lettres via LMTP de Dovecot .
  1. Nous voulons inclure les destinataires Bcc dans l'archive des messages.

  2. Nous faisons pas vous voulez que des personnes reçoivent cette liste Bcc, en dehors de l'"utilisateur" archive@domain.tld.

Procès

  1. Utilisation de always_bcc = archive@domain.tld fonctionne. Mais les destinataires Bcc (qui, selon les droits, sont dans l'enveloppe comme RCPT TO et non dans un en-tête) sont perdus.

  2. En utilisant : (selon Quelles sont les options disponibles pour archiver le courrier électronique Postfix et préserver les informations BCC dans l'en-tête ? )

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

alors que l'expression pcre est :

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

qui fonctionne comme un charme : mon message stocké a les en-têtes To: ; Cc ; X-Envelope-To. Si un jour on a besoin de creuser, on peut savoir qui a reçu le message même en Cci. (NB : le X-Envelope-To inclut les personnes To et Cc, ainsi que les destinataires des domaines externes).

  1. Pour éliminer le X-Envelope-To : Pour l'envoi :

    smtp_header_checks = pcre:/etc/postfix/smtp_header_checks.pcre

Avec le contenu :

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

Tout va bien jusque là.

Problème

Pour éliminer le X-Envelope-To des emails qui ne quittent pas le serveur. Je l'ai fait :

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

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

Mais ce n'est pas sélectif, même archive@domain.tld perd l'en-tête qui a été "sauvegardé" dans la liste Bcc.

Je n'arrive pas à trouver un moyen d'effectuer ce contrôle sélectif de l'en-tête car il n'évalue que la ligne elle-même et ne peut pas utiliser le destinataire pour créer une condition (même en utilisant le "if" du pcre). ( http://www.postfix.org/pcre_table.5.html )

Y a-t-il une variable qui puisse être utilisée ? J'ai pensé à : inclure "archive@domain.tld" dans le préambule de l'en-tête X-Envelope-To, dans le fichier lmtp_header_checks.pcre, inclure quelque chose comme : archive@domain.tld n'est pas égal à $LMTP_DELIVERY_RECIPIENT Delivered-To ou X-Delivered-To restent un en-tête séparé que le pcre ne peut pas évaluer comme une variable.

Sinon, y a-t-il un moyen de faire en sorte que lmtp déclenche un milter ? Et un simple filtre lmtp_milter que je peux utiliser pour cela ?

J'ai cherché pendant des jours dans tous les documents possibles, Merci d'avance

1voto

rakeshNS Points 2332

Oh OUI ! Merci beaucoup.

Le langage de tamisage ne permet pas l'itération sur de multiples X-Envelope-To en-tête. Il faut donc le passer à un programme externe.

Voici ce que j'ai trouvé :

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" "archive@bogo.ovh" {
   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"

Si vous ouvrez l'archive avec n'importe quel MUA vous pouvez voir le bcc reconstruit. NB : script un peu plus long mais il évite la duplication des personnes à dans la liste Bcc.

0voto

anx Points 5996

Utilisez le langage Sieve.

Puisque votre courrier est livré via LMTP à Dovecot, vous y disposerez de toutes les capacités d'adressage et d'édition d'en-tête, avec tout un tas de capacités logiques plus complexes que celles offertes par les simples vérifications d'en-tête de Postfix.

Si vous n'utilisez pas encore Pigeonhole sieve, vous devrez peut-être l'activer en tant que Dovecot plugin, activer les extensions dont vous avez besoin dans votre Dovecot, et configurer un Dovecot approprié.

# 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

Ensuite, dans un script exécuté globalement, ou spécifiquement pour les utilisateurs qui ne doivent pas voir l'adresse de l'enveloppe, supprimez l'en-tête - sauf si vous livrez à la boîte aux lettres des archives :

require ["editheader", "envelope"];
if not envelope :is "to" "archive@example.com" {
    deleteheader "X-Envelope-To";
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X