# Programmation PHP/Mails

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]

## Mail

Le code suivant se connecte à localhost:25 pour envoyer un mail :
Si la machine hébergeant le script n'est pas pourvue d'un serveur SMTP, le freeware portable Simple Mail Server peut jouer ce rôle rapidement sans installation.

## Utilisation de Mail plus complexe...

* Exemple
* <?php
* $mail = 'test@test.fr'; // Déclaration de l'adresse de destination.
* if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) { // On filtre les serveurs qui rencontrent des bogues.
* $passage_ligne = "\r\n";
* } else {
* $passage_ligne = "\n";
* //=====Déclaration des messages au format texte et au format HTML.
* $message_txt = "Bonjour, voici un e-mail envoyé par un script PHP.";
* $message_html = "<html><head></head><body><b>Bonjour</b>, voici un e-mail envoyé par un <i>script PHP</i>.</body></html>";
* //=====Création de la boundary
* $boundary = "-----=".md5(rand);
* //=====Définition du sujet.
* $sujet = "Hey mon ami !";
* //=====Création du header de l'e-mail.
* $header = "From: \"WeaponsB\"<test@test.fr>".$passage_ligne;
* $header.= "Reply-to: \"WeaponsB\" <test@test.fr>".$passage_ligne;
* $header.= "MIME-Version: 1.0".$passage_ligne;
* $header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
* //=====Création du message.
* $message = $passage_ligne."--".$boundary.$passage_ligne;
* //=====Ajout du message au format texte.
* $message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
* $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
* $message.= $passage_ligne.$message_txt.$passage_ligne;
* $message.= $passage_ligne."--".$boundary.$passage_ligne;
* //=====Ajout du message au format HTML
* $message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
* $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
* $message.= $passage_ligne.$message_html.$passage_ligne;
* $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
* $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
* //=====Envoi de l'e-mail.
* mail($mail,$sujet,$message,$header);
Explication:
* Ouverture boundary.(sert à séparer les différentes parties de notre e-mail)
* Déclaration de type (exemple texte, par défaut les clients mail tentent de convertir l'HTML en texte).
* Texte.
* Ouverture boundary.
* Déclaration de type (exemple HTML,par défaut les clients mail tentent de convertir l'HTML en texte)).
* HTML.
* Fermeture boundary.
* Fermeture boundary.

## Avec la mise en place de pièce jointe

* Exemple
* <?php
* $mail = 'test@test.fr'; // Déclaration de l'adresse de destination.
* if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) { // On filtre les serveurs qui présentent des bogues.
* $passage_ligne = "\r\n";
* } else {
* $passage_ligne = "\n";
* //=====Déclaration des messages au format texte et au format HTML.
* $message_txt = "Bonjour, voici un e-mail envoyé par un script PHP.";
* $message_html = "<html><head></head><body><b>Bonjour</b>, voici un e-mail envoyé par un <i>script PHP</i>.</body></html>";
* //=====Lecture et mise en forme de la pièce jointe.
* $fichier = fopen("background.jpg", "r");
* $attachement = fread($fichier, filesize("background.jpg"));
* $attachement = chunk_split(base64_encode($attachement));
* fclose($fichier);
* //=====Création de la boundary.
* $boundary = "-----=".md5(rand);
* $boundary_alt = "-----=".md5(rand);
* //=====Définition du sujet.
* $sujet = "Fichier important";
* //=====Création du header de l'e-mail.
* $header = "From: \"WeaponsB\"<test@test.fr>".$passage_ligne;
* $header.= "Reply-to: \"WeaponsB\" <weaponsb@mail.fr>".$passage_ligne;
* $header.= "MIME-Version: 1.0".$passage_ligne;
* $header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
* //=====Création du message.
* $message = $passage_ligne."--".$boundary.$passage_ligne;
* $message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
* $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
* //=====Ajout du message au format texte.
* $message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
* $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
* $message.= $passage_ligne.$message_txt.$passage_ligne;
* $message.= $passage_ligne."--".$boundary_alt.$passage_ligne;
* //=====Ajout du message au format HTML.
* $message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
* $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
* $message.= $passage_ligne.$message_html.$passage_ligne;
* //=====On ferme la boundary alternative.
* $message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
* $message.= $passage_ligne."--".$boundary.$passage_ligne;
* //=====Ajout de la pièce jointe.
* $message.= "Content-Type: image/jpeg; name=\"background.jpg\"".$passage_ligne;
* $message.= "Content-Transfer-Encoding: base64".$passage_ligne;
* $message.= "Content-Disposition: attachment; filename=\"background.jpg\"".$passage_ligne;
* $message.= $passage_ligne.$attachement.$passage_ligne.$passage_ligne;
* $message.= $passage_ligne."--".$boundary."--".$passage_ligne;
* //=====Envoi de l'e-mail.
* mail($mail,$sujet,$message,$header);
Explication:
* Ouverture boundary.
* Déclaration du nouveau content-type et de la seconde boundary.
* Ouverture boundary_2.
* Déclaration de type (exemple texte).
Texte.
* Ouverture boundary_2.
* Déclaration de type (exemple HTML).
HTML.
* Fermeture boundary_2.
* Ouverture boundary.
* Déclaration de la pièce jointe 1.
* Ouverture boundary.
* Déclaration de la pièce jointe 2.
* Ouverture boundary.
* Déclaration de la pièce jointe [...].
* Ouverture boundary.
* Déclaration de la pièce jointe n.
* Fermeture boundary.

## Bibliothèques

Ce livre abordera dans un chapitre ultérieur, des bibliothèques contenant des fonctions d'envoi d'email permettant plus d'options dans une syntaxe nettement plus concise :
* PHPMailer
* PEAR Mail, Net SMTP et Net Socket, et Mail Mime pour ajouter un fichier joint.

## Références

* ↑ http://php.net/manual/fr/function.mail.php
* ↑ https://sourceforge.net/projects/simplemailsvr/
* ↑ http://sourceforge.net/projects/phpmailer/
* ↑ http://pear.php.net/package/Mail/download
* ↑ http://pear.php.net/package/Net_SMTP/download
* ↑ http://pear.php.net/package/Net_Socket/download
* ↑ http://pear.php.net/package/Mail_Mime/download

## Voir aussi

* PHPMailer