Postfix // récriture d'adresse Sender // Web mutualisé

Bonjour;

J’administre un serveur tournant sous Debian Lenny avec PHP5.2 et postfix comme solution d’envoi de mail.
Le serveur héberge plus de 500 sites web est je me trouve avec des mails envoyer via des scripts php avec le champs FROM comme www-data@mydomaine.com.

mydomaine est le domaine local déclaré pour postfix.

Ci-dessous un exemple de log:

Sep 17 12:43:07 WEB-SRV postfix/pickup[11935]: D7C3C156143: uid=33 from=
Sep 17 12:43:07 WEB-SRV postfix/cleanup[11943]: D7C3C156143: message-id=20120917114307.D7C3C156143@web54.mydomaine.com
Sep 17 12:43:07 WEB-SRV postfix/qmgr[11936]: D7C3C156143: from=www-data@mydomaine.com, size=405, nrcpt=1 (queue active)
Sep 17 12:43:10 WEB-SRV postfix/smtp[11945]: D7C3C156143: to=adresse@vers-domaine.tn, relay=smtp.server.com[smtp.server.com]:25, delay=2.2, delays=0.09/0.02/2/0.11, dsn=2.0.0, status=sent (250 54521116 message accepted for delivery)
Sep 17 12:43:10 WEB-SRV postfix/qmgr[11936]: D7C3C156143: removed

Ce que je veux c’est que je force tous les sites web de telle sorte que les champs FROM soient telleque:

from: adresse@site.com

Merci pour votre aide.

salut

dans etc/postfix crée le fichier canonical

dedans met

aprés tu fait

dans le /etc/postfix/main.cf
rajoute la ligne

force postfix à relire le fichier en faisant postfix reload.

a+

Merci pour la réponse, mais là tous les mails serons envoyer avec adresse@site.com

moi se que je veut c’est que @site.com soit = vhost

si j’envoi un mail à partir du site1.com le from devient adresse@site1.com pour le vhost site1.com
si j’envoi un mail à partir du site2.com le from devient adresse@site2.com pour le vhost site2.com
si j’envoi un mail à partir du site-n.com le from devient adresse@site-n.com pour le vhost site-n.com
etc…

possible?

oui

il faut parametrer postfix en multidomaine

[quote=“gilles974”]oui
il faut parametrer postfix en multidomaine[/quote]

Virtuel, non ?

Utilise cette directive de php dans chacun des fichiers php.ini ou des vhosts :

PS : il serait temps de migrer vers la branche stable :wink:

Merci pour les réponses.

@ Niloo: pouvez vous dévelopez votre pensé. Si la migration vers autres chose peut mieux m’aider, pouvez vous me metre sur la bonne route. :slightly_smiling:

Il faut savoir que :

  • actuellement : lenny = oldstable, squeeze = stable et wheezy = testing
  • quand wheezy va passer stable, squeeze va passer oldstable et lenny ne sera plus maintenu donc plus de mise à jour de sécurité.

La migration ne résoudra pas ton soucis (sauf contre indication, on peut se tutoyer).
Mais elle est vivement conseillé avec des sauvegardes complètes faites avant évidement :smiley:

Re-salut tout le monde;

Je reviens vers ce sujet que j’ai délaissé un peut pour d’autres projets.

bon, je viens de trouver une idées basé sur ce qu’a dit “Niloo” et sur les options du demon sendmail, l’option “-f” pour préciser qui surcharge la valeur “Return-Path” si je me trompe pas.

J’ai besoin un peut d’aide dans l’écriture d’un code php qui parse la sortie “stdin” au moment de l’appel de la fonction php mail() par apache et force l’ajout d’un ‘-f $from’ dans les arguments de la fonction mail et puis renvoyer le tous vers sendmail.

Voici mon php d’envoi d’un test mail:

Les adresses sont factices :slightly_smiling:

<?php

     $from    = 'de_test@gmail.com';
     $to      = 'vers_test@gmail.com';
     $subject = 'Test Mail via php';
     $message = 'Bonjour, ceci est un test via un script php!';
     $headers = 'From:'.$from. "\r\n" .
     'Reply-To: ' .$from. "\r\n" .
     'X-Mailer: PHP/' . phpversion();
     mail($to, $subject, $message, $headers);
echo 'Mail sent.';
?>[/code]

en fait, par défaut sendmail va mettre le user qui lui a fait appel comme "Return-path" ça veut dire www-data + @$mydomaine ce qui donne [www-data@domaine.local](mailto:www-data@domaine.local) dans notre cas.

dans la config du php.ini j'ai surchargé la valeur "sendmail path" comme suit et ceci afin de parser la sortie "stdin":

[code]sendmail_path = /usr/local/bin/phpsendmail[/code] 

Je me suis inspirais d'un tuto qui m'a aidé a retracé un script spameur sur mon serveur suivez le lien pour mieux comprendre:

[url]http://www.directadmin.com/forum/showthread.php?t=36311&page=1[/url]

Voici mon code qui va faire la surcharge:

[code]#!/usr/local/bin/php
<?php
$sendmail_bin = '/usr/sbin/sendmail';
$from = '';
//* Get the email content
$logline = '';
$pointer = fopen('php://stdin', 'r');

while ($line = fgets($pointer))
        {
        if(preg_match('/^from:/i', $line))
                {
                $from .= trim($line);
                }
        $mail .= $line;
        }

//* compose the sendmail command
$command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i -f '. $from;
for ($i = 1; $i < $_SERVER['argc']; $i++)
       {
       $command .= escapeshellarg($_SERVER['argv'][$i]).' ';
       }

//* Execute the command
return shell_exec($command);
?>[/code]


Voici ce ça donne au niveau log postfix:

[code]Nov  4 15:49:59 debian postfix/pickup[7090]: CFF531D348: uid=33 from=<From:de_test@gmail.com>
Nov  4 15:49:59 debian postfix/cleanup[7756]: CFF531D348: message-id=<20121104144959.CFF531D348@debian.localdomain>
Nov  4 15:49:59 debian postfix/qmgr[5940]: CFF531D348: from=<From:de_test@gmail.com>, size=407, nrcpt=1 (queue active)
Nov  4 15:50:05 debian postfix/smtp[7759]: CFF531D348: to=<vers_test@gmail.com>, relay=smtp.relay.com[19.55.12.25]:25, delay=5.6, delays=0.07/0/5.2/0.34, dsn=2.0.0, status=sent (250 171755007 message accepted for delivery)
Nov  4 15:50:05 debian postfix/qmgr[5940]: CFF531D348: removed

C’est OK, j’ai bien réussi :slightly_smiling: :slightly_smiling: :slightly_smiling:

pour finir voila l’entête mail reçu par Gmail:

[code]Delivered-To: vers_test@gmail.com
Received: by 10.58.211.199 with SMTP id ne7csp150795vec;
Sun, 4 Nov 2012 07:04:25 -0800 (PST)
Received: by 10.180.84.41 with SMTP id v9mr9553948wiy.8.1352041465245;
Sun, 04 Nov 2012 07:04:25 -0800 (PST)
Return-Path: From:de_test@gmail.com
Received: from ***************************************************************** // Je cache cette partie, c’est mon serveur relay :slight_smile:
by mx.google.com with ESMTP id y49si648781wen.114.2012.11.04.07.04.24;
Sun, 04 Nov 2012 07:04:25 -0800 (PST)
Received-SPF: neutral (google.com: .***.***. is neither permitted nor denied by best guess record for domain of From:de_test@gmail.com) client-ip=***.***.***.***;
Authentication-Results: mx.google.com; spf=neutral (google.com: .***.***. is neither permitted nor denied by best guess record for domain of From:de_test@gmail.com) smtp.mail=From:de_test@planet.tn
Received: from ************************************************ // Je cache cette partie, c’est mon serveur relay :slight_smile:
by .***.***. (Postfix) with SMTP id 938D1BD805C
for vers_test@gmail.com; Sun, 4 Nov 2012 16:04:24 +0100 (CET)
X-Junk-Score: 2 [X]
X-SpamCatcher-Score: 2 [X]
Received: from [***.***.***.***] (HELO debian.localdomain)
by ************************************************ // Je cache cette partie, c’est mon serveur relay :slight_smile:
with ESMTP id 171667601 for vers_test@gmail.com; Sun, 04 Nov 2012 16:04:07 +0100
Received: by debian.localdomain (Postfix, from userid 33)
id BAB181D348; Sun, 4 Nov 2012 15:40:15 +0100 (CET)
To: vers_test@gmail.com
Subject: Test Mail via php
From: de_test@gmail.com
Reply-To: de_test@gmail.com
X-Mailer: PHP/5.3.3-7+squeeze3
Message-Id: 20121104144015.BAB181D348@debian.localdomain
Date: Sun, 4 Nov 2012 15:40:15 +0100 (CET)

Bonjour, ceci est un test via un script php![/code]

Reste maintenant a optimisé le code, je l’es pas encore tester en Prod et je ne sais pas trop ce que les webmaster utilisent comme autres arguments dans la fonction mail() et si ça sera compatible ou non.

Alors si vous avez un avis, merci de participer :slightly_smiling: en plus ça pourrait aider d’autres.

Bonjour;

Je viens de trouver une erreur dans mon script que j’ai corrigé, le probléme est que le “Return-Path” s’ecrit à la fin comme ceci:

il y a “From:” qui est de plus, je l’es enlevais en ajoutant un controle de la structure de l’adresse avec des regex, le code devient comme ca:

[code]#!/usr/local/bin/php

<?php $sendmail_bin = '/usr/sbin/sendmail'; $from = ''; //* Get the email content $logline = ''; $pointer = fopen('php://stdin', 'r'); while ($line = fgets($pointer)) { if(preg_match('/^from:/i', $line)) { $from .= trim($line); $regexx="/(?:[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*|\"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/"; preg_match_all($regexx, $from, $matches); $result = array_merge($matches, $matches[0]); $from = $result[1]; } $mail .= $line; } //* compose the sendmail command $command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i -f '. $from; for ($i = 1; $i < $_SERVER['argc']; $i++) { $command .= escapeshellarg($_SERVER['argv'][$i]).' '; } //* Execute the command return shell_exec($command); ?>[/code]