Class webmail

Soyez le premier à donner votre avis sur cette source.

Vue 11 634 fois - Téléchargée 1 178 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

Messages postés
44
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
4 avril 2008

bonjour,

y aurait-il par hasard moyen d'avoir un exemple d'utilisation ?

Merci
>
Messages postés
44
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
4 avril 2008

Pareil pour moi, une explication sur l'utilisation me serait utile ! merci d'avance
Messages postés
74
Date d'inscription
mercredi 15 janvier 2003
Statut
Membre
Dernière intervention
18 janvier 2013

Hello à tous,

Juste une petite remarque sur l'ouverture d'un compte pop.
Ayant moi-même développé ce genre d'outil, je pense que tu n'as pas pris en compte les connexions SSL.
Par exemple avec cette classe je suis presque sûr que tu ne puisses ouvrir une boîte mail Gmail ni même Wanadoo.

Si qq veux des infos à ce sujet, tell me more ;)

Bon courrage et bonne journée.
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

Je parlais de mis en constance car tu n'as pas de setter et donc ta propriété domaine ne peut a aucun moment changer donc inutile de la mettre en temps que propriété, CQFD. Je n'ai en tout cas pas voulu dire que ca DEVAIT etre une constante, dans ton cas, ca eviterai une manipulation non voulue.

Pour la séparation entre la présentation HTML et ta classe, c'est que si tu veux supprimer les tableaux pour les remplacer par autre chose, t'es obligé de modifier ta classe, ce qui ne doit jamais etre le cas.

Pour le découpage,

Je verrai à vu de nez 4 entités différentes.

- le serveur de mail (systeme de connexion)
- l'utilisateur du compte mail (permet de vérifier l'existence du compte et de vérifier aussi les params de connexion, gestion d'utilisateur etc.)
- un message : c'est une entité atomique, donc devrait quasi pouvoir etre traiter independament, voir peut etre un messageIterator (liste de message)
- une classe repertoire permettant la création, suppression de suppression, visualisation d'un répertoire de message

tu devrais peut etre/surement sortir ton utilisateur de ta classe et passer l'objet en reference au niveau du constructeur et/ou via un setter

# $u = new Utilisateur();
# $u->lire($id_user);
# $this->utilisateur = $u->getPseudo();
# $this->password = $u->getPassword();

public function setUtilisateur(Utilisateur $oUser){
$this->utilisateur = $oUser->getPseudo();
$this->password = $oUser->getPassword();
}
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
re,

"Pourquoi faire un constante avec le domaine? Je serai obligé de faire une class par domaine alors? "
=> moi je ne suis pas d'accord. Par définition, ce n'est pas une constante. Cela doit demeurer une propriété dynamique, MAIS que l'on peut setter.

Pour la présentation : si tu fais une classe output, basé par exemple sur un fichier de templating (xml ou autre), tu n'as plus de code dans tes pages html. ET on peut modifier l'apparence très facilement.
Ce n'est pas le cas ici.

Pour le découpage je laisse Garfield répondre, c'est son bin's ;-)
Afficher les 10 commentaires

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.