Une petite classe Mail qui facilite et permet d'utiliser la POO pour envoyer un mail.
C'est ma première classe et je la poste pour que vous me disiez si elle est bien construite et/ou s'il y a des améliorations à faire.
Source / Exemple :
<?php
/*
Classe pour envoyer des mails
--------------------------------------------
v1.0 : - création du projet, début de l'écriture de la classe
v1.1 : - mis en place de l'adresse mail par défaut si il n'y en a pas dans le constructeur
- début de la réflèxion pour l'envoi multiple du mail en passant par un tableau d'adresse mail
- réécriture du constructeur pour enlever une condition
v1.2 : - mise en place de la méthode sendMails() pour envoyer plusieurs mails avec les adresses dans un tableau.
Reste la mise en place de la gestion de la sécurité des adresses mails du tableau et de la gestion du saut de ligne en fonction de l'adresse mail
à venir :
v2.0 : - gestion d'un tableau d'adresses mails pour envoyer plusieurs fois le même mail
class Mail
{
protected $_error;
protected $_mail;
protected $_mailArray;
protected $_boundary;
protected $_passageLigne;
protected $_subject;
protected $_message;
protected $_header = null;
protected $_getMailInArray = false;
##### CONSTRUCTEUR & DESTRUCTEUR #####
public function __construct($mail = null) {
if (is_null($mail)) {
// Mail par défaut défini dans le fichier de configuration
$this->_mail = MAIL;
}
else {
if (is_array($mail)) {
$this->_getMailInArray = true;
$this->_mailArray = $mail;
}
else {
// Vérification de l'adresse mail
self::verificationMail($mail);
// Création du retour à la ligne
self::createLineJump($mail);
}
}
// Création de la boundary
$this->_boundary = "-----=".md5(rand());
}
public function __destruct() {
}
##### SETTER #####
/* -- Gestion des erreurs SETTER -- */
public function __set($nom, $valeur) {
$this->_error[] = 'Impossible d\'assigner à l\'attribut <strong>'.$nom.'</strong> la valeur <strong>'.$valeur.'</strong> !<br />';
}
/* -- Si aucun header n'est défini, la méthode setDefaultHeader() en crée un -- */
private function setDefaultHeader() {
$this->_header = 'From: "Lycée Victor Hugo"<'.$this->_mail.'>'.$this->_passageLigne;
$this->_header.= 'Reply-to: "Lycée Victor Hugo" <'.$this->_mail.'>'.$this->_passageLigne;
$this->_header.= 'MIME-Version: 1.0'.$this->_passageLigne;
$this->_header.= 'Content-Type: multipart/alternative;'.$this->_passageLigne.' boundary="'.$this->_boundary.'"'.$this->_passageLigne;
}
/* -- Ajoute l'header au message -- */
public function setHeader($header) {
$this->_header = $header;
}
/* -- Ajoute le sujet au message -- */
public function setSubject($subject) {
$this->_subject = $subject;
}
/* -- Ajoute le contenu au message -- */
public function setMessage($message) {
$this->_message = $message;
}
/* -- Permet dans une seule méthode de passer tous les paramètres pour envoyer le mail -- */
public function setAll($subject, $message, $header = null, $mail = null) {
if (!is_null($mail)) self::changeMail($mail);
self::setHeader($header);
self::setSubject($subject);
self::setMessage($message);
}
##### GETTER #####
/* -- Gestion des erreurs GETTER -- */
public function __get($nom) {
$this->_error[] = 'Impossible d\'accéder à l\'attribut <strong>'.$nom.'</strong> !<br />';
}
/* -- Méthode qui retourne les erreurs sous forme de tableau. De moins en moins utilisé car utilisation des exceptions -- */
public function getError() {
return $this->_error;
}
##### AUTRES METHODES #####
/* -- Méthode qui permet d'envoyer le mail. Si aucun header n'est défini elle utilise setDefaultHeader() pour en créer un -- */
public function sendMail() {
if (!$_getMailInArray) {
if (is_null($this->_header))
self::setDefaultHeader();
if (!mail($this->_mail, $this->_sujet, $this->_message, $this->_header))
throw new exception('Le mail n\'a pas pu être envoyé');
}
else
throw new exception('Ce n\'est pas cette méthode qu\'il faut utiliser. Pour envoyer l\'e-mail aux adresses du tableau vous devez utiliser la méthode sendMail<b>s</b>() !');
}
/* -- Méthode qui permet d'envoyer le mail à toutes les adresses du tableau -- */
public function sendMails() {
if ($this->_getMailInArray) {
// Pour pouvoir utiliser la méthode sendMail()
$this->_getMailInArray = false;
// Pour chaque adresse, modifier l'adresse mail et envoyer le mail avec sendMail()
foreach($this->_mailArray as $mail) {
$this->_mail = $mail;
self::createLineJump($this->_mail);
self::sendMail();
}
}
else
throw new exception('Ce n\'est pas cette méthode qu\'il faut utiliser. Pour envoyer l\'e-mail à une seule adresse, vous devez utiliser la méthode sendMail() !');
}
/* -- Permet de modifier l'adresse e-mail et renvoyer le même mail à plusieurs adresses sans recréer un mail -- */
public function changeMail($mail) {
self::verificationMail($mail);
self::createLineJump($mail);
}
/* -- Création du retour à la ligne en fonction de l'adresse mail -- */
protected function createLineJump($mail) {
// Création du retour à la ligne en fonction du serveur
if (!preg_match('#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#', $mail))
$this->_passageLigne = '\r\n';
else
$this->_passageLigne = '\n';
}
/* -- Méthode qui vérifie la validité de l'adresse mail. Génère une exception si elle n'est pas valide -- */
protected function verificationMail($mail) {
// Vérification de l'adresse email
if(preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#', $mail)) {
$this->_mail = $mail;
return true;
}
else {
throw new exception('Cette adresse e-mail n\'est pas valide : "%s"', htmlspecialchars($mail));
return false;
}
}
}
?>
Conclusion :
Comme c'est écrit, il y a encore une partie en développement qui arrivera par la suite.
24 déc. 2010 à 09:30
En-têtes
//boudary
Message
//boudary
//...
Concernant les -----=, suivie d'un nombre aléatoire chiffré, c'est comme ça qu'elle se doit d'être.
Pour le format de saut de ligne, je l'ai lu sur plusieurs forums, puis il y a un tuto sur le sdz qui en parle : http://www.siteduzero.com/tutoriel-3-35146-e-mail-envoyer-un-e-mail-en-php.html
D'origine, je n'ai pas intégré de l'html/css car je l'utilise uniquement dans une architecture MVC. Mais quand tu auras fini, n'hésite pas à la faire partager !
23 déc. 2010 à 23:06
Je voudrais tenter ta classe sur mon projet mais je vais travailler dessu pour y ntegrer le format HTML eet css aussi.
Je me demande ou as tu pris l'informations sur le format de saut de lignes pour msn\live\hotmail ? Parce que ca aiderais énormément pour le formatage de différent mailServices...
Autre chose... Quel est l'utilité du -----.md5 pour le header ?
13 déc. 2010 à 01:01
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.