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 depuis près de 20 ans.
Principalement dans le milieu web.