Télécharger
mail.class.php (version : 1.2.2)
Dimanche 29 Novembre 2020 par Loïc Doumerc

Le principe de cette classe est d'envoyer des mails simplement en texte brut ou HTML.
Elle permet aussi d'envoyer des fichiers joints.

 

Les attributs

expediteur_mail

Spécifie l'adresse mail de l'expediteur (obligatoire)

Description

(mailer)->expediteur_mail = (string) 'votre_adresse_mail@nomdedomaine.fr';

expediteur_name

Spécifie le nom de l'expediteur (obligatoire)

Description

(mailer)->expediteur_name = (string) 'Votre Nom';

destinataire

Spécifie l'adresse mail destinataire du message (obligatoire)

Description

(mailer)->destinataire = (string) 'undestinataire@gmail.com';

sujet

Spécifie le sujet (titre) du message

Description

(mailer)->sujet = (string) 'Sujet de votre message';

confirmation

Active la demande d'accusé réception

Description

(mailer)->confirmation = (boolean) true;

message

Message HTML ou non

Description

(mailer)->message = (string) 'Message';

 

Les méthodes

add_file

Ajoute une pièce jointe dans le mail

Description

add_file( string $file_attachement ) : boolean

Liste de paramètres

$file_attachement

Chemin vers le fichier.

envoyer

Envoye le mail

Description

envoyer() : boolean

 

Les fichiers

exemple.php

<?php
	require_once('mail.class.php');
	$mail = new Mailer();

	$mail->expediteur_mail ='no-reply@monserveur.fr';
	$mail->expediteur_name = 'No-Reply';
	$mail->sujet = 'Contact depuis votre site '.$_SERVER["HTTP_HOST"];
	$mail->confirmation = true;//Option
	
	//Dans le cas d'un message HTML les images seront automatiquement ajoutées dans le message
	$mail->message = '<html>
		<body>
			<span style="color : red;">Test rouge</span><br>
			<img src="1.jpg"><br>
			<img src="2.jpg"><br>
		</body>
		</html>';


	$mail->add_file('exemple.pdf');



	$mail->destinataire ='undestinataire@gmail.com';
	if($mail->envoyer())
	{
		echo 'mail envoye avec succes.';
	}
	else
	{
		echo 'Une erreur est survenu pendant l\'envoi de votre message.';
	}

mail.class.php

<?php
/*********************************************************
 *	Fichier : mail.class.php
 *	Début du projet : 16 janvier 2011 à 00:07
 *	Modification : 25 novembre 2020 à 22h43
 *	
 *		Une création de Loïc Doumerc www.loicdoumerc.fr
 *	 	
 *		25/11/2020 detection automatique d'un mail au format HTML
 *		22/11/2020 supression de methodes inutiles, nettoyage divers, correction sur envoie multiple en HTML
 *		08/11/2020 Modification du constructeur 
 *********************************************************/  
class Mailer
{
	public $confirmation = false;//demande une notification de lecture du mail à son destinataire
	public $destinataire = null;
	public $sujet = null;
	public $message = null; //En HTML ou non

	public $expediteur_name = "RobotMailer";
	public $expediteur_mail = null;


	private $message_html = null;
	private $file_attachement = array();
	

	//function Mailer( )
	function __construct()
	{
		if(is_null($this->expediteur_mail))
		{
			$this->initExpediteurMail();
		}
	}

			
	private function initExpediteurMail ()
	{
		$this->expediteur_mail = 'no-reply@'.preg_replace( '#^www\.#' , '' ,$_SERVER["HTTP_HOST"]);
	}


	//add_file( string $file_attachement ) : boolean
	public function add_file( $file_attachement )
	{
		if( is_file($file_attachement) )
		{
			$this->file_attachement[] = $file_attachement;
			return true;
		}
		else
		{
			return false;
		}
	}


	private function HTML_Mail()
	{
		//Maintenant on regarde sur le corps du message
		if( $this->isHTML() )
		{			
			//On recherche toutes les images, pour les inserer dans le mail
			@preg_match_all('#<img([^>]*)>#Usi ', $this->message  , $match);
			
			//J'efface la 1ere occurence, qui nous sert à rien
			unset($match[0]);
			$match = $match[1];

			$this->message_html = preg_replace_callback(
				'#(<img([^>]*)src=")([^"]+)("([^>]*)>)#Uis',
				create_function(
					// Les guillemets simples sont trés importants ici
					// ou bien il faut protéger les caractères $ avec \$
					'$matches',
					'return "<img".$matches[2]. "src=\"cid:".md5($matches[3]).$matches[4];'
				),
				$this->message
			);
			
			//Maintenant on ajoute si besoin les fichiers
			foreach( $match as $key => $value)
			{
				//On regarde le src="" de l'image
				if( @preg_match('#src="([^"]+)"#', $value, $match2 ) )
				{
					if( !in_array($match2[1],$this->file_attachement) )
					{
						$this->add_file($match2[1]);
					}
				}
			
			}
		}	
	}



	/*
	 * Cette fonction sert à vérifier la syntaxe d'un email
	 */
	private function IsEmail($email)
	{
		// Auteur : bobocop (arobase) bobocop (point) cz
		// Traduction des commentaires par mathieu
	
		// Le code suivant est la version du 2 mai 2005 qui respecte les RFC 2822 et 1035
		// http://www.faqs.org/rfcs/rfc2822.html
		// http://www.faqs.org/rfcs/rfc1035.html
	
		$atom   = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]';   // caractères autorisés avant l'arobase
		$domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // caractères autorisés aprés l'arobase (nom de domaine)
		                               
		$regex = '/^' . $atom . '+' .   // Une ou plusieurs fois les caractères autorisés avant l'arobase
		'(\.' . $atom . '+)*' .         // Suivis par zéro point ou plus
		                                // séparés par des caractères autorisés avant l'arobase
		'@' .                           // Suivis d'un arobase
		'(' . $domain . '{1,63}\.)+' .  // Suivis par 1 à 63 caractères autorisés pour le nom de domaine
		                                // séparés par des points
		$domain . '{2,63}$/i';          // Suivi de 2 à 63 caractères autorisés pour le nom de domaine
	
		// test de l'adresse e-mail
		if (preg_match($regex, $email)) 
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	private function isHTML()
	{
		return preg_match('#<(html|body|img)\s+#i' , $this->message );
	}

	
	public function envoyer()
	{
		if(is_null($this->destinataire) || !$this->IsEmail($this->destinataire) || !$this->IsEmail($this->expediteur_mail) )
		{
				return false;
		}
		
		$this->HTML_Mail();
	
		//-----------------------------------------------
		//GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML
		//-----------------------------------------------

		$frontiere = '-----=' . md5(uniqid(mt_rand()));

		//-----------------------------------------------
		//HEADERS DU MAIL
		//-----------------------------------------------

		$headers = 'From: "'.$this->expediteur_name.'" <'.$this->expediteur_mail.'>' . "\n";
		$headers .= 'Return-Path: <'.$this->expediteur_mail.'>'."\n";
		$headers .= 'Reply-To: '.$this->expediteur_mail."\n"; 
		$headers .= 'MIME-Version: 1.0'."\n";
		$headers .= "X-Mailer: PHP ".phpversion()."\n";
		$headers .= "X-Priority: 3 (Normal)\n"; 
		 
		if( $this->confirmation )
		{
			$headers .= 'X-Confirm-Reading-To: '.$this->expediteur_mail."\n";
			$headers .= 'Disposition-Notification-To: '.$this->expediteur_mail."\n"; 
		}
		
		if( count($this->file_attachement) > 0 )
		{
			//$headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"'; 
			$headers .= 'Content-Type: multipart/related; boundary="'.$frontiere.'"'; 
		}
		else
		{
			$headers .= 'Content-Type: multipart/alternative; boundary="'.$frontiere.'"';
		}
		
		
		if( $this->isHTML() == false )
		{

		 //-----------------------------------------------
		 //MESSAGE TEXTE
		 //-----------------------------------------------
			 $message = 'This is a multi-part message in MIME format.'."\n\n";

			 $message .= '--'.$frontiere."\n";
			 $message .= 'Content-Type: text/plain; charset="utf-8"'."\n";
			 $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
			 $message .= strip_tags($this->message)."\n\n";
		}
		else
		{
		 //-----------------------------------------------
		 //MESSAGE HTML
		 //-----------------------------------------------
			 $message .= '--'.$frontiere."\n";

			 $message .= 'Content-Type: text/html; charset="utf-8"'."\n";
			 $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
			 $message .= $this->message_html."\n\n";

		}

		 //-----------------------------------------------
		 //PIECES JOINTES
		 //-----------------------------------------------
			
		foreach ( $this->file_attachement as $key => $value )
		{
			 $message .= "--".$frontiere."\n";
			 $message .= 'Content-Type: '.$this->mime_type($value).'; name="'.$value.'"'."\n";
			 $message .= 'Content-Transfer-Encoding: base64'."\n";
			 //$message .= 'Content-Description: '.$value."\n";
			 $message .= 'Content-ID: <'.md5($value).'>'."\n";
			 //$message .= 'Content-Disposition:attachement; filename="'.$value.'"'."\n\n";
			 $message .= 'Content-Disposition: inline; filename="'.$value.'"'."\n\n";

			 $message .= chunk_split(base64_encode(file_get_contents($value)),76,"\n")."\n";
			 
		}
		
		$message .= '--'.$frontiere.'--'."\n"; 
	
		if(@mail($this->destinataire,$this->sujet,$message,$headers))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	private function mime_type($file){
	//cette fonction permet de retrouver le mime_type
	$extention = substr(strrchr(basename($file), "."), 1);

	   $mime_type_ary = array(
	      'css'  => 'text/css',
	      'html' => 'text/html',
	      'htm'  => 'text/html',
	      'js'   => 'text/javascript',
	      'txt'  => 'text/plain',
	      'rtx'  => 'text/richtext',
	      'tsv'  => 'text/tab-separated-value',
	      'xml'  => 'text/xml',
	      'xls'  => 'text/xml',
	      
	      'eml'  => 'message/rfc822',
	      'nws'  => 'message/rfc822',
	      
	      'bmp'  => 'image/bmp',
	      'pcx'  => 'image/bmp',
	      'gif'  => 'image/gif',
	      'ief'  => 'image/ief',
	      'jpeg' => 'image/jpeg',
	      'jpg'  => 'image/jpeg',
	      'jpe'  => 'image/jpeg',
	      'png'  => 'image/png',
	      'tiff' => 'image/tiff',
	      'tif'  => 'image/tiff',
	      'cmu'  => 'image/x-cmu-raster',
	      'pnm'  => 'image/x-portable-anymap',
	      'pbm'  => 'image/x-portable-bitmap',
	      'pgm'  => 'image/x-portable-graymap',
	      'ppm'  => 'image/x-portable-pixmap',
	      'rgb'  => 'image/x-rgb',
	      'xbm'  => 'image/x-xbitmap',
	      'xpm'  => 'image/x-xpixmap',
	      'xwd'  => 'image/x-xwindowdump',
	         
	      'dwg'  => 'application/acad',
	      'ccad' => 'application/clariscad',
	      'drw'  => 'application/drafting',
	      'dxf'  => 'application/dxf',
	      'xls'  => 'application/excel',
	      'hdf'  => 'application/hdf',
	      'unv'  => 'application/i-deas',
	      'igs'  => 'application/iges',
	      'iges' => 'application/iges',
	      'doc'  => 'application/msword',
	      'dot'  => 'application/msword',
	      'wrd'  => 'application/msword',
	      'oda'  => 'application/oda',
	      'pdf'  => 'application/pdf',
	      'ppt'  => 'application/powerpoint',
	      'ai'   => 'application/postscript',
	      'eps'  => 'application/postscript',
	      'ps'   => 'application/postscript',
	      'rtf'  => 'application/rtf',
	      'rm'   => 'application/vnd.rn-realmedia',
	      'dvi'  => 'application/x-dvi',
	      'gtar' => 'application/x-gtar',
	      'tgz'  => 'application/x-gtar',
	      'swf'  => 'application/x-shockwave-flash',
	      'tar'  => 'application/x-tar',
	      'gz'   => 'application/x-gzip-compressed',
	      'zip'  => 'application/zip',
	      'xhtml'=> 'application/xhtml+xml',
	      'xht'  => 'application/xhtml+xml',
	      
	      'au'   => 'audio/basic',
	      'snd'  => 'audio/basic',
	      'aif'  => 'audio/x-aiff',
	      'aiff' => 'audio/x-aiff',
	      'aifc' => 'audio/x-aiff',
	      'wma'  => 'audio/x-ms-wma',
	      
	      'mpeg' => 'video/mpeg',
	      'mpg'  => 'video/mpeg',
	      'mpe'  => 'video/mpeg',
	      'mov'  => 'video/quicktime',
	      'avi'  => 'video/msvideo',
	      'movie'=> 'video/x-sgi-movie',
	      
	      'unknow' => 'application/octet-stream'
	   );
	      
	return ( !empty($mime_type_ary[$extention]) ) ? $mime_type_ary[$extention] : $mime_type_ary['unknow'];
	} 
}

À propos

Je suis développeur semi-professionnel depuis près de 20 ans.
Principalement dans le milieu web. J'aime particulièrement tout ce qui est protocole réseau.

Toutes mes classes