courte histoirede script PHP filtrage de courrier: codes de sortie ne sont pas reconnus dans le fichier .qmail
J'ai un script PHP filtrant le courrier entrant à l'aide d'un fichier .qmail. Le script fonctionne parfaitement et enregistre toute activité mais, autant que je sache, la dernière ligne .qmail ne devrait pas être exécutée quand mon script retourne un code de sortie point-qmail 99 qui devrait arrêter de traiter d'autres lignes .qmail.
longue histoire:
J'utilise une version de Parallels Plesk Panel 9.3.0 sous Linux 2.6.18-4-686.
Ma version CLI PHP est 5.2.0-8 + etch16 (cli) (construit: Nov 24 2009 11:14:47). Je ne suis pas satisfait de Spamassassin, Dr. Web et zen.spamhaus.org et de leurs résultats, j'ai décidé de créer mon propre script PHP pour filtrer tout le courrier entrant.
(À part quelques-uns d'entre vous qui pourraient penser «ce type réinvente la roue»: je connais personnellement mes clients et leurs besoins spécifiques, après des milliers de tests, cela s'est avéré être la meilleure option modèles de boîte noire et me permet de contrôler le processus de manière exhaustive, libérant également les ressources du serveur et ouvrant la voie à d'autres fonctionnalités intéressantes).
Cependant, j'ai du mal à installer le script sur le serveur.
QMailFilter est mon script et vous pouvez le voir à http://titanpad.com/1IFDj1jvB0
J'édité un fichier .qmail existant /var/qmail/mailnames/customerdomain.com/username/.qmail
être:
|/var/my/qmailfilter/qmailfilter
|/usr/bin/deliverquota ./Maildir
QMailFilter script PHP exécute et les journaux parfaitement quand j'envoie un message renvoie à ce compte d'utilisateur le code de sortie (99 pour l'élimination du message et 0 pour passer à la ligne .qmail suivante qui envoie le message).
Il s'avère qu'il délivre le message indépendamment des nombreux codes de sortie que j'ai déjà essayés.
Le script (voir ligne 174) génère un code de sortie de texte sans aucun espace avant ou après. J'ai essayé exit($code)
, print $code
, echo($code)
et même file_put_contents("php://stdout", $code)
, ainsi que exit(chr($code))
.
dot-qmail
codes sont les suivants:
0 - Succès (aller à la ligne suivante .qmail)
99 - Succès et abort (ne pas exécuter lignes suivantes)
100 - erreur permanente (rebond)
111 - erreur douce (réessayer plus tard)
Source: The Big Qmail Image.
Autres tentatives/expériences:
Suppression de la tralala ligne (
#!/usr/bin/php
) et changé la première ligne.qmail
-|php -q /var/my/qmailfilter/qmailfilter
a vérifié la dernière ligne du script pour whitespacing
Lire le fichier man dot-qmail mais rien de concluant n'a été trouvé
Inscrit .qmail lignes:
|/var/ma/QMailFilter/QMailFilter |/usr/bin/deliverquota ./Maildir
Dans ce cas, je reçu un message ayant seulement le bon renvoyer le code sans en-tête, sujet ou corps du message.
ont commenté sur (#) la deuxième ligne
.qmail
, mais a cessé de recevoir tout type de messages.Edité
/var/qmail/control/defaultdelivery
ajouter une première ligne:| php/var/ma/QMailFilter/QMailFilter |/usr/bin/deliverquota ./Maildir
et renommé utilisateur .qmail
fichier à _qmail
. Mêmes résultats
Dois-je livrer le message via un script PHP et oublier les codes de sortie?
Si oui, suffit-il d'enregistrer le message à l'utilisateur Maildir/new?
Si oui, le nom du fichier est-il important?
Une idée sera appréciée. Merci beaucoup!
MISE À JOUR: Pour ceux d'entre vous qui en ont besoin, je publie le script final à icebex.com slash QMailFilter
Il fonctionne. Merci, konforce, bonne aide. Je n'ai jamais eu cette notion de PHP "renvoyant" des choses invisibles à l'extérieur quand un script est terminé. Maintenant, je le vois dans le manuel PHP, la fonction exit(): "Si l'état est une chaîne, cette fonction imprime l'état juste avant de quitter." " Si l'état est un nombre entier, cette valeur sera utilisée comme état de sortie et non imprimée. Les statuts de sortie doivent être compris entre 0 et 254, l'état de sortie 255 est réservé par PHP et ne doit pas être utilisé. – HelpfulPanda
Alors que le comportement dual de 'exit' est une singularité PHP, chaque programme qui se termine a un code de retour invisible (par exemple, sous beaucoup de shells Linux,' echo $? ' à la sortie du programme, le code sera révélé.) Il est très courant d'utiliser ce code pour déterminer si un programme s'est exécuté avec succès. – Matthew