Script minimaliste : nettoyer une boite aux lettres avec une expression rationnelle
Par Yves Tannier le vendredi, avril 11 2008, 22:13 - Le PHP - Lien permanent
Dans la catégorie des scripts minimalistes (mais néanmoins utiles), je vous propose un petit script qui permet d'effacer, en ligne de commande avec PHP CLI, certains messages d'un compte mail en fonction d'une expression régulière précisée en paramètre et qui matche le sujet du mail.
Par exemple, effacer les centaines de messages de spam qui se trouvent dans une de vos nombreuses boites tant inutiles que nécessaires
Autre exemple, j'exécute ce script via un cron pour nettoyer tous ce qui traine dans des boites genre postmaster, abuse (encore que cette dernière n'est pas trop pourrie par le SPAM), et autres bal « no-reply » qu'il reste quand même, pour certaines, nécessaires de consulter tous les ans régulièrement.
C'est un script clairement dédié à de la maintenance. Je vous déconseille de laisser trainer ce code n'importe ou accessible via le web.
Utilisation :
cleanmail -u=nom_utilisateur -p=mot_de_passe -s=imap.mondomain.tld:143 -e="/SPAM/i"
Pour être sur que tous le monde a compris :
- -u= nom d'utilisateur du compte mail
- -p= mot de passe du compte mail
- -s= serveur (pop ou imap). Toutes les options disponibles sur la fonction imap_open de PHP sont disponible
- -e= expression régulière qui sera « passée » à preg_match
Le script :
#!/usr/bin/php
<?php
// on supprime la limite d'éxecution d'un script php
set_time_limit(0);
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* cleanmail supprimer des mails d'une boite imap avec une pattern définie
*
* PHP versions 5
*
* LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
*
* @author Yves Tannier <yvesSANSPAM grafactory.net>
* @copyright 2008 Yves Tannier
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version 0.1.0
* @link http://www.grafactory.net
*/
// aide contextuelle
$help_string = "Parametres :
-u : utilisateur
-p : mot de passe
-s : serveur et port (localhost:143, localhost:110, localhost:143/novalidate-cert...)
-e : expression régulière
-h, --help : afficher cette aide...\n\n";
// recuperer les parametres passe en CLI
foreach($_SERVER['argv'] as $param) {
// utilisateur
if(strpos($param,"u=")) {
$login_imap = str_replace("-u=","",$param);
continue;
}
// mot de passe
if(strpos($param,"p=")) {
$passwd_imap = str_replace("-p=","",$param);
continue;
}
// serveur et port
if(strpos($param,"s=")) {
$server_imap = str_replace("-s=","",$param);
continue;
}
// expression reguliere
if(strpos($param,"e=")) {
$pattern = str_replace('-e=','',$param);
continue;
}
switch($param) {
case '-h' :
case '--help' :
echo $help_string;
exit();
case $_SERVER['SCRIPT_NAME'] :
unset ($_SERVER['argv'][0]);
break;
default :
echo "\nParamètre inconnu : ".$param."\n\n";
exit();
}
}
// pas d'argument
if (empty($_SERVER['argv'])) {
echo "\nVeuillez preciser au moins un paramètre !\n\n";
echo $help_string;
exit();
}
// connexion
$mbox = imap_open("{".$server_imap."}INBOX", $login_imap, $passwd_imap)
or die("Impossible de se connecter : ".imap_last_error());
echo "Connexion...\n";
// recup des headers
$headers = imap_headers($mbox);
// parcourir les messages
if(!empty($headers)) {
echo "Recherche avec l'expression : ".$pattern."\n";
$msgnum = 0;
foreach ($headers as $val) {
$msgnum = $msgnum + 1;
$header = imap_headerinfo($mbox, $msgnum);
$subject = $header->subject;
if (preg_match($pattern, $subject)) {
$mailmarked = imap_delete($mbox, $msgnum);
echo "Message ".$msgnum." supprimé\n";
}
}
} else {
echo "Aucun message dans la boite\n";
}
echo "Fin de la transaction\n";
// quitter et vider en meme temps
imap_close($mbox,CL_EXPUNGE);
?>
Bientôt le même mais en perl 
Commentaires