Modifier un mail à la volée (postfix + DKIM)

Bonsoir à tous,
Actuellement, j’ai un serveur qui sert entre autre à envoyer des mails via Postfix.
Ces emails sont signés avec DKIM.

J’ai aussi créé un petit scripte qui permet de d’injecter une image en fin de mail afin de faire du tracking.

Seulement, je n’arrive pas à correctement faire vivre le tout.

Actuellement, le mail est envoyé et passe directement dans la moulinette de la signature DKIM.
J’arrive à modifier le contenu du mail… seulement j’obtiens une erreur au niveau de la signature car le contenu (body) est altéré.

127.0.0.1:10027 inet n - n - - smtpd
        -o content_filter=dfilt
        ……

dfilt     unix    -       n       n       -       -       pipe
    flags=Rq user=filter argv=/etc/postfix/disclaimer -f ${sender} -- ${recipient}

J’utilise altermime et le système de disclaimer afin de pouvoir modifier le contenu du mail.

Le disclaimer

> # Exit codes from <sysexits.h>
> EX_TEMPFAIL=75
> EX_UNAVAILABLE=69


> php -f /var/www/test-infos/ok.php in.$$ $@

> # Clean up when done or when aborting.
> trap "rm -f in.$$" 0 1 2 3 15

> # Start processing.
> cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
> $EX_TEMPFAIL; }

> #cat > in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }



> #/usr/bin/altermime --input=in.12 \
> #                   --disclaimer=/etc/postfix/disclaimer.txt \
> #                   --disclaimer-html=/etc/postfix/disclaimer.txt \
> #                   --xheader="X-Copyrighted-Material: Please visit http://www.company.com/privacy.htm" || \
> #                     { echo Message content rejected; exit $EX_UNAVAILABLE; }


> $SENDMAIL -oi "$@" <in.$$

> exit $?

Et ma page PHP :

try {
        $db = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
    } catch (PDOException $e) {
        echo 'Connexion échouée : ' . $e->getMessage();
    }
  
    $file        =    fopen("/var/spool/filter/".$argv[1], "a");

    $from        =    $argv[3];
    $to            =    $argv[5];
  
    $insert        =    $db->prepare('insert into emails (emailfrom, emailto) values (:emailfrom, :emailto)');
    $insert->bindParam(':emailfrom',    $from,    PDO::PARAM_STR);
    $insert->bindParam(':emailto',        $to,    PDO::PARAM_STR);
    $insert->execute();
    $id            =    $db->lastInsertId();
  
    $input = file_get_contents("php://stdin");
  
  
  
    $input = str_replace(
        '</body>',
        '<img src="http://myURL.com/ok/open.php?id='.$id.'" height="1" width="1"/></body>',
        $input
    );
  
    fwrite($file, $input);
  
    fclose($file);

Voilà pour le topo… toute solution ou début de solution est la bienvenue :slight_smile:

D’avance, je vous en remercie !

Si je comprend bien tu signe par DKIM ton message avant de faire tes modif ?
Si c’est bien le cas je t’invite a regarder la page kikipédia sur ce qu’est DKIM et d’inverser l’ordre …

Salut Mimoza,

C’est exactement ça… la signature DKIM intervient avant la modification.
Inverser l’ordre… j’ai tenté mais je n’y arrive pas.

Actuellement; le port 10026 est utilisé en tant que service par postfix et dès qu’un email est émis, il passe via ce service.
Une fois signé, il est retransmis à un autre service tournant derrière le port 10027. Ce dernier servant à l’acheminement du mail.
La route “10027” est définie au niveau du master.cf et l’argument “content_filter” peut être utilisé (pour altérer mon email).

Le problème est que le service de signature (port 10026) n’est pas défini au niveau du master.cf mais “tag_as_originating.re” donc voici le contenu :

/^/ FILTER amavis:[127.0.0.1]:10026

Je ne sais pas si c’est beaucoup plus clair ?

Je comprend a peu près, mais DKIM générant une signature suivant le contenue de ton mail si tu t’amuse à le modifier après, la signature devient invalide. Il faut absolument que tu inverse l’ajout de ton pied de mail à ta signature DKIM.
Je n’ai jamais fait l’exercice que tu es en train de faire donc ne pourrais t’aider bien plus.

Yes tout à fait… c’est là que se situe mon problème… et ma demande en même temps :slight_smile:
Comment inverser les choses ou comment ajouter une opération en amont (qui équivaut en gros à inverser)…

Merci tout de même pour ton aide :wink: !