begin process at 2012 02 09 11:12:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

E-Mail / Messagerie

 > CLASS E-MAIL

CLASS E-MAIL


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :E-Mail / Messagerie Classé sous :email, pièces jointes, classe Niveau :Débutant Date de création :29/04/2008 Vu :6 697

Auteur : waterw72

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Une classe email qui permet de lire un email (avec pièces jointes) et d'envoyer un email (avec pièces jointes).

Source

  • <?php
  • /**
  • * Gestion d'un email : afficher, envoyer.
  • *
  • * <p>Cette classe permet de manipuler un email. Elle fonctionne avec un flux imap que l'on peut gérer avec une autre class</p>
  • *
  • * @name Email
  • * @author generationweb <greg@generationweb.be>
  • * @http://www.generationweb.be
  • * @copyright generationweb.be 2008
  • * @version 1.0.0
  • */
  • class Email {
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /* 1. propriétés */
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /**
  • * @var resource
  • * @desc flux imap vers une boîte mail
  • */
  • private $rFlux = null;
  • /**
  • * @var String
  • * @desc Sujet de l'email
  • */
  • private $sujet = "";
  • /**
  • * @var String
  • * @desc Expéditeur de l'email
  • */
  • private $de = "";
  • /**
  • * @var String
  • * @desc Destinataire de l'email
  • */
  • private $a = "";
  • /**
  • * @var Date
  • * @desc Date d'envoi de l'email
  • */
  • private $dateEnvoi = 0;
  • /**
  • * @var Array
  • * @desc liste des adresses des destinataires
  • */
  • private $sendTo = array();
  • /**
  • * @var String
  • * @desc Séparateur entre l'entête et le corps de l'email
  • */
  • private $boundary = "";
  • /**
  • * @var String
  • * @desc Entête de l'email
  • */
  • private $entete = "";
  • /**
  • * @var String
  • * @desc Contenu de l'email
  • */
  • private $message = "";
  • /**
  • * @var String
  • * @desc les pièces jointes de l'email
  • */
  • private $attachement = "";
  • /**
  • * @var Array
  • * @desc liste des pièces jointes (une pièces jointes étant un tableau)
  • */
  • private $pieceJointe = array();
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /* 1.1 accesseurs */
  • /*~*~*~*~*~*~*~*~*~*~*/
  • function getSujet() {return $this->sujet;} // renvoi le sujet
  • function getA() {return $this->a;} // renvoi le destinataire
  • function getDe() {return $this->de;} // renvoi l'expéditeur
  • function getMessage() {return $this->message;} // renvoi le message
  • function getDateEnvoi() {return $this->dateEnvoi;} // renvoi la date d'envoi
  • function getPieceJointe() {return $this->pieceJointe;} // renvoi un tableau de pièces jointes
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /* 1.2 "seteurs" */
  • /*~*~*~*~*~*~*~*~*~*~*/
  • //Set le sujet à la classe Email
  • function Subject( $subject ) {
  • $this->sujet = strtr( $subject, "\r\n" , " " );
  • }
  • // Set le message à la classe Email
  • function Body( $body ) {
  • $entete_message = "\nContent-Type: text/html; Charset=iso-8859-1\n";
  • $entete_message .= "Content-Transfert-Encoding: 8bit\n\n";
  • $this->message = $entete_message . chunk_split($body) . "\n--".$this->boundary;
  • }
  • //Set le from à la classe Email
  • function From( $from ) {
  • if( ! is_string($from) ) {
  • echo "Class Mail: error, From is not a string";
  • exit;
  • }
  • $this->de= $from;
  • }
  • //Add un destinataire au tableau a de la classe Email
  • function To( $a ) {
  • if( is_array( $a ) )
  • $this->sendTo= $a;
  • else
  • $this->sendTo[] = $a;
  • }
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /* 2. méthodes */
  • /*~*~*~*~*~*~*~*~*~*~*/
  • /**
  • * Constructeur
  • *
  • * <p>création de l'instance de la classe</p>
  • *
  • * @name Nom de la classe::__construct()
  • * @return void
  • */
  • function __construct () {
  • //la frontière
  • $this->boundary = "b" . md5(uniqid(time()));
  • }
  • /*~*~*~*~*~*~*~*~*~*~*~*~*~*/
  • /* 2.1 méthodes privées */
  • /*~*~*~*~*~*~*~*~*~*~*~*~*~*/
  • /**
  • * @name _make_headers
  • * Construit l'entête du mail
  • *
  • *
  • * @return void.
  • */
  • private function _make_headers()
  • {
  • // creation du header mail
  • $this->entete= "From: ".$this->de."\n";
  • $this->a= implode( ", ", $this->sendTo );
  • }
  • /**
  • * @name _make_attachement
  • * Construit les pièces jointes du mail
  • *
  • *
  • * @return void.
  • */
  • function _make_attachement() {
  • // les entêtes pour dire que c'est un message mutipart
  • $this->entete .= "MIME-Version: 1.0\n";
  • $this->entete .= "Content-Type: multipart/mixed; boundary = ".$this->boundary."\n\n";
  • $this->entete .= "This is a MIME encoded message.\n\n--".$this->boundary;
  • // for each attached file, do...
  • $this->attachment = "";
  • $iLengthPieceJointe = sizeof( $this->pieceJointe);
  • for( $i=0; $i < $iLengthPieceJointe; $i++ ) {
  • $filename = "" . $this->pieceJointe[$i]['nom'];
  • if( ! file_exists( $filename) ) {
  • echo "Class Email, method attach : file $filename can't be found"; exit;
  • }
  • //lecture du fichier
  • $fp = fopen($filename, "r");
  • $content_file = "";
  • while ($data = fread($fp, 4096) )
  • $content_file .= $data;
  • //encodage en base 64 et mise en forme (ligne de 75 caractères)
  • $le_fichier = chunk_split(base64_encode($content_file));
  • //on ajout les entêtes du fichier
  • $entete_fichier = "\nContent-Type: application/octet-stream; ";
  • $entete_fichier .= "name =\"".basename($this->pieceJointe[$i]['nom'])."\"\n";
  • $entete_fichier .= "Content-Transfer-Encoding: base64\n";
  • $entete_fichier .= "Content-Disposition:" . $this->pieceJointe[$i]['dispo'] . "\n\n";
  • $le_fichier = $entete_fichier.$le_fichier."\n--".$this->boundary; // avec la frontière
  • $this->attachement .= $le_fichier;
  • //suppression des fichiers
  • Unlink($this->pieceJointe[$i]['nom']);
  • }
  • }
  • /**
  • * @name trouverNom
  • * trouve le nom du fichier en pièce jointe
  • *
  • *
  • * @return string.
  • */
  • private function trouverNom($aParam) {
  • $nomFichier = "";
  • $iParamSize = sizeof($aParam);
  • for ($i=0;$i<$iParamSize;$i++)
  • {
  • if ( ($aParam[$i]->attribute == "filename") || ($aParam[$i]->attribute =="name") )
  • $nomFichier = $aParam[$i]->value;
  • }
  • return $nomFichier;
  • }
  • /**
  • * @name decoder
  • * decode le texte en 1 paramètre suivant l'encodage passé en second paramètre
  • *
  • *
  • * @return string.
  • */
  • private function decoder( $sTexte, $iEncodage) {
  • switch ($iEncodage)
  • {
  • case 4:
  • $ret = imap_qprint($sTexte);
  • break;
  • case 3:
  • $ret = imap_base64($sTexte);
  • break;
  • default:
  • $ret = $sTexte;
  • break;
  • }
  • return $ret;
  • }
  • /**
  • * @name BodyToArray
  • * Mets les parties du message dans un tableau à 2 entrée contenant : 1 le texte - 2 un tableau avec les pièces jointes
  • *
  • *
  • * @return array.
  • */
  • private function BodyToArray( $id_msg, $num_partie, $partie, $niveau, $alternative=0 ) {
  • //tableau contenant les informations
  • static $retour = Array('message' => '' );
  • //si la partie contient des infomrations sru la disposition
  • //et que la chaine indique "attachment", alors nous avons
  • //affaire à une pièce jointe
  • if ( $partie->ifdisposition && strtolower($partie->disposition) == "attachment" )
  • {
  • //on récupère le nom et quelques infos
  • //qu'on ajoute au tableau de résultats.
  • //on suppose la fonction trouverNom qui parourt
  • //le tableau parameters jusqu'à trouver le paramètre
  • //name, et en retourner la valeur
  • if ($partie->ifdparameters) {
  • $fichier = array( 'nom' => $this->trouverNom($partie->dparameters),
  • 'numero_partie' => $num_partie,
  • 'encodage' => $partie->encoding,
  • 'taille' => $partie->bytes);
  • }
  • if ($partie->ifparameters) {
  • $fichier = array( 'nom' => $this->trouverNom($partie->parameters),
  • 'numero_partie' => $num_partie,
  • 'encodage' => $partie->encoding,
  • 'taille' => $partie->bytes);
  • }
  • $retour['fichiers'][] = $fichier;
  • }
  • else
  • {
  • switch ($partie->type )
  • {
  • case TYPETEXT: // si c'est du texte
  • if ( $alternative) // et que c'est un texte avec une alternative
  • {
  • if ($this->sMailFormat == $partie->subtype) // on fait un test du format à afficher
  • {
  • $texte = imap_fetchbody( $this->rFlux, $id_msg, $num_partie);
  • $retour['message'] = "".nl2br($this->decoder($texte,$partie->encoding))."";
  • }
  • }
  • else // si c'est pas alternatif, on affiche
  • {
  • //if( !empty($partie->parts) )
  • //if ($niveau !=0)
  • if ($num_partie<>0)
  • {
  • // on lit le texte à la partie qui nous interesse.
  • $texte = imap_fetchbody( $this->rFlux, $id_msg, $num_partie);
  • $retour['message'] = "".$this->decoder($texte,$partie->encoding)."";
  • }
  • else
  • {
  • if ($partie->subtype == 'PLAIN') // on lit le texte PLAIN
  • {
  • $texte = imap_body( $this->rFlux, $id_msg);
  • $retour['message'] = "".nl2br($this->decoder($texte,$partie->encoding))."";
  • }
  • else if($partie->subtype == 'HTML') // on le texte HTML
  • {
  • $texte = imap_body( $this->rFlux, $id_msg);
  • $retour['message'] = "".$this->decoder($texte,$partie->encoding)."";
  • }
  • }
  • }
  • break;
  • case TYPEMULTIPART:// si c'est pas du texte alors on se rappelle
  • if ($partie->subtype == "ALTERNATIVE")
  • {
  • $alternative = 1;
  • }
  • //on lit chaque sous parts.
  • for ( $i=0;$i<count($partie->parts); $i++)
  • {
  • if ($niveau != 0 )
  • {
  • $pos = strrpos($num_partie, ".");
  • if ($pos === false) { // si on trouve pas de point, on en ajoute un sinon pas : pas de double point
  • $num_partie = $num_partie.".";
  • }
  • }
  • else {
  • $num_partie = "";
  • }
  • $this->BodyToArray($id_msg, $num_partie.($i + 1), $partie->parts[$i], 1, $alternative);
  • }
  • break;
  • /*case TYPEMESSAGE:
  • case TYPEAPPLICATION:
  • case TYPEAUDIO:
  • case TYPEIMAGE:
  • case TYPEVIDEO:
  • case TYPEMODEL:*/
  • default:
  • if ($partie->ifdparameters) {
  • $fichier = array( 'nom' => $this->trouverNom($partie->dparameters),
  • 'numero_partie' => $num_partie,
  • 'encodage' => $partie->encoding,
  • 'taille' => $partie->bytes);
  • }
  • if ($partie->ifparameters) {
  • $fichier = array( 'nom' => $this->trouverNom($partie->parameters),
  • 'numero_partie' => $num_partie,
  • 'encodage' => $partie->encoding,
  • 'taille' => $partie->bytes);
  • }
  • $retour['fichiers'][] = $fichier;
  • break;
  • }
  • }
  • return $retour;
  • }
  • /*~*~*~*~*~*~*~*~*~*~*~*~*~*/
  • /* 2.1 méthodes publiques */
  • /*~*~*~*~*~*~*~*~*~*~*~*~*~*/
  • /**
  • * @name Attach
  • * Attache une pièce jointe à l'email
  • *
  • * @paramString : nom du fichier joint
  • * @paramString : type du fichier joint
  • * @paramString : disposition du fichier joint (attachment | inline)
  • *
  • * @return Boolean : Vrai.
  • */
  • public function Attach( $filename, $filetype='application/x-unknown-content-type', $disposition = "attachment" )
  • {
  • $piece['nom'] = $filename;
  • $piece['type'] = $filetype;
  • $piece['dispo'] = $disposition;
  • $this->pieceJointe[] = $piece;
  • return true;
  • }
  • /**
  • * @name Send
  • * Envoi l'email aux destinataires
  • *
  • *
  • * @return void.
  • */
  • public function Send()
  • {
  • // build th headers
  • $this->_make_headers();
  • $body = "";
  • // include attached files
  • if( sizeof( $this->pieceJointe > 0 ) ) {
  • $this->_make_attachement();
  • $body .= $this->entete . $this->message . $this->attachement."--\n";
  • }
  • else {
  • $body .= $this->entete . $this->message . "--\n";
  • }
  • // envoie du mail aux destinataires principal
  • for( $i=0; $i< sizeof($this->sendTo); $i++ ) {
  • $res = imap_mail($this->sendTo[$i], $this->sujet, '', $body);
  • }
  • }
  • /**
  • * @name Read
  • * Lit le contenu d'un email et assignation à la class
  • *
  • * @paramRessource : flux imap vers la boîte de l'email
  • * @paramNumeric : numéro séquentiel de l'email dans la boîte
  • *
  • * @return Boolean : Vrai.
  • */
  • public function Read($rFlux, $id_msg=0) {
  • $this->rFlux = $rFlux;
  • //lecture des entêtes de l'email
  • $entetes = imap_headerinfo($rFlux, $id_msg);
  • // affectation
  • $this->sujet = utf8_decode(imap_utf8($entetes->subject)); // sujet
  • $this->de = htmlentities(utf8_decode(imap_utf8($entetes->fromaddress)));// adresse de l'expéditeur
  • $this->a = htmlentities(utf8_decode(imap_utf8($entetes->toaddress))); // adresse du destinataire
  • $this->dateEnvoi = strftime("%A, %d %B %Y à %H:%M:%S", $entetes->udate);// date d'envoi
  • //récupération de la structure du mail
  • $struct = imap_fetchstructure($rFlux,$id_msg);
  • $email = $this->BodyToArray($id_msg, 0, $struct, 0);
  • // mise en forme des liens se trouvant dans le contenu
  • $body = $email['message'];
  • $start_link = 0;
  • $start_link = strpos($body, "http://");
  • $stop_link = 0;
  • if ($start_link > 0 && $start_link >100) {
  • // si on trouve mais pas au début du mail (http://www.w3c.org ...)
  • $aFinLink = array('<',')','>',' ');
  • $iLengthBody = (strlen($body)-1);
  • for ($i=$start_link; !in_array($body{$i}, $aFinLink) && ($i<$iLengthBody);$i++) {
  • $stop_link = $i;
  • if ($i == strlen($body)-2) {
  • $stop_link = $i+1;
  • }
  • }
  • $adresse = substr($body, $start_link, ($stop_link-$start_link) + 1 );
  • $link = "<a href=\"".$adresse."\">".$adresse."</a>";
  • $body = str_replace($adresse, $link, $body);
  • }
  • $this->message = stripslashes($body); // message
  • //pièces jointes
  • if (isset($email['fichiers']) ) {
  • $this->pieceJointe = $email['fichiers']; // tableau des pièces jointes
  • }
  • }
  • }
  • ?>
<?php
	/**
	* Gestion d'un email : afficher, envoyer.
	* 
	* <p>Cette classe permet de manipuler un email. Elle fonctionne avec un flux imap que l'on peut gérer avec une autre class</p>
	* 
	* @name Email
	* @author generationweb <greg@generationweb.be> 
	* @http://www.generationweb.be
	* @copyright generationweb.be 2008
	* @version 1.0.0
	*/
	class Email {
	
		/*~*~*~*~*~*~*~*~*~*~*/
		/*  1. propriétés    */
		/*~*~*~*~*~*~*~*~*~*~*/
    
		/**
		* @var resource
		* @desc flux imap vers une boîte mail
		*/
		private $rFlux = null;
		
		/**
		* @var String
		* @desc Sujet de l'email
		*/
		private $sujet = "";
		
		/**
		* @var String
		* @desc Expéditeur de l'email
		*/
		private $de = "";
		
		/**
		* @var String
		* @desc Destinataire de l'email
		*/
		private $a = "";
		
		/**
		* @var Date
		* @desc Date d'envoi de l'email
		*/
		private $dateEnvoi = 0;
		
		/**
		* @var Array
		* @desc liste des adresses des destinataires
		*/
		private $sendTo = array();
		
		/**
		* @var String
		* @desc Séparateur entre l'entête et le corps de l'email
		*/
		private $boundary = "";
		
		/**
		* @var String
		* @desc Entête de l'email
		*/
		private $entete = "";
		
		/**
		* @var String
		* @desc Contenu de l'email
		*/
		private $message = "";
		
		/**
		* @var String
		* @desc les pièces jointes de l'email
		*/
		private $attachement = "";
		
		/**
		* @var Array
		* @desc liste des pièces jointes (une pièces jointes étant un tableau)
		*/
		private $pieceJointe = array();
		
				
		/*~*~*~*~*~*~*~*~*~*~*/
		/*  1.1 accesseurs    */
		/*~*~*~*~*~*~*~*~*~*~*/
		
		function getSujet() {return $this->sujet;}              // renvoi le sujet
		function getA() {return $this->a;}                      // renvoi le destinataire 
		function getDe() {return $this->de;}                    // renvoi l'expéditeur
		function getMessage() {return $this->message;}          // renvoi le message
		function getDateEnvoi() {return $this->dateEnvoi;}      // renvoi la date d'envoi
		function getPieceJointe() {return $this->pieceJointe;}  // renvoi un tableau de pièces jointes
		
		
		/*~*~*~*~*~*~*~*~*~*~*/
		/*  1.2 "seteurs"    */
		/*~*~*~*~*~*~*~*~*~*~*/
		//Set le sujet à la classe Email
		function Subject( $subject ) {
			$this->sujet = strtr( $subject, "\r\n" , " " );
		} 
		
		// Set le message à la classe Email
		function Body( $body ) {
			$entete_message = "\nContent-Type: text/html; Charset=iso-8859-1\n";
			$entete_message .= "Content-Transfert-Encoding: 8bit\n\n";
			$this->message = $entete_message . chunk_split($body) . "\n--".$this->boundary;
		} 
		
		//Set le from à la classe Email
		function From( $from ) {
			if( ! is_string($from) ) {
				echo "Class Mail: error, From is not a string";
				exit;
			}
			$this->de= $from;
		}
		
		//Add un destinataire au tableau a de la classe Email
		function To( $a ) {
			if( is_array( $a ) )
				$this->sendTo= $a;
			else
				$this->sendTo[] = $a;
		}

		
		
		/*~*~*~*~*~*~*~*~*~*~*/
		/*  2. méthodes      */
		/*~*~*~*~*~*~*~*~*~*~*/
    
		/**
		* Constructeur
		* 
		* <p>création de l'instance de la classe</p>
		* 
		* @name Nom de la classe::__construct()
		* @return void 
		*/
		function __construct () {
			//la frontière
			$this->boundary = "b" . md5(uniqid(time()));
		}

		
		/*~*~*~*~*~*~*~*~*~*~*~*~*~*/
		/*  2.1 méthodes privées   */
		/*~*~*~*~*~*~*~*~*~*~*~*~*~*/
				
		/**
		* @name _make_headers
		* Construit l'entête du mail
		* 
		*
		* @return void.
		*/
		private function _make_headers() 
		{
			// creation du header mail
			$this->entete= "From: ".$this->de."\n";
			$this->a= implode( ", ", $this->sendTo );
		}
		
		/**
		* @name _make_attachement
		* Construit les pièces jointes du mail
		* 
		*
		* @return void.
		*/
		function _make_attachement() {
			// les entêtes pour dire que c'est un message mutipart
			$this->entete .= "MIME-Version: 1.0\n";
			$this->entete .= "Content-Type: multipart/mixed; boundary = ".$this->boundary."\n\n";
			$this->entete .= "This is a MIME encoded message.\n\n--".$this->boundary;
			
			// for each attached file, do...
			$this->attachment = "";
			$iLengthPieceJointe = sizeof( $this->pieceJointe);
			for( $i=0; $i < $iLengthPieceJointe; $i++ ) {
				$filename = "" . $this->pieceJointe[$i]['nom'];
				
				if( ! file_exists( $filename) ) {
					echo "Class Email, method attach : file $filename can't be found"; exit;
				}
				
				//lecture du fichier
				$fp = fopen($filename, "r");
				$content_file = "";
				while ($data = fread($fp, 4096) )
					$content_file .= $data;
				
				//encodage en base 64 et mise en forme (ligne de 75 caractères)
				$le_fichier = chunk_split(base64_encode($content_file));
				
				//on ajout les entêtes du fichier
				$entete_fichier = "\nContent-Type: application/octet-stream; ";
				$entete_fichier .= "name =\"".basename($this->pieceJointe[$i]['nom'])."\"\n";
				$entete_fichier .= "Content-Transfer-Encoding: base64\n";
				$entete_fichier .= "Content-Disposition:" . $this->pieceJointe[$i]['dispo'] . "\n\n";
				
				
				$le_fichier = $entete_fichier.$le_fichier."\n--".$this->boundary; // avec la frontière
				
				$this->attachement .= $le_fichier;
				
				//suppression des fichiers
				Unlink($this->pieceJointe[$i]['nom']); 
			}
		}
		
		/**
		* @name trouverNom
		* trouve le nom du fichier en pièce jointe
		* 
		*
		* @return string.
		*/
		private function trouverNom($aParam) {
			$nomFichier = "";
			$iParamSize = sizeof($aParam);
			for ($i=0;$i<$iParamSize;$i++) 
			{
				if ( ($aParam[$i]->attribute == "filename") || ($aParam[$i]->attribute =="name") ) 
					$nomFichier = $aParam[$i]->value;
			}
			return $nomFichier;
		}
		
		/**
		* @name decoder
		* decode le texte en 1 paramètre suivant l'encodage passé en second paramètre
		* 
		*
		* @return string.
		*/
		private function decoder( $sTexte, $iEncodage) {
			switch ($iEncodage)
			{
				case 4:
					$ret = imap_qprint($sTexte);
					break;
				case 3:
					$ret = imap_base64($sTexte);
					break;
				default:
					$ret = $sTexte;
					break;
			}
			return $ret;
		}
		
		/**
		* @name BodyToArray
		* Mets les parties du message dans un tableau à 2 entrée contenant : 1 le texte - 2 un tableau avec les pièces jointes
		* 
		*
		* @return array.
		*/
		private function BodyToArray( $id_msg, $num_partie, $partie, $niveau, $alternative=0 ) {
			//tableau contenant les informations
			static $retour = Array('message' => '' );
			
			//si la partie contient des infomrations sru la disposition 
			//et que la chaine indique "attachment", alors nous avons
			//affaire à une pièce jointe
			if ( $partie->ifdisposition && strtolower($partie->disposition) == "attachment" )
			{
				//on récupère le nom et quelques infos
				//qu'on ajoute au tableau de résultats.
				//on suppose la fonction trouverNom qui parourt
				//le tableau parameters jusqu'à trouver le paramètre
				//name, et en retourner la valeur
				if ($partie->ifdparameters) {
					$fichier = array( 'nom' => $this->trouverNom($partie->dparameters),
									  'numero_partie' => $num_partie,
									  'encodage' => $partie->encoding,
									  'taille' => $partie->bytes);
				}
				if ($partie->ifparameters) {
					$fichier = array( 'nom' => $this->trouverNom($partie->parameters),
									  'numero_partie' => $num_partie,
									  'encodage' => $partie->encoding,
									  'taille' => $partie->bytes);
				}
				$retour['fichiers'][] = $fichier;
			}
			else
			{
				switch ($partie->type )
				{
					case TYPETEXT: //	si c'est du texte 
						if ( $alternative) //	et que c'est un texte avec une alternative
						{
							if ($this->sMailFormat == $partie->subtype) //	on fait un test du format à afficher
							{
								$texte = imap_fetchbody( $this->rFlux, $id_msg, $num_partie);
								$retour['message'] = "".nl2br($this->decoder($texte,$partie->encoding))."";
							}
						}
						else //	si c'est pas alternatif, on affiche
						{
							//if(  !empty($partie->parts) )
							//if ($niveau !=0)
							if ($num_partie<>0)
							{
								// on lit le texte à la partie qui nous interesse.
								$texte = imap_fetchbody( $this->rFlux, $id_msg, $num_partie);
								$retour['message'] = "".$this->decoder($texte,$partie->encoding)."";
							}
							else 
							{
								if ($partie->subtype == 'PLAIN') // on lit le texte PLAIN
								{
									$texte = imap_body( $this->rFlux, $id_msg);
									$retour['message'] = "".nl2br($this->decoder($texte,$partie->encoding))."";
								}
								else if($partie->subtype == 'HTML') // on le texte HTML
								{
									$texte = imap_body( $this->rFlux, $id_msg);
									$retour['message'] = "".$this->decoder($texte,$partie->encoding)."";
								}
							}
						}
						break;
						
					case TYPEMULTIPART:// si c'est pas du texte alors on se rappelle
						if ($partie->subtype == "ALTERNATIVE") 
						{
							$alternative = 1;
						}
						//on lit chaque sous parts.
						for ( $i=0;$i<count($partie->parts); $i++)
						{
							if ($niveau != 0 ) 
							{
								$pos = strrpos($num_partie, ".");
								if ($pos === false) { // si on trouve pas de point, on en ajoute un sinon pas : pas de double point
									$num_partie = $num_partie.".";
								}
							}
							else {
								$num_partie = "";
							}
							$this->BodyToArray($id_msg, $num_partie.($i + 1), $partie->parts[$i], 1, $alternative);
						}	
						break;
					/*case TYPEMESSAGE:
					case TYPEAPPLICATION:
					case TYPEAUDIO:
					case TYPEIMAGE:
					case TYPEVIDEO:
					case TYPEMODEL:*/
					default:
						if ($partie->ifdparameters) {
							$fichier = array( 'nom' => $this->trouverNom($partie->dparameters),
											  'numero_partie' => $num_partie,
							    		      'encodage' => $partie->encoding,
								    	      'taille' => $partie->bytes);
						}		
						if ($partie->ifparameters) {
							$fichier = array( 'nom' => $this->trouverNom($partie->parameters),
						         			  'numero_partie' => $num_partie,
								        	  'encodage' => $partie->encoding,
									          'taille' => $partie->bytes);
						}
						$retour['fichiers'][] = $fichier;
						break;
				}
			}			
			return $retour;
		}
		
		
		/*~*~*~*~*~*~*~*~*~*~*~*~*~*/
		/*  2.1 méthodes publiques   */
		/*~*~*~*~*~*~*~*~*~*~*~*~*~*/
				
		/**
		* @name Attach
		* Attache une pièce jointe à l'email
		* 
		* @paramString  : nom du fichier joint
		* @paramString : type du fichier joint
		* @paramString : disposition du fichier joint (attachment | inline)
		*
		* @return Boolean : Vrai.
		*/
		public function Attach( $filename, $filetype='application/x-unknown-content-type', $disposition = "attachment" )
		{
			 $piece['nom'] = $filename;
			 $piece['type'] = $filetype;
			 $piece['dispo'] = $disposition;
			 $this->pieceJointe[] = $piece;
			 return true;
		} 
			
		/**
		* @name Send
		* Envoi l'email aux destinataires
		* 
		*
		* @return void.
		*/
		public function Send()
		{
			// build th headers
			$this->_make_headers();
			$body = "";
			
			 // include attached files
			if( sizeof( $this->pieceJointe > 0 ) ) {
				$this->_make_attachement();
				$body .= $this->entete . $this->message . $this->attachement."--\n";
			}
			else {
				$body .= $this->entete . $this->message . "--\n";
			}
									
			// envoie du mail aux destinataires principal
			for( $i=0; $i< sizeof($this->sendTo); $i++ ) {
				$res = imap_mail($this->sendTo[$i], $this->sujet, '', $body);
			}
		}
		
		/**
		* @name Read
		* Lit le contenu d'un email et assignation à la class
		* 
		* @paramRessource  : flux imap vers la boîte de l'email
		* @paramNumeric : numéro séquentiel de l'email dans la boîte
		*
		* @return Boolean : Vrai.
		*/
		public function Read($rFlux, $id_msg=0) {
			$this->rFlux = $rFlux;
			//lecture des entêtes de l'email
			$entetes = imap_headerinfo($rFlux, $id_msg);
			
			// affectation
			$this->sujet = utf8_decode(imap_utf8($entetes->subject));               // sujet
			$this->de = htmlentities(utf8_decode(imap_utf8($entetes->fromaddress)));// adresse de l'expéditeur
			$this->a = htmlentities(utf8_decode(imap_utf8($entetes->toaddress)));   // adresse du destinataire
			$this->dateEnvoi = strftime("%A, %d %B %Y à %H:%M:%S", $entetes->udate);// date d'envoi
			
			//récupération de la structure du mail
			$struct = imap_fetchstructure($rFlux,$id_msg);
			$email = $this->BodyToArray($id_msg, 0, $struct, 0);
			
			// mise en forme  des liens se trouvant dans le contenu
			$body = $email['message'];
			$start_link = 0;
			$start_link = strpos($body, "http://");
			$stop_link = 0;
			if ($start_link > 0 && $start_link >100) {
				// si on trouve mais pas au début du mail (http://www.w3c.org ...)
				$aFinLink = array('<',')','>',' '); 
				$iLengthBody = (strlen($body)-1);
				for ($i=$start_link; !in_array($body{$i}, $aFinLink) && ($i<$iLengthBody);$i++) {
					$stop_link = $i;
					if ($i == strlen($body)-2) {
						$stop_link = $i+1;
					}
				}
				$adresse = substr($body, $start_link, ($stop_link-$start_link) + 1 );
				$link = "<a href=\"".$adresse."\">".$adresse."</a>";
				$body = str_replace($adresse, $link, $body);
			}
			$this->message = stripslashes($body);                                   // message
			
			//pièces jointes
			if (isset($email['fichiers']) ) {
				$this->pieceJointe = $email['fichiers'];                            // tableau des pièces jointes
			}
		}
	}
	
?>

 Conclusion

Des critiques?


 Sources du même auteur

Source avec Zip Source avec une capture UNE CLASS SITEMAP POUR AFFICHER L'ARBORESCENCE DE VOTRE SITE...
ENREGISTRER UNE IMAGE D'UN SITE DISTANT
Source avec Zip Source avec une capture FUNCTION CAPTCHA
Source avec Zip Source avec une capture CLASS WEBMAIL
Source avec Zip CRÉATION DE MINIATURE D'UNE IMAGE

 Sources de la même categorie

Source avec Zip Source avec une capture FORM TO MAIL AVEC PROTECTION PAR TOKEN ET CAPTCHA CONTRÔLES ... par cod57
Source avec Zip Source avec une capture FORMULAIRE VERS COURRIEL BASIQUE AVEC CONTRÔLE CAPTCHA ANTI ... par cod57
Source avec Zip CHAT EN PHP ET JQUERY par pitchoubrazil
Source avec Zip Source avec une capture FORMULAIRE DE CHOIX MULTI-CONTACT VALIDE XHTML 1.0 TRANSITIO... par aventurier19
Source avec Zip Source avec une capture WEB MESSENGER par EvildarkEurope

 Sources en rapport avec celle ci

Source avec Zip TESTS UNITAIRES par pierreSabatier
CLASSE SIMPLE EMAIL par Odradek
Source avec Zip Source avec une capture CLASSE DE MESSAGERIE par janhsh
Source avec Zip CLASS D' ENVOIE DE MAIL EN SMTP par ImmortalPC
Source avec Zip FORMULAIRE PERMETTANT D'ENVOYER UN E-MAIL (AVEC PIÈCES JOINT... par triumphs

Commentaires et avis

Commentaire de webdeb le 29/04/2008 16:19:25

Bon code dans l'ensemble (j'ai regardé en diagonale la syntaxe). Un bémol par contre : pense à utiliser les exceptions pour la gestion d'erreurs et de cas exceptionnels inattendus.

Commentaire de depression le 29/04/2008 20:13:41

Alors, quelques critiques, oui.

Ton code est propre je trouve. Mais je vais te faire un reproche sur le nom de tes méthodes. Le nom est parfois en français, parfois en anglais. De plus, la syntaxe est parfois foo_bar, et parfois fooBar.

Ca peut sembler rien, mais ce n'est pas logique je trouve. Un code, en plus d'être propre, doit suivre une logique de nommage stricte pour s'approcher de l'irréprochable :)


La seconde critique que je vais formuler ne s'adresse pas qu'à toi, mais à plein de monde en fait.
Ce qu'il se passe, c'est qu'il existe beaucoup de classes de gestion d'E-Mail. Ce serait bien que tu nous dises ce que ta classe apporte par rapport à l'existant.
Actuellement, j'utilise PHPMailer, qu'est ce que ta classe apporte de plus? C'est aussi cela qui m'intéresse dans les sources.


Sur ce, bonne prog tout le monde!

Commentaire de waterw72 le 30/04/2008 08:24:52

=> DEPRESSION.
pour la seconde critique : Etant un débutant, je publie mes sources dans le but d'améliorer ma syntaxe et mon code en général. Mon objectif n'est donc pas de fournir aux autres des outils qui, souvent, existent déjà.

Commentaire de yoman64 le 30/04/2008 10:40:59 7/10

Salut,

Ça m'a l'air bien sympatique tout ça. J'aurais juste quelques toutes petites remarques:
1. Comme dit depression, tu manque de constance. des fois tu utilises des doubles quotes, d'autre fois des simples. Des fois les variables sont en français, d'autre fois en anglais. Parfois tu mets des attributs de portée à tes fonction (private,public, statis) et parfois non.

2. for( $i=0; $i< sizeof($this->sendTo); $i++ ) ou for ( $i=0;$i<count($partie->parts); $i++) => En générale, on évite le plus possible de mettre un appel de fonction qui retourne toujours la même valeure dans une boucle, ça fait X appel inutile. Préfère faire: for( $i=0, $iLEN=sizeof($this->sendTo); $i< $iLEN; $i++ )

3. #  if( ! file_exists( $filename) ) {
# echo "Class Email, method attach : file $filename can't be found"; exit;
# }

Évite les echos, préfères les exceptions comme ça on peut mieu controller l'affichage.

4. Tu pourrais pas ajouter un petit exemple ? :)


Je te laisse 7/10

@+ et bonne continuation

Commentaire de spipod le 30/04/2008 12:55:21

Salut,

Je trouve que c'est dommage de faire tout ceci, et, utiliser finalement imap_mail. Tu devrais faire une connexion IP vers un serveur SMTP pour envoyer ton mail de façon à devenir indépendant et gagner en intérêt pour le source.

As-tu essayé File_Get_Content (en mode binaire) à la place de FRead ?
(gain en temps de compil et exécution)

Autre petite remarque : BodyToArray ne me semble pas trop optimisé, il y a du redondant (perte de temps de compil).

Dommage pour la stratégie de nommage aléatoire.

Mais le pire de tout, c'est le manque de gestion d'erreur.

A améliorer, mais c'est un bon début.

Commentaire de depression le 30/04/2008 13:01:32

waterw72 > Euh, tu es à mon avis un peu plus loin que simple débutant.

Ensuite, je pense que tu devrais quand même garder à l'esprit l'objectif de faire quelque chose de vraiment nouveau, qui innove. C'est avec un côté visionnaire que l'on évolue dans le bon sens.

Allez, bonne prog!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Envoie d'email [ par Zibou ] Bonjour,Je voudrai savoir si c'est possible d'envoyer des emails au format HTML en incluent c'est image dans le courierMerci Inscription et email d'acitvation [ par Elyianha ] Allo! en gros la, je crée un jeux online multiplayer..Je dois savoir comment, lors de l'inscription, une clé d'activation (un simple link a cliker) es VOUS VOULEZ DE L'AIDE? J'AI DES RÉPONSES [ par SmallToad ] Bonjour,Depuis quelque temps, je n'ai pas beaucoup d'email de fan qui me demande des questions sur le MySQL ou sur le PHP. C'est pourquoi que j'ai mis Test sur présence d'un pseudo dans une base [ par Masterfight ] Est-ce que j'ai bon ?Sachant que je passe $pseudo et $email.if ($ecrirecookie == "inscrire"){ $table="membres"; $query = "SELECT * from matable where Récupération d'une partie d'adresse email ? [ par Joez ] je veux recupérer ce k'il y a avant l'@ dans une adresse email, en php, comment faire ? Problème de compatibilité de script [ par Chris54 ] Bonjour,J'ai un problème d'execution d'un script javascript sous netscape alors qu'il fonctionne parfaitement sous IE mais je ne sais pas pourquoi.Que EMail [ par BSide ] Bonjour,je construis dynamiquement en PHP un tableau avec des données provenant d'une base Mysql.Parmi ces données se trouve un champ concernant l'ema Envoyer des coordonnees au membres [ par apz ] salut,je suis sur multimania.comment envoyer, par mail, au membres de mon site, leurs coordonnées (Login & Mot de passe) dans leurs boites email respe probleme de classe en php [ par Elkaire ] Donc voila mon probleme!!dans une premiere page je rensegne les insances de mon objet. Une fois renseigné je peux réutiliser les instances cet objet d Parametre de ma classe connexion et connexion/deconnexion [ par sebos63 ] Bonjour, 1. J'ai une classe de connexion et je souhaiterais savoir où il est judicieux de spécifier les paramètres d'une connexion. (Dans mon construc


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales