[php5][poo][imap] une classe pour lire des mails en imap depuis une bal existante.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 168 fois - Téléchargée 28 fois

Contenu du snippet

Bonjour,

Voilà une petite classe, largement inspiré de plusieurs autres codes, qui permet de:

- Se connecter à sa boîte mail en imap.
- De récupérer les entêtes des messages.
- De lire un message.

Prérequis:
Vous devez compiler PHP avec l'option --with-imap[=DIR], où DIR est le préfixe de l'installation du client C.
La pluspart des hébergeurs désactivent cette fonctionnalité, pour des raisons de sécurité.
(Je ne suis pas aller plus loin dans mon dev à cause de ça, chez free la fonction n'est pas activée)
Avantage:
Tout est centralisé.
Défaut:
Ne lis pas les pièces jointes: ça marche pô... (mais je sais pas trop pourquoi...)

Source / Exemple :


class CImap {
	public $m_host = null;
	public $m_login = null;
	public $m_pass = null;
	public $m_port = null;
	public $m_service = null;
	public $m_folder = null;
	public $m_flags = null;
	public $m_debug = true;
	protected $m_mailboxes = null;
	protected $m_stream = null;
	protected $m_headers = null;
	protected $m_headersinfo = null;
	protected $m_overview = null;
	/**

  • @desc Constructeur par valeurs.
  • @param string $host
  • @param string $login
  • @param string $pass
  • @param int $port = 143
  • @param string $service = "imap"
  • @param string $folder = "INBOX"
  • @param string $flags
  • /
function CImap($host,$login,$pass,$port=143,$service="imap",$folder="INBOX",$flags="") { if(empty($host) && empty($login) && empty($pass)) { throw new Exception(__CLASS__."<hr><br>Fatal error: You should specify the host, the login and the password for the CImap constructor"); } else { $this->m_host = $host; $this->m_login = $login ; $this->m_pass = $pass ; $this->m_port = $port ; $this->m_service = $service ; $this->m_folder = imap_utf7_encode($folder); $this->m_flags = $flags ; } } /**
  • @desc Met l"attribut $m_folder à la valeur $folder
  • permet de lire les emails contenu dans le dossier $folder.
  • @param string $folder = "INBOX"
  • /
public function setFolder($folder = "INBOX") { $this->m_folder = imap_utf7_encode($folder); } /**
  • @desc renvoie la dernière erreur.
  • @return string
  • @param <empty>
  • /
public function error() { $error = imap_last_error(); if(empty($error)) return false; else return $error; } /**
  • @desc Ouvre un flux imap sur le serveur $m_host authentifié en tant que $m_login avec $m_pass
  • renvoie faux si une erreur d"ouverture de flux apparait, sinon renvoie le flux ouvert.
  • @return resource
  • @param <empty>
  • /
public function open_stream() { $this->m_stream = null; if($this->m_debug) $this->m_stream = imap_open("{".$this->m_host.":".$this->m_port."/".$this->m_service.$this->m_flags."}".$this->m_folder,$this->m_login,$this->m_pass); else $this->m_stream = @imap_open("{".$this->m_host.":".$this->m_port."/".$this->m_service.$this->m_flags."}".$this->m_folder,$this->m_login,$this->m_pass); return $this->m_stream; } /**
  • @desc ferme le flux imap $m_stream
  • renvoie faux si une erreur de fermeture de flux apparait, sinon renvoie le flux ouvert.
  • @return bool
  • @param <empty>
  • /
public function close_stream() { if($this->m_debug) return imap_close($this->m_stream); else return @imap_close($this->m_stream); } /**
  • @desc Ouvre un flux imap sur le serveur $m_host authentifié en tant que $m_login avec $m_pass
  • renvoie faux si une erreur d"ouverture de flux apparait, sinon renvoie le flux ouvert.
  • @return array
  • /
public function mailbox_list() { $this->m_mailboxes = null; if($this->m_debug) $mailboxes = imap_list($this->m_stream,"{".$this->m_host.":".$this->m_port."/".$this->m_service.$this->m_flags."}","*"); else $mailboxes = @imap_list($this->m_stream,"{".$this->m_host.":".$this->m_port."/".$this->m_service.$this->m_flags."}","*"); for($i=0;$i<sizeof($mailboxes);$i++) { $ar = spliti("{".$this->m_host.":".$this->m_port."/".$this->m_service.$this->m_flags."}",imap_utf7_decode($mailboxes[$i])); $this->m_mailboxes[$i] = $ar[1]; } return $this->m_mailboxes; } /**
  • @desc Retourne les en-têtes de tous les messages d"une boîte aux lettres, si pas de message renvoie faux
  • @param <empty>
  • @return array
  • /
protected function headers() { $this->m_headers = null; if($this->m_debug) $this->m_headers = imap_headers($this->m_stream); else $this->m_headers = @imap_headers($this->m_stream); return $this->m_headers; } /**
  • @desc Lit un sommaire des en-têtes de messages
  • @param int $msgno = null
  • @return array
  • /
public function overview($msgno = null) { $this->m_overview = null; if($this->headers()) { if(is_null($msgno)) { if($this->m_debug) $overview = imap_fetch_overview($this->m_stream, "1:".sizeof($this->m_headers), 0); else $overview = @imap_fetch_overview($this->m_stream, "1:".sizeof($this->m_headers), 0); while(list($key,$val) = each($overview)) { $i = sizeof($this->m_overview); $this->m_overview[$i] = $val; } } else { if($this->m_debug) $overview = imap_fetch_overview($this->m_stream,$msgno, 0); else $overview = @imap_fetch_overview($this->m_stream, $msgno, 0); list($key,$val) = each($overview); $this->m_overview = $val; } } return $this->m_overview; } /**
  • @desc Retourne les informations des en-têtes des messages sous forme d"un tableau d"objet.
  • @param int $msgno = null
  • @return array
  • /
public function headerinfo($msgno = null) { $this->m_headersinfo = null; if($this->headers()) { if(is_null($msgno)) { while (list ($key,$val) = each ($this->m_headers)) { $i = sizeof($this->m_headersinfo); if($this->m_debug) $this->m_headersinfo[$i] = imap_headerinfo($this->m_stream, $key+1); else $this->m_headersinfo[$i] = @imap_headerinfo($this->m_stream, $key+1); } } else { if($this->m_debug) $this->m_headersinfo = imap_headerinfo($this->m_stream, $msgno); else $this->m_headersinfo = @imap_headerinfo($this->m_stream, $msgno); } } return $this->m_headersinfo; } /**
  • @desc Récupère le corps du message numero $msgno en TEXT/HTML ou en TEXT/PLAIN.(pas les pieces jointes)
  • @param int $msgno
  • @return string
  • /
public function get_part($msgno){ $this->open_stream(); if($this->m_debug) $struct = imap_fetchstructure($this->m_stream,$msgno); else $struct = @imap_fetchstructure($this->m_stream,$msgno); $parts = $struct->parts; if ($struct->type) { for ($x=0;$x<sizeof($parts);$x++) { $ttype = $parts[$x]->type; if ($ttype == 1) { # Multipart in multipart $sparts = $parts[$x]->parts; for ($c=0;$c<sizeof($sparts);$c++) { if (!$sparts[$c]->type && empty($sparts[$c]->disposition)) { if (strpos($sparts[$c]->subtype,"html")) { # HTML $part_needed = ($x + 1) . "." . ($c + 1); $part_encoding = $sparts[$c]->encoding; $html_entity = 1; } elseif (strpos($sparts[$c]->subtype,"plain")) { # Plain text $part_needed = ($x + 1) . "." . ($c + 1); $part_encoding = $sparts[$c]->encoding; } } /* PIECES JOINTES else { $dpara = $sparts[$c]->dparameters; for ($v=0;$v<sizeof($dpara);$v++) { if (strpos($dpara[$v]->attribute,"filename")) { $fname = $dpara[$v]->value; } } if (empty($fname)) { $para = $sparts[$c]->parameters; for ($v=0;$v<sizeof($para);$v++) { if (strpos($para[$v]->attribute,"name")) { $fname = $para[$v]->value; } } } if (empty($fname)) { $disp = $sparts[$c]->description; } $an = sizeof($attachments); $attachments[$an]->part = ($x + 1) . "." . ($c + 1); $attachments[$an]->filename = $fname; $attachments[$an]->size = $sparts[$c]->bytes; $attachments[$an]->mime = mimetype($sparts[$c]->type) . "/" . strtolower($sparts[$c]->subtype); $fname = ""; } FIN PIECES JOINTES */ } } else { if (!$parts[$x]->type && empty($parts[$x]->disposition)) { if (strpos($parts[$x]->subtype,"html")) { # HTML message $part_needed = ($x + 1); $part_encoding = $parts[$x]->encoding; $html_entity = 1; } elseif (strpos($parts[$x]->subtype,"plain")) { # Plain text $part_needed = ($x + 1); $part_encoding = $parts[$x]->encoding; } } /* PIECES JOINTES else { $dpara = $parts[$x]->dparameters; for ($v=0;$v<sizeof($dpara);$v++) { if (strpos($dpara[$v]->attribute,"filename")) { $fname = $dpara[$v]->value; } } if (empty($fname)) { $para = $parts[$x]->parameters; for ($v=0;$v<sizeof($para);$v++) { if (strpos( $para[$v]->attribute,"name")) { $fname = $para[$v]->value; } } } if (empty($fname)) { $fname = $parts[$x]->description; } $an = sizeof($attachments); $attachments[$an]->part = ($x + 1); $attachments[$an]->filename = $fname; $attachments[$an]->size = $parts[$x]->bytes; $attachments[$an]->mime = mimetype($parts[$x]->type) . "/" . strtolower($parts[$x]->subtype); $fname = ""; } FIN PIECES JOINTES */ } } } else { # Message unique if (strpos($struct->subtype,"html")) { # HTML $part_needed = "body"; $part_encoding = $struct->encoding; $html_entity = 1; } else { $part_needed = "body"; $part_encoding = $struct->encoding; } } # Récupère le coprs du message if ($part_needed == "body") { if($this->m_debug) $body = imap_body($this->m_stream,$msgno); else $body = @imap_body($this->m_stream,$msgno); } else { if($this->m_debug) $body = imap_fetchbody($this->m_stream,$msgno,$part_needed); else $body = @imap_fetchbody($this->m_stream,$msgno,$part_needed); } switch ($part_encoding) { case 4: $body = imap_qprint($body); break; case 3: $body = imap_base64($body); break; default: break; } if($html_entity) return $body; else return htmlentities($body); } }

Conclusion :


Je compte pas faire de mise à jour, sauf si vous voyez des bugs...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
48
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
23 avril 2006

Et remplacer les eregi par des strpos (comme conseillé effectivement dans le manuel php...)
Messages postés
48
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
23 avril 2006

Voilà, mis à jour ;) (mis en publique les attributs parus necessaires, enfin je crois...)
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
Ce que je voulais dire, c'est que ca porte pas atteinte au code pur :)
Tu peux faire :
<?php

public $host;

public function __construct($host) {
$this->host = $host;
}

?>
Puis, pour une raison où une autre, faire :
$mysql = new mysql('host.com');
$mysql->host = 'host.fr';
Pas besoin de rajouter une méthode en plus pour faire :
$mysql->setHost('host.fr');
ou alors
$mysql->changeoption('host', 'host.fr'); <== qui est encore plus lent !

Voila pourquoi je dis qu'il ne faut pas avoir peur du "public" et faire des méthodes dans le vent :)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
"Alors que si j'ai envie de changer d'hote, de login ou de pass ==> $mysql->host = 'new_host';"

Pourquoi changer d'hôte ? quand t'as plusieurs bases à gérer tu changes juste la base, sinon si t'as plusieurs bdd à gérer sur deux serveurs distincts (genre réplication) là peut-être oui (et encore je pense que ça se fait plutôt niveau logiciel et pas PHP ce genre de choses, inutile de perdre des perfs alors qu'il n'y a qu'un dossier "datas" à copier
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
"FhX > pour les attributs publics je pense que tout ce qui est host et connexion devrait être fait soit dans la classe soit dans le constructeur, ça éviterait justement de se balader avec ça :-)"
Le host et tout peut être publique... ca ne génera rien du tout. Par contre, le lien de connection $link DOIT être privé et DOIT resté dans la classe, car celui ci n'a pas besoin d'être utilisé en dehord.
Alors que si j'ai envie de changer d'hote, de login ou de pass ==> $mysql->host = 'new_host';

Suffit de faire des tests avant la connection à la base de donnée... généralement c'est ce qu'on fait quand la classe est bien faite :)
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.