Class webmail

Soyez le premier à donner votre avis sur cette source.

Vue 11 320 fois - Téléchargée 1 149 fois

Description

Voici une classe que j'utilise pour mon site perso. Elle permet de lister les boîtes mails et de lire les mails avec pièces jointes.

Source / Exemple :


<?
	/*

  • r = ressource
b = boolean s = string i = integer o = object (class)
  • /
class WebMail { private $rFlux; private $sServeur; private $sServeur_option; private $sCurrent_boite; private $sUtilisateur; private $sPassword; private $iNb_msg; private $iNb_unread_msg; private $sDomaine = "generationweb.be"; private $aBoites = Array(); //tableau des boîtes private $aApercu = Array(); //tableau d'aperçu d'une boîte private $sMailFormat = "PLAIN"; // HTML ou PLAIN private $sSelectBoxes = ""; // contient le code HTML d'une liste déroulante contenant les boîtes mail. //accesseur function getFlux() { return $this->rFlux;} function getServeur() { return $this->serveur;} function getCurrentBoite() { return $this->sCurrent_boite;} function getUtilisateur() { return $this->utilisateur;} function getBoxeCount() { return sizeof($this->aBoites);} //############################## constructeur ########################################## function __construct ( $sServ = "", $sSrv_opt = "", Utilisateur $oUser ) { // test des paramètres try { if (!is_string($sServ)) throw new exception('erreur : WebMail(). sServ must be a string'); if (!is_string($sSrv_opt)) throw new exception('erreur : WebMail(). sSrv_opt must be a string'); if(!is_object($oUser)) throw new exception('erreur : WebMail(). sSrv_opt must be a object'); } catch (Exception $e) { echo $e->getMessage()."\n"; return false; } // fin : test des paramètres // affectation $this->sServeur = "{".$sServ."}"; // {pop.generationweb.be} $this->sServeur_option = "{".$sServ."/".$sSrv_opt."}"; // {pop.generationweb.be/norsh} $this->sCurrent_boite = "INBOX"; // boîte par défaut $this->sUtilisateur = $oUser->getPseudo(); // login du compte mail $this->sPassword = $oUser->getPassword(); // password du compte mail $this->iNb_msg = 0; // nombre de message $this->iNb_unread_msg = 0; // nombre de message non lus } /**
  • @name open
  • Ouvrir une boîte mail
  • @param String sBoite : nom de la boîte à ouvrir
*
  • @return true | false.
  • /
public function open ($sBox = "") { // test du paramètre try { if (!is_string($sBox)) throw new exception('erreur : WebMail->Open(). sBox must be a string'); } catch (Exception $e) { echo $e->getMessage()."\n"; return false; } // fin : test du paramètre // affectation $this->sCurrent_boite = "".$sBox; // ouverture de la boite $this->rFlux = imap_open($this->sServeur_option.$this->sCurrent_boite, $this->sUtilisateur."@".$this->sDomaine, $this->sPassword); // retour if ($this->rFlux) return true; else return false; } /**
  • @name close
  • Fermer une boîte mail
*
  • @return true | false.
  • /
public function close () { return imap_close($this->rFlux); } /**
  • @name supprimer
  • Supprimer un message
*
  • @return true | false.
  • /
public function supprimer( $iIdMsg) { // test du paramètre try { if (!is_numeric($iIdMsg)) throw new exception('erreur : WebMail->supprimer(). iIdMsg must be a numeric'); } catch (Exception $e) { echo $e->getMessage()."\n"; return false; } // fin : test du paramètre if( $this->sCurrent_boite == "INBOX.Trash") { imap_delete($this->rFlux, $iIdMsg); // suppression de la poubelle imap_expunge($this->rFlux); return true; } else { imap_mail_move($this->rFlux, $iIdMsg, "INBOX.Trash"); // déplacement dans la poubelle imap_expunge($this->rFlux); return true; } } /**
  • @name déplacer
  • Déplacer un message
*
  • @return true | false.
  • /
function deplacer( $iIdMsg, $sBoxTo) { // test des paramètres try { if (!is_numeric($iIdMsg)) throw new exception('erreur : WebMail->deplacer(). iIdMsg must be a numeric'); if (!is_string($sBox)) throw new exception('erreur : WebMail->deplacer(). sBoxTo must be a string'); } catch (Exception $e) { echo $e->getMessage()."\n"; return false; } // fin : test des paramètres imap_mail_move($this->rFlux, $iIdMsg, $sBoxTo); imap_expunge($this->rFlux); return true; } /**
  • @name getBoxes
  • Récupérer les boîtes mail dans un tableau
*
  • @return array | false.
  • /
function getBoxes () { $aTmp = imap_getmailboxes($this->rFlux, $this->sServeur, "*"); $ret = ""; if (is_array($aTmp) ) { reset($aTmp); $select = "<select name=\"listbox\" id=\"listbox\" style=\"width:120px;\">\n"; while( list($cle, $valeur) = each($aTmp) ) { //nom de la boîte sans le serveur $start = strlen($this->sServeur); $len = strlen(imap_utf7_decode($valeur->name)) - strlen($this->sServeur); $sBoxName = substr(imap_utf7_decode($valeur->name), $start, $len); $this->aBoites[] = $sBoxName; $select .= "<option value=\"$sBoxName\">$sBoxName</option>\n"; } $select .= "</select>\n"; $this->selectboxes = $select; } else { return false; } return $this->aBoites; } //############################## listmsg ########################################## function getMailHeaders() { //récupération du nombre de messages $this->iNb_msg = imap_num_msg($this->rFlux); if (!$this->iNb_msg) { return array(); } $this->aApercu = imap_fetch_overview( $this->rFlux, "1:".$this->iNb_msg); if (!is_array($this->aApercu)) { return false; } return $this->aApercu; } //############################## Affichage des barres de boutons ########################################## public function print_read_bar($id_msg) { $tab_header = "<div id=\"bar_btn\">\n"; $tab_header .= "<table cellpadding=\"0\" cellspacing=\"0\">\n"; $tab_header .= "<tr>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"formmail.php\">\n"; $tab_header .= "<img src=\"images/design/i_compose.gif\" border=\"0\"/>&nbsp;Nouveau</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"formmail.php?id_msg=$id_msg\" onclick=\"#\">\n"; $tab_header .= "<img src=\"images/design/i_reply.gif\" border=\"0\"/>&nbsp;Répondre</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"?action=delete&id_msg=$id_msg\" onclick=\"#\">\n"; $tab_header .= "<img src=\"images/design/i_delete.gif\" border=\"0\"/>&nbsp;Supprimer</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"webmail.php\"><img src=\"images/design/i_inbox.gif\" border=\"0\"/>&nbsp;Retour</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "</tr>\n"; $tab_header .= "</table>\n"; $tab_header .= "</div>\n"; print($tab_header); } public function print_reply_bar($id_msg) { $tab_header = "<div id=\"bar_btn\">\n"; $tab_header .= "<table cellpadding=\"0\" cellspacing=\"0\">\n"; $tab_header .= "<tr>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"#\" onclick=\"envoi.submit();\">\n"; $tab_header .= "<img src=\"images/design/i_send.gif\" border=\"0\"/>&nbsp;Envoyer</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"#\" onclick=\"document.getElementById('iframe_container').style.display='block';\">\n"; $tab_header .= "<img src=\"images/design/i_attachment_action.gif\" border=\"0\"/>&nbsp;Joindre</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "<td>\n"; $tab_header .= "<a href=\"webmail.php\"><img src=\"images/design/i_inbox.gif\" border=\"0\"/>&nbsp;Retour</a>\n"; $tab_header .= "</td>\n"; $tab_header .= "</tr>\n"; $tab_header .= "</table>\n"; $tab_header .= "</div>\n"; print($tab_header); } } ?>

Conclusion :


Merci de me laisser vos remarques concernant ma façon de coder.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_garfield90
Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
-
juste un petit message pour suivre ce fil :P.
je regarderai ta classe dès que j'aurais un peu de temps
webdeb
Messages postés
509
Date d'inscription
samedi 5 avril 2003
Statut
Membre
Dernière intervention
31 mars 2009
1 -
Les bonnes balises php sont <?php et non <? qui peuvent être confondues avec un tag XML
cs_garfield90
Messages postés
389
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009
-
juste pour info :
dans ta méthode trouverNom, tu fais (erreur plusieurs fois présentes) :

for ($i=0;$i<sizeof($dparam);$i++)

tu devrais sortir sizeof de la boucle, ca fait un calcul inutile a chaque itération (temps de perdu)

tu as des propriétés sans setter ni getter, c'est pas forcement génant, mais ca me choque un peu.
de plus, tu initialises le domaine dans la définition de ta classe, autant le faire dans une constante de classe, comme ca aucun risque qu'il y ait de modification de celle-ci

Tu devrais peut etre un peu plus/mieux découper cette classe.
De plus, tu ne devrais pas inclure la présentation a ta classe, i.e. ne pas avoir de HTML dedans
Enfin, je ne suis pas sur qu'en imap, il n'y ait que 4 "types de repertoire" (INBOX.Trash, INBOX.Draft, INBOX.Sents, INBOX), un plus serait une gestion de l'envoi et du POP

Bon courage, et merci de ta participation
malalam
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

pour rebondir sur ce que dit Garfield :
- je trouve moi génant que tu n'aies pas de getter ni de setter pour les propriétés changeantes : domaine, format des emails...Ou au moins un méthode de configuration. Tu as des accesseurs, mais puisque tu bosses en php5, pourquoi ne pas utiliser __get() ? M'enfin, ça, c'est une question de préférence après tout.
- je suis tout à fait d'accord sur le html et les css : tu devrais vraiment les sortir de là.
Pour faciliter la vie des débutants, j'aurais mis une classe output, gérant l'output donc, et basée sur un système de templating simple (et propriétaire : j'entends par là, inutile de charger un smarty ou autre...ce serait bien trop lourd pour rien. D'ailleurs, c'est touyjours trop lourd pour rien les moteurs de template à la Smarty ;-) mais ça n'engage que moi!).
- ça manque de tests d'intégrité des paramètres reçus. On peut passer n'importe quoi, ta classe essayera de s'en servir et plantera lamentablement. Encore une fois, des exceptions avec un message clair seraient les bienvenues.
- j'aime bien avoir des variables typées, moi, ça facilite nettement les choses quand on relit un code. Mais bon.
- vu que t'as inclus tout le html, autant donner ta css et les images avec le code, non? Parce que là...le faire tourner donnerait quelque chose de très moche, pour test.
- sinon c'est pas mal! Ca change un peu comme type de code, c'est agréable. Et puis c'est aéré, facile à lire.
waterw72
Messages postés
63
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
18 juillet 2008
-
Bonjour,
Qu'entends-tu par "un peu plus/mieux découper cette classe"?
Pourquoi faire un constante avec le domaine? Je serai obligé de faire une class par domaine alors?
Pour les répertoires imap, cette class ne permet pas de créer de nouveau répertoire donc je n'ai pas
pensé à en lister plus.

Enfin, la présentation me permet de réduire le code dans mes pages html. Il faut choisir...

Merci de ton commentaire.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.