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

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

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.