2010-09-14 9 views
2

J'ai créé un petit script shell qui enregistre toutes ses entrées dans un fichier journal, avec lequel je pensais pouvoir remplacer le binaire sendmail et ainsi obtenir un moyen simple de simuler la livraison d'e-mails sans réellement la mise en place d'un sendmail fonctionnel.Simulation de sendmail avec un script fictif

Cela a échoué, cependant. Pour des raisons que je ne peux pas comprendre. J'ai regardé la source PHP mail.c et autant que je peux comprendre (attention, je ne suis pas très expérimenté en C), PHP s'exécute et parle directement au binaire (défini dans sendmail_path). Mais aucun fichier journal n'est créé lorsque je remplace le fichier binaire sendmail par mon script et que le script qui remplace sendmail crée toujours un fichier journal lorsqu'il est exécuté, qu'il y ait ou non une entrée.

Le script fonctionne correctement. Ses codes de retour doivent être conformes à ceux de sendmail. A la différence que mon script renvoie toujours 0, quelle que soit l'entrée, puisque je ne suis pas vraiment intéressé à vérifier si l'entrée est valide - juste que j'en obtiens.

Est-il possible d'obtenir ce que je veux, c'est-à-dire d'utiliser un simulateur sendmail?

La source de script est fourni ci-dessous:

#!/bin/bash 

LOGDIR=/tmp/sendmail-sim 
NOW=$(date +%Y%m%dT%H%M) 
CNT=1 
FILENAME="$LOGDIR/$NOW.$CNT.log" 

while [ -f $FILENAME ]; do 
    CNT=$(($CNT + 1)) 
    FILENAME="$LOGDIR/$NOW.$CNT.log" 
done 

echo "$0 $*" > $FILENAME 

while read BUF 
do 
    echo $BUF >> $FILENAME 
done 

exit 0 

PS. Mon sendmail actuel (ou en fait, postfix) reçoit des e-mails de PHP, mais je ne veux pas envoyer d'e-mail ou avoir besoin d'aller creuser dans sa file d'attente en développement.

+0

Pour confirmer - votre script sendmail fonctionne lorsqu'il est appelé depuis la ligne de commande, mais pas depuis PHP? Je ne suis pas sur la façon dont fonctionne PHP Runtime mais je me demande s'il essaie de lier dans l'objet binaire mail, plutôt que d'héberger dans l'environnement Unix ?? – JulesLt

+0

Oui, cela fonctionne. Je n'ai pas essayé d'utiliser la commande mail. (Sur un tram maintenant, mais testera bientôt.) –

+0

@Jules: J'ai maintenant testé mon script en utilisant la commande 'mail' et je peux confirmer que cela fonctionne. Maintenant que j'ai révisé le script, il fonctionne même correctement. (La première version, même si elle a fonctionné, ne lit que «stdin» jusqu'à ce qu'une ligne vide, qui a conduit à l'omission de la partie du message.) –

Répondre

0

Le problème était User Error, comme d'habitude. Alors, les garçons et les filles, n'oubliez pas de vérifier les autorisations d'écriture sur tous les dossiers pertinents.

1

Si vous avez besoin de tester la capacité de votre application PHP à formater correctement et envoyer des emails sans les envoyer, je vous suggère d'utiliser le paquet Pear Mail. Finger avec votre système n'est pas une bonne idée.

Si vous utilisez Mail from Pear vous pouvez passer de sendmail à smtp à une implémentation fictive de l'interface de messagerie en changeant le pilote de 'sendmail' ou 'smtp' à 'mock'.

http://pear.php.net/package/Mail/docs/latest/Mail/Mail.html

http://pear.php.net/package/Mail/docs/latest/Mail/Mail_mock.html

Si votre code ressemble à ceci:

mail('[email protected]', 'My Subject', $message); 

changer ensuite pour être testables en utilisant PEAR Mail:

include('Mail.php'); 
function sendEmail($recipient, $subject, $body, $driver = 'mail') { 
    $m = Mail::factory("mail"); 
    $headers = array(
     "From"=>"[email protected]", 
     "To" => $recipient, 
     "Subject"=> $subject); 
    $m->send($recipient, $headers, $body); 
    return $m; 
} 

// In Production: 
sendEmail('[email protected]', 'My Subject', $message); 

// During testing: 
$m = sendEmail('[email protected]', 'My Subject', $message, 'mock'); 
var_dump($m->sentMessages); 

Ceci est très brut, puisque vous devriez utiliser PHPUnit ou SimpleTest, mais c'est un sujet pour un autre temps et lieu :)

+0

J'apprécie l'entrée, mais j'ai besoin d'une solution qui fonctionnera indépendamment de la technologie, pas seulement pour les scripts PHP. PHP était bien sûr la raison originale pour écrire cela, mais il a été trouvé utile plus tard avec, par exemple, scripts shell. Les séquences sèches peuvent avoir une couche d'abstraction de moins dans leur simulation. –

+0

Même si mon exemple était pour PHP, je pense que vous devez utiliser une méthode similaire pour les autres langages au lieu de remplacer les binaires système. Si vous les remplacez, vous aurez des problèmes. 1. Votre logiciel fonctionnera différemment sur une autre machine jusqu'à ce que vous remplaciez le binaire. 2. Les autres logiciels fonctionnant sur la même machine se comporteront différemment que prévu. –

1

Une note, si vous voulez juste saisir stdin et écrire dans un fichier, vous n'avez pas besoin de boucler une ligne à la fois: vous pouvez écrire

cat - >> $FILENAME 
2

Je l'ai utilisé pour FakeMail ce but dans le passé. Il accepte les connexions SMTP mais écrit tout le courrier dans les fichiers au lieu de les envoyer par courrier électronique. Il existe à la fois des implémentations Python et Perl.

http://www.lastcraft.com/fakemail.php

Nous apache de configuration pour servir le répertoire FakeMail écrivait à. C'était un moyen simple et rapide pour le personnel de consulter les messages reçus par Fakemail et de vérifier le contenu, la destination, etc. La mise en forme des emails HTML était un peu étrange pour diverses raisons, ce qui n'était pas très utile pour vérifier le formatage des emails html .