Bonjour,
Avant de vous exposer ce que je veut faire, je vous expose mon environnement (mail sur serveur Debian Lenny).
Logiciels installés : Postfix (patché avec VDA), courier(authmysql, pop, imap), amavis, clamav et spamassassin.
Je voudrais rajouter maildrop comme MDA afin de pouvoir envoyer les spam dans un dossier spam dans le home de l'utilisateur (et donc consultable par ce dernier).
Mon problème est le suivant : L'authentification via MySQL utilise comme identifiant un champ qui n'a rien à voire avec l'adresse e-mail hors dans le fichier master.cf de postfix je peut utiliser les champs : ${recipient} ${user} ${nexthop} ${sender} (ou bien, l'adresse complète, le préfixe, la dns ou l'expéditeur) mais pas mon champ.
La solution la plus simple pour moi est donc d'écrire un wrapper pour maildrop qui me trouve le login à partir de l'adresse e-mail complète (en gros l'idée serait de récupérer le login via une requête SQL, ensuite de lancer maildrop et d'écrire dans son stdin en lisant le stdin du wrapper).
Bon, jusque là tout va bien (dans la théorie). Maintenant je fait un bête test : je retire un email de mon répertoire new pour le mettre n'importe ou ailleurs puis je lance la commande cat le_mail | le_wrapper.php henry.nicolas@tourneur.be et là je m'attend à ce que maildrop remette l'e-mail dans le répertoire new et ben non.
Le script est disponible ici.
Il me donne un code de retour de valeur 75 et ne m'affiche rien de particulier et surtout le mail n'est pas envoyé dans le répertoire de l'utilisateur.
Alors si quelqu'un peut me filer un coup de main, soit si vous avez un méthode plus facile, soit s'il y a moyen de corriger ce script, ce serait sympathique de m'aider.
# pas grand chose
Posté par NeoX . Évalué à 2.
http://fr.php.net/proc_open
mais tu fais un fwrite de ton stdin plutot que fopen$process = proc_open($command, $descriptorspec, [1]$pipes, $cwd, [2]$env);
if(is_resource($process)) {
fwrite($pipes[0], 'php://stdin');//send the email
fclose($pipes[0]);//close the input
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);//maildrop shouldn't display anything
$return_value = proc_close($process);
echo 'traceur : '.$return_value;
exit($return_value);
}
[1] $pipes doit etre defini
[2] $env doit contenir les variables d'environnement à passer à la commande sous forme d'un tableau ou NULL s'il faut utiliser l'environnement de PHP
alors que toi tu fait un env=array() mais tu ne le remplis pas
bref il semblerait qu'il y ait qques corrections à faire.
[^] # Re: pas grand chose
Posté par pi6Lohe . Évalué à 2.
La version anglaise dit "pipes : Will be set to an indexed array of file pointers...". En fait, comme c'est une variable passée par référence, elle devrait être déclarée mais ca fonctionne quand même.
fwrite($pipes[0], 'php://stdin');//send the email
C'est la chaine 'php://stdin' qui est envoyé sur $pipes[0] et non le contenu de stdin.
Le code suivant devrait fonctionner :
if(is_resource($process)) {
$stdin = fopen("php://stdin", "r");
while(!feof($stdin)) { // send the email
$data = fgets($stdin,4096 )));
fwrite($pipes[0], $data);
}
fclose($pipes[0]);//close the input
...
}
[^] # Re: pas grand chose
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
Au final ça marche, le script est dispo à la même adresse.
J'ai juste eu une ou deux erreurs à cause de la config de maildrop mais rien de bien bien grave.
Encore merci pour l'aide.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.