PHP & MySQL

Librairie “mail” en PHP5 : Partie I

Le 23 octobre 2007 à 23:22 par Tomtom

La fonction mail est très souvent utilisé sur un site pour des newsletters ou des confirmations d’inscription par exemple. Il se peut que l’on soit amené à l’utiliser relativement souvent lorsque que l’on développe une application web, c’est pourquoi plutôt que de récrire sans cesse le même code, il est préférable d’utiliser une librairie (on perd moins de temps du coup) ! D’autant plus qu’il faut respecter certains paramètres afin que les mails envoyés soient correctement formatés et qu’ils ne tombent pas directement dans le panier “Spams” des webmails.

Ce qu’il faut savoir, c’est qu’un email, c’est structuré. Et pour vous montrer visuellement ce que ça donne, je vous ai fait un petit schéma aux couleurs sympas!

Structure d’un email

Les deux premières parties sont obligatoires. On verra la prochaine fois que la partie texte peut être modulable. Je vais donc vous détailler dans ce billet comment faire la première partie : les entêtes

Avant de commencer, j’aimerais revenir sur ce qu’est une librairie et une classe. Ces deux notions sont relativement proche et font référence à la conception d’une application. En effet, plutôt que de taper un code plusieurs fois (ce qui serait une perte de temps et de place, on alourdit l’application) on va le taper une fois puis le rappeler à chaque fois que l’on a besoin. Vous allez me dire mais quelle est la différence entre classe et librairie? Et bien tout simplement, la librairie est quelque chose de générique n’ayant aucune dépendance extérieur à ses fichiers contrairement à la classe qui elle peut en contenir. Je parle de dépendance par rapport à l’application. Concrètement, cela se code de la même manière à ceci près que vous pourrez ajouter une librairie sans problème sur votre site alors qu’une classe et en générale définie pour une application, comme un plugin pour une plateforme de blog.

Pour reprendre sur le sujet qui nous intéresse, Il faut déjà qu’on commence par créer l’objet mail :

  1. class mail{
  2. /**
  3.  * Fonction mail
  4.  *
  5.  * Construit l’objet mail
  6.  */
  7.  function mail(){
  8.  
  9.   $this->to = ;
  10.   $this->from = ;
  11.   $this->replyto = ;
  12.   $this->name = ;
  13.   $this->date = ;
  14.   $this->subject = ;
  15.   $this->message = ;
  16.   $this->html = false;
  17.   $this->utf8 = false;
  18.   $this->parts = array();
  19.   $this->template = ;
  20.   $this->boundary = ‘—-=_Next_Part_’.md5(uniqid(time()));
  21.   $this->tboundary = $this->boundary.‘_text’;
  22.  
  23.  }
  24.  
  25. }

Puis on va rajouter à cette class mail une fonction pour renvoyer la première partie : le header :

  1. /**
  2.  * Fonction GetHeaders
  3.  *
  4.  * Génère le code pour les headers du mail à envoyer
  5.  */
  6. function GetHeaders(){
  7.  
  8.  $eol = $GLOBALS[‘eol’];
  9.  // Personnaliser l’expéditeur si un nom a été précisé
  10.  $ExpMail = (!empty($this->name)) ? $this->name.‘ from.’>‘ : ‘from.‘>’;
  11.  $res = ‘From: ‘.$ExpMail.$eol.
  12.  // Précise à quelle adresse il faudra répondre (si elle est précisée)
  13.  ((!empty($this->replyto)) ? ‘Reply-To: replyto.’>‘.$eol : ‘‘).
  14. // Change la date d’envoi
  15.  ((!empty($this->date)) ? ‘Date: ‘.$this->date.$eol : ‘Date: ‘.date("r").$eol).
  16.  ‘Return-Path: ‘.$ExpMail.‘>’.$eol.
  17.  ‘MIME-Version: 1.0′.$eol.
  18.  // Précise d’où le mail vient. Très important pour les anti-spams
  19.  ‘X-Sender: ‘.$eol.
  20.  // Programme qui envoi le mail. Ici, c’est PHP
  21.  ‘X-Mailer: PHP v’.phpversion().$eol.
  22.  ‘X-auth-smtp-user: ‘.$this->from.‘ ‘.$eol.
  23.  ‘X-abuse-contact: ‘.$this->from.‘ ‘.$eol.
  24.  ‘Content-Type: multipart/mixed; boundary="’.$this->boundary.‘"’.$eol;
  25.  
  26. return $res;
  27.  
  28. }

On va aussi construire la fonction pour envoyer le mail entier :

  1. /**
  2.  * Fonction Send
  3.  *
  4.  * Envoie le mail
  5.  */
  6. function Send(){
  7.  
  8.  $GLOBALS[‘eol’] = "\r\n";
  9.  $headers = $this->GetHeaders();
  10.  $msg = $this->BuildMessage();
  11.  
  12.  if(mail($this->to, $this->subject, $msg, $headers)) return true;
  13.  else return false;
  14.  
  15. }

Il suffit alors de créer l’objet $mail et de lui passer certains arguments en fonction de ce dont on a besoin, par exemple :

  1. // On crée l’objet mail
  2. $mail = new mail();
  3. // Adresse email de réception
  4. $mail->to = ‘destinataire@email.com’;
  5. // Adresse email de l’expéditeur
  6. $mail->from = ‘expéditeur@email.cm’;
  7. // Nom complet de l’expéditeur
  8. $mail->name = ‘Tomtom’;
  9. // Adresse de réponse
  10. $mail->replyto = ‘expéditeur@email.cm’;
  11. // Date d’envoi que l’on peut modifier
  12. $mail->date = ‘Mon, 15 Oct 2007 17:43:37 +0200′;
  13.  …
  14.  …
  15.  
  16. // Pour envoyer le mail, on utilisera la fonction send()
  17. if($mail->Send()) echo ‘Ok!’;
  18. else echo ‘Erreur…’;

Ces bouts de code sont donc là pour commencer. La prochaine fois, je ferais la partie 2, le texte de l’email où je vous montrerai comment envoyer un email en texte + html, en choisissant l’encodage ou encore en utilisant un template. A la fin de cette série, je vous donnerai aussi la librairie mail pour que tout le monde puisse l’utiliser.

En attendant, j’espère ce billet vous à plus!

9 commentaires »

Gravatar

Commentaire de Tommy

le 23 octobre 2007 à 23:45

Il me semble qu’il faudrait quand même déclarer tes variables dans la class avant de les utiliser…
De plus, le constructeur, en php 5, n’est pas le nom de la class mais __construct(), non ? A moins que l’on puisse encore utiliser le nom de class ?
Sinon, qu’est-ce que la variable globale eol ?

Gravatar

Commentaire de Tomtom

le 23 octobre 2007 à 23:58

“Il me semble qu’il faudrait quand même déclarer tes variables dans la class avant de les utiliser…”
=> Bien sur, je ne l’ai pas mis ici car je voulais simplement décrire la partie header. J’ai mis le constructeur à terme d’indication pour montrer les variables que je comptai utiliser.

“De plus, le constructeur, en php 5, n’est pas le nom de la class mais __construct(), non ? A moins que l’on puisse encore utiliser le nom de class ?”
=> Effectivement, en PHP5 le constructeur doit avoir comme nom __construct(). On peut toujours utiliser le même nom que la classe en PHP5 et ce n’est pas forcement une mauvaise chose pour moi car il sera alors possible de faire marcher la librairie en PHP4

“Sinon, qu’est-ce que la variable globale eol ?”
=> C’est la variable de retour à la ligne préciser dans la fonction send()

Gravatar

Commentaire de Bertrand

le 24 octobre 2007 à 8:44

Salut,
Cela ne sert à rien de réinventer la roue, voici une excellente classe qui fait très bien le travail:
http://www.swiftmailer.org/

@+

Gravatar

Commentaire de Tommy

le 24 octobre 2007 à 9:30

“=> C’est la variable de retour à la ligne préciser dans la fonction send()”
=> Ah oui je n’avais pas vu… Par contre, ce serait \r\n et non rn alors ;)

“Cela ne sert à rien de réinventer la roue,”
=> Parfois, il est utile de réécrire des class pour son propre usage pour avoir quelque chose de plus rapide

Gravatar

Commentaire de Tomtom

le 24 octobre 2007 à 11:07

@Tommy : Oui, c’est bien \r\n, les antislashs ont disparu lors de l’enregistrement et je n’avais pas vu.

@Bertrand : C’est sur que ça ne sert à rien de réinventer la roue mais je n’avais jamais trouvé de classe PHP qui fasse tout ça. C’est pourquoi, j’en ai écris une moi même pour mes besoins personnels. Maintenant, je l’expose aussi pour tout le monde puisse comprendre comment ça marche, ce blog sert à ça.

Gravatar

Commentaire de Bertrand

le 24 octobre 2007 à 21:18

Par contre, je trouve très intéressant la démarche. J’aime bien voir comment programme les gens. On apprend toujours des choses.
Le lien est là uniquement pour référence ;)

@+

Gravatar

Commentaire de alex de Referencement Blog

le 25 octobre 2007 à 11:51

Sur ce paragraphe :
“quelle est la différence entre classe et librairie? Et bien tout simplement, la librairie est quelque chose de générique n’ayant aucune dépendance extérieur à ses fichiers contrairement à la classe qui elle peut en contenir. Je parle de dépendance par rapport à l’application. Concrètement, cela se code de la même manière à ceci près que vous pourrez ajouter une librairie sans problème sur votre site alors qu’une classe et en générale définie pour une application, comme un plugin pour une plateforme de blog.”

La classe est une forme (souvent 1 classe = 1 fichier) de programmation dite objet (POO Programmation Orientée Objet).
La librairie ce sont des ensembles d’outils mis à disposition (sous forme de scripts ou de classes), que l’on peut utiliser dans son site (pour éviter de réinventer la roue). On parle aussi de bibliothèque.

Lorsque la bibliothèque est très poussé en permettant de structurer le code on l’appelle Framework : DotNet (lang C# princ.), Ruby On Rail (Ruby), Symfony ou CakePhp (PHP5).

Tout cela pour dire qu’il n’y a pas de notion de “dépendance à l’application” dans le principe de classe.

Sinon c’est bien de promouvoir la POO (donc les classes :D)

Gravatar

Commentaire de Tommy

le 30 octobre 2007 à 14:14

J’ai testé rapidement la classe et j’ai remarqué qu’il y a plein de header qui ne passe pas lorsque j’ai reçu un email sur ma boite gmail… Tous (ou presque) figurait dans le corps du message au lieu des headers.

Sinon, j’ai pas trop compris la fonction BuildMessage(), elle vient d’ou ?
Et il y a plein de variable qui ne sont jamais utilisées aussi.

Gravatar

Commentaire de Tomtom

le 30 octobre 2007 à 16:12

Salut Tommy,

La classe en l’état actuel ne peut pas marcher puisqu’il manque des bouts, c’est fait exprès. Je n’ai pas encore mis les autres fonctions et pour cause, je ne détaillé que la partie header dans ce billet. A la fin de ce tutorial en plusieurs parties, je proposerai le fichier total qui lui, crois moi, marche parfaitement pour tous les webmails

Un peu de patience…

Laisser un commentaire

Votre Nom

Votre E-mail (obligatoire mais ne sera pas publié)

Votre Site ou blog

Votre commentaire

Valid XHTML 1.0 Transitional