histoire de savoir si on a reçu des mails
Posté : 12 sept. 2005, 13:47
salut,
comme je n'utilise pas outlook ou autres thunderbird je me suis fait un script utilisant php-gtk pour vérifiers l'arrivé de mail sur mes différentes boîtes(j'imagine qu'il y a des progs similaires sur le net mais c'était aussi histoire de tester quelques trucs).
donc ça permet de vérifier une ou plusieurs boîtes toutes les n minutes, et supporte les protocoles pop, imap et les connexions ssl.
ça a été testé sous linux(devrait fonctionner sous windows) avec php4.3.11 en cgi, php-gtk 1.0.2, imap et imap-ssl(sert pour certaines boîtes), donc rien de bien sélectif en somme.
ça nécessites aussi un "fichier de configuration" avec une ligne pour chaque boîte mail.
le script est fait pour tourner en tache de fond et après plusieurs jours de tests le proc ne s'affole pas et les messages des différentes boîtes ne sont pas corrompu, mais comme c'est la première fois que j'utilise php-gtk je préfère prévenir que rien n'est garantie.
pour rajouter du charme le script s'arrête de cette façon...
donc si ça interresse au moins une personne(on peut toujours rêver) alors je n'aurais pas perdu mon temps à le proposer ici.
une ligne du fichier de conf est de la forme:
http://fr3.php.net/manual/fr/function.imap-open.php
exemple avec différentes boîtes avec ou sans ssl
après ça roule tout seul.
le script
comme je n'utilise pas outlook ou autres thunderbird je me suis fait un script utilisant php-gtk pour vérifiers l'arrivé de mail sur mes différentes boîtes(j'imagine qu'il y a des progs similaires sur le net mais c'était aussi histoire de tester quelques trucs).
donc ça permet de vérifier une ou plusieurs boîtes toutes les n minutes, et supporte les protocoles pop, imap et les connexions ssl.
ça a été testé sous linux(devrait fonctionner sous windows) avec php4.3.11 en cgi, php-gtk 1.0.2, imap et imap-ssl(sert pour certaines boîtes), donc rien de bien sélectif en somme.
ça nécessites aussi un "fichier de configuration" avec une ligne pour chaque boîte mail.
le script est fait pour tourner en tache de fond et après plusieurs jours de tests le proc ne s'affole pas et les messages des différentes boîtes ne sont pas corrompu, mais comme c'est la première fois que j'utilise php-gtk je préfère prévenir que rien n'est garantie.
pour rajouter du charme le script s'arrête de cette façon...
...mais c'est aussi parceque je n'ai pas trouvé le moyen de le mettre un icone dans la barre des taches.killall -v nom_script
donc si ça interresse au moins une personne(on peut toujours rêver) alors je n'aurais pas perdu mon temps à le proposer ici.
une ligne du fichier de conf est de la forme:
plus d'info sur la chaîne de connection:chaîne_connection_imap,pseudo,mot_de_passe,adresse_mail,timestamp
http://fr3.php.net/manual/fr/function.imap-open.php
exemple avec différentes boîtes avec ou sans ssl
en mettant un timestamp de 0 ça permet de tester que tout marche bien pour le premier lancement, vu que si les boîtes ne sont pas vides le script pensera qu'il y a un nouveau mail.{pop.gmail.com:995/pop3/ssl}INBOX,[email protected],abcd,[email protected],0
{pop.free.fr:110/pop3}INBOX,tutu,xyz,[email protected],0
après ça roule tout seul.
le script
#! /chemin/vers/binaire/php -q
<?php
//sert s'il n'y a pas d'entree dans le php.ini pour php-gtk:
//->pour linux
//if(!class_exists('gtk')) dl('php_gtk.so');
//->pour windows
//if(!class_exists('gtk')) dl('php_gtk.dll');
/////////////////////////////////////////////////////////////////////////////
//quelques configurations supplementaires:
//
//possibilite d'obtenir les erreurs exacts de php dans un fichier de log
//sinon commenter les deux ini_set
ini_set('log_errors','On');
ini_set('error_log','/chemin/vers/fichier.log');
//
//definie en minute le temps entre les verifications
define('INTERVAL',nb_minute);
//comme son nom l'indique
define('FICHIER_CONF','/chemin/vers/fichier.conf');
//////////////////////////////////////////////////////////////////////////////
init();
gtk::main();
function init()
{
global $fp;
global $nom_tmp;
global $fp_tmp;
global $conf;
global $info;
global $i;
$info=null;
$fp=fopen(FICHIER_CONF,'r') or erreur('Impossible d\'ouvrir le fichier de configuration');
$nom_tmp=tempnam('/tmp','') or erreur('Impossible de creer le fichier temporaire dans /tmp');
$fp_tmp=fopen($nom_tmp,'a') or erreur('Impossible d\'ouvrir le fichier temporaire');
$i=0;
//verifie aussi qu'il n'y a pas une ligne vide en trop dans le conf, ça evite de planter
while(($conf = fgetcsv($fp, 1024, ',')) && ($conf[0]!=""))
{
check($i);
}
nv_conf();
if(!empty($info)) affiche_mail();
//'else' traite le cas ou la fenetre de mail n'as pas ete appele.
//par defaut, pour que le script reprenne il faut fermer la fenetre qui previent de
//l'arrive de(s) mail(s)(donc pas de multiples fenetres en cas de reception
//de plusieurs mails si l'on doit s'absenter).
//
//sinon commenter le else ainsi que la ligne 158, et decommenter la ligne en dessous.
else interval();
//ligne a decommenter selon preference
//interval();
}
//verifie l'arrive des mails en fonction des parametres du fichier de conf
function check($i)
{
global $conf;
$res=imap_open($conf[0],$conf[1],$conf[2]) or erreur('Impossible de se connecter a '.$conf[3]);
//gere le cas ou la boite est vide
$nb_msg=imap_num_msg($res) or gerefichier();
$mail=$conf[3];
//boucle sur les messages d'une boite(voir les possibilites de messages présents dans INBOX)
while($nb_msg>0)
{
$header=imap_headerinfo($res,$nb_msg);
$mail_de=$header->from[0]->mailbox.'@'.$header->from[0]->host;
//certains comptes sauvegardent les messages que l'on envoi dans INBOX(cas de gmail)
//donc verifier que ce n'est pas un message qui a ete envoye par la meme adresse que la boite qui est verifiee
if($mail_de==$mail) $nb_msg--;
//compare le timestamp du dernier message avec le timestamp present dans le fichier de conf
elseif($header->udate>$conf[4]){
//les comptes pop3 ne gerent pas les flags seen/unseen(voir cas imap)
//...du moins je n'ai pas reussi meme en passant par les sockets
if(strpos($conf[0],'pop3')){
$conf[4]=$header->udate;
gtrouvey($mail,$mail_de);
break;}
//inutile d'appeler le popup si le mail a deja ete vu(cas serveur imap)
elseif($header->Unseen=='U' || $header->Recent=='N'){
$conf[4]=$header->udate;
gerefichier();
break;}
else{
$conf[4]=$header->udate;
gtrouvey($mail,$mail_de);
break;}
}
//la date du dernier mail reçu n'est pas recente
//donc on sort en gerant le fichier de conf en cas de plusieurs adresses mails
//histoire de ne pas se retrouver avec un fichier corrompu
else{
$conf[4]=$header->udate;
gerefichier();
break;}
}
imap_close($res) or erreur('Impossible de fermer la connection au serveur');
}
function gtrouvey($mail,$mail_de)
{
global $info;
global $i;
//met en memoire les infos qui ont ete trouve
$info[$i][0]=$mail;
$info[$i][1]=$mail_de;
$i++;
gerefichier();
}
//ecrit dans un fichier temporaire les nouvelles infos du serveur(en fait principalement
//pour le timestamp du dernier message).
function gerefichier()
{
global $conf;
global $fp_tmp;
fputs($fp_tmp,$conf[0].','.$conf[1].','.$conf[2].','.$conf[3].','.$conf[4]."\n") or erreur('Impossible d\'ecrire dans le fichier temporaire');
}
function nv_conf()
{
global $nom_tmp;
copy($nom_tmp,FICHIER_CONF) or erreur('Impossible de creer le nouveau fichier de configuration');
unlink($nom_tmp) or erreur('Impossible d\'effacer le fichier temporaire');
}
//gere la fenetre popup qui affiche le(s) mail(s) qui sont trouves
function affiche_mail()
{
global $info;
$nb_trouve=count($info);
$hauteur=80+($nb_trouve*40);
$fenetre=&new GtkWindow();
$fenetre->set_title('Verif Mail');
$fenetre->set_usize(350,$hauteur);
$fenetre->set_policy(false,false,false);
$fenetre->set_position(GTK_WIN_POS_CENTER);
//ligne a commenter selon preference
$fenetre->connect('destroy','interval');
$boite=&new GtkVBox();
$label_titre=&new GtkLabel('Nouveau(x) Mail(s)');
$boite->pack_start($label_titre,false,false,10);
//construit les labels qui informent l'arrivee de nouveaux mails
$label_mail=array();
for($i=0;$i<$nb_trouve;$i++)
{
$label_mail[$i]=&new GtkLabel($info[$i][1].' -> '.$info[$i][0]);
$boite->pack_start($label_mail[$i],false,false,10);
}
$btn=&new GtkButton('Ferme');
$btn->Set_Flags(GTK_CAN_DEFAULT);
$btn->connect('clicked','ferme',$fenetre);
$boite->pack_start($btn,false,false,10);
$fenetre->add($boite);
$fenetre->show_all();
}
function interval()
{
//l'interval s'exprime en milliseconde
$int=INTERVAL*60*1000;
gtk::timeout_add($int,'init');
}
//c'est ce qui est appele lorsque la fenetre d'erreur est fermee afin de quitter le script
function quitte()
{
gtk::main_quit();
exit();
}
function ferme($self,$fen)
{
$fen->destroy();
}
//la fenetre qui affiche les erreurs c'est ici
function erreur($message)
{
global $nom_tmp;
unlink($nom_tmp);
$fen_err=&new GtkWindow();
$fen_err->connect('destroy','quitte');
$fen_err->set_title('Erreur');
$fen_err->set_usize(500,70);
$fen_err->set_policy(false,false,false);
$fen_err->set_position(GTK_WIN_POS_CENTER);
$btn_err=&new GtkButton('Quitter');
$btn_err->Set_Flags(GTK_CAN_DEFAULT);
$btn_err->connect('clicked','ferme',$fen_err);
$label_err=&new GtkLabel($message);
$boite_err=&new GtkVBox();
$boite_err->pack_start($label_err,false,false,10);
$boite_err->pack_start($btn_err,false,false,0);
$fen_err->add($boite_err);
$fen_err->show_all();
gtk::main();
}
?>