Tout les programmeurs Php connaissent bien la fonction mail intégré à Php, mais celle-ci ne convient que si vous disposez d'un serveur smtp local de plus l’envoie au format Html et l’envoi de pièces jointes sont difficile à envoyer (pas impossible). Il existe toutefois d'autres solutions :

1 - La fonction « mail() » de php


Php fournit en standard une fonction pour envoyer des mails. Il faut que PHP ait accès au service sendmail sur le serveur, au moment de la compilation. Si vous utilisez un autre programme de mail, comme qmail ou postfix, assurez-vous d'utiliser les bonnes API.
PHP va commencer à chercher sendmail dans votre PATH, puis, dans les dossiers suivants : /usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib. Il est hautement recommandé d'avoir sendmail de disponible dans votre PATH. De plus, l'utilisateur qui compile PHP doit avoir le droit d'accéder à l'exécutable sendmail.
La configuration se fait dans le fichier php.ini via les variables mail.add_x_header, mail.log, smtp, smtp_port, sendmail_from, sendmail_path. (Le détail de ces variables
se trouvent ici)



La fonction et ses arguments :
mail(« destinataire », « sujet », « corps », « En-têtes supplémentaires », «»);

Les en-têtes sont formés par les champs suivants séparés par le caractère « \n » :

  • From: « Expediteur » : Permet d’indiquer l'adresse email de l'expéditeur. On peut mettre ce qu’on veut et même se faire passer pour quelqu’un d’autre.
  • Reply-To: adresse@email : Permet d’indiquer l'adresse email de réponse.
  • Cc adresse@email1, adresse@email2... : Permet d’indiquer les autres destinataires qui recevront le mail en Cc (Carbon copy), c'est à dire que tous les destinataires pourront voir à qui le message a été transmis.
  • Bcc adresse@email1, adresse@email2...: Permet d’indiquer les autres destinataires qui recevront le mail en Bcc (Blind carbon copy), c'est à dire que les destinataires ne pourront pas voir à qui le message a été transmis, il s'agit d'une copie cachée.
  • Content-Type : Spécifie le type mime du mail et son jeu de caractère (charset).
  • Content-Transfer-Encoding : Permet de spécifier l'encodage du mail ou d'une de ses parties. Il peut par exemple prendre les valeurs 7 et 8 bit. (l'encodage 7 bit est utilisé dans les pays n'ayant pas besoin de gérer les lettres accentuées).
  • X-Priority : Défini le niveau de priorité du mail. Peut prendre une valeur variant de 1 à 5. Plus ce chiffre est faible, plus haute est la priorité.
  • Disposition-Notification-To : Spécifie l'adresse mail de retour pour la confirmation de lecture.

Exemple :
<?php
    $destinataire 
"toto@exemple.com";
    
$sujet "Sujet";
    
    
$corps "Texte du message";
    
// Ou pour un message au format HTML : 
    
$corps "<html><head><title>Le titre</title></head><body>Texte du message</body></html>";
    
    
$entete ='From: "Albert Dupont"<albert.dupont@exemple.fr>'."\n";
    
$entete .='Reply-To: albert.dupont@exemple.fr'."\n";
    
$entete .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
    
$entete .='Content-Transfer-Encoding: 8bit';
    
    if(
mail($destinataire$sujet$corps$entete)) {
        echo 
'Le message est envoyé';
    } else {
        echo 
'Erreur d\'expédition';
    }
?>


Exemple d ‘envoi au format texte et html:
<?php
    $destinataire 
"toto@exemple.com";
    
$sujet "Sujet";
    
    
$corps_texte "Texte du message";
    
$corps_html "<html><head><title>Le titre</title></head><body>Texte du message</body></html>";
    
    
$separation '-----=' md5(uniqid(mt_rand()));

    
    
$entete  ='From: "Albert Dupont"<albert.dupont@exemple.fr>'."\n";
    
$entete .='Reply-To: albert.dupont@exemple.fr'."\n";
    
$entete .='MIME-Version: 1.0'."\n";
    
$entete .='Content-Type: multipart/alternative; boundary="'.$separation.'"';
       
    
$corps  'This is a multi-part message in MIME format.'."\n\n";
    
$corps .= '--'.$separation.'--'."\n";
    
$corps .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
    
$corps .= 'Content-Transfer-Encoding: 8bit'."\n\n";
    
$corps .= $corps_texte."\n\n";

    
$corps .= '--'.$separation.'--'."\n";
    
$corps .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
    
$corps .= 'Content-Transfer-Encoding: 8bit'."\n\n";
    
$corps .= $corps_html."\n\n";

    
$corps .= '--'.$separation.'--'."\n"
      
    if(
mail($destinataire$sujet$corps$entete)) {
        echo 
'Le message est envoyé';
    } else {
        echo 
'Erreur d\'expédition';
    }
?>

Pour envoyer une pièce jointe la démarche est la même que pour un envoi au format texte et html, il suffit de rajouter le code suivant :
<?php
    $corps 
.= 'Content-Type: image/jpeg; name="fichier.jpg"'."\n";
    
$corps .= 'Content-Transfer-Encoding: base64'."\n";
    
$corps .= 'Content-Disposition:attachement; filename="fichier.jpg"'."\n\n";
    
$corps .= chunk_split(base64_encode(file_get_contents('fichier.jpg')))."\n";
?>



2 - Envoyer des mails avec le paquet Mail de PEAR


PEAR (pour PHP Extension and Application Repository) est une collection de bibliothèques PHP. C'est aussi une application qui permet de gérer les bibliothèques (installer ou mettre à jour une bibliothèque). On peut comparer ce système avec les gems de ruby ou, plus largement, aux gestionnaires de paquets comme apt. (Source Wikipedia)

La bibliothèque de PEAR qui nous intéresse est bien sur la bibliothèque « Mail ». Une fois la bibliothèque installé, l’envoi de mail se passe de la façon suivante :
<?Php
    
// Inclusion de la bibliothèque pour pouvoir s'en servir
    
require_once Mail.php
    
    $backend 
"mail"
    
$parametres "";
    
// Création d'un objet de la classe Mail
    
$lemail factory(string $backend $parametres);

?>


La variable $backend peut prendre les valeurs « mail », « sendmail » ou « smtp ». Pour chaque cas la valeur du tableau $parametres n’est pas la même :

mail :
  • Peut-être omis.

sendmail :
  • $parametres["sendmail_path"] = l’emplacement de sendmail sur le système par défaut /usr/sbin/sendmail
  • $parametres["sendmail_args"] = Des paramètres pour sendmail par défaut -i

smtp :
  • $parametres["host"] = Le serveur SMTP, par défaut localhost.
  • $parametres["port"] - Le port de connexion, par défaut 25
  • $parametres["auth"] - Utiliser l’authentification ou non, par défaut FALSE
  • $parametres["username"] - Le nom d’utilisateur pour le serveur SMTP
  • $parametres["password"] - Le mot de passe pour l’authentification SMTP
  • $parametres["localhost"] - La valeur pour la commande HELO, par défaut localhost
  • $parametres["timeout"] - Le temps de réponse maximum du serveur, par défaut pas de maximum.
  • $parametres["verp"] - Utilisation de VERP ou non, par défaut FALSE
  • $parametres["debug"] - Utilisation du SMTP en mode de recherche d’erreur ou non , par défaut FALSE
  • $parametres["persist"] - Indique si le serveur SMTP doit attendre plusieurs mails ou non.


L’envoi d’un mail vie sendmail se déroule donc ainsi
<?Php
    
include('Mail.php'); 
    
$dest 'a.dupont@fai.com';  
     
    
$entetes['From']   = 'jacques@fai.com';  
    
$entetes['To']   = 'a.dupont@fai.com';  
    
$entetes['Subject'] = 'Sujet du message';
     
   
$corps 'Corps du message';  
   
$parametres['sendmail_path'] = '/usr/lib/sendmail';  
    
   
// Creer un objet mail en utilisant la methode Mail::factory.
   
$objet_mail =& Mail::factory('sendmail'$parametres);
   
$objet_mail->send($dest$entetes$corps);

?>



3 - Utiliser la bibliothèque PhpMailer


C’est la solution que j’utilise (celle utilisé par joomla), elle permet de se passer de serveur de courrier, et par exemple d’envoyer des mails via gmail très facilement le tout en php bien sur. Après avoir télécharger la bibliothèque ici l’installation consiste juste à décompresser les fichiers dans sur votre serveur.

Le code suivant permet d’envoyer un mail via Gmail depuis votre site internet
<?php
        
// Inclusion de la bibliotheque
        
require("class.smtp.php");
        require(
"class.phpmailer.php");
        
        
// Création de l'objet PhpMailer
        
$mail = new PHPMailer();
        
// Définition du fichier de language en français pour nous
        
$mail->SetLanguage("fr""phpmailer.lang-fr.php");
    
        
        
$mail->IsSMTP();             // On se sert d'un SMTP
        
$mail->SMTPSecure "ssl";  // La connexion est cryptée
        
$mail->Host "smtp.gmail.com:465";  // Adresse et port du serveur de mail
        
$mail->SMTPAuth true;     // Activation de l'authentification
        
$mail->Port 465;
        
$mail->Username "nom@gmail.com";  // Nom d'utilisateur 
        
$mail->Password "xxxxxxxxxx"// Mot de passe
    
        
$mail->From "nom@gmail.com"// L'email de l'expediteur
        
$mail->FromName "Dupont";  // Le nom de l'expediteur
        
$mail->AddAddress("destinataire@fai.com""Maurice Thorez"); // Adresse et nom du destinataire
        
$mail->AddReplyTo("no_reply@gmail.com""No Reply"); // Adresse de réponse (ici pas de réponse souhaitée)
    
        
$mail->WordWrap 50// Nombre de caractère maximum par ligne
        
$mail->AddAttachment("/var/tmp/file.tar.gz");   // Piece jointe
        
$mail->AddAttachment("/tmp/image.jpg""new.jpg");  // Piece jointe  avec nom
        
$mail->IsHTML(true);   // Précise que l'email est au format HTML
    
        
$mail->Subject "Comme convenu"// Sujet
        
$messagecorps"<html>Je t'envoi les fichiers<b>demandé</b><br>Bonne reception</html>\n";
        
        
$mail->Body $messagecorps// Corps du message
        
$mail->AltBody "Je t'envoi les fichiers demandé. Bonne reception"// Corps alternatif du message
    
        
if(!$mail->Send()) {
            
$messageresultat="La transmission du message à échoué, essayer plus tard.";
                echo 
"Mailer Error: " $mail->ErrorInfo;  // Affiche le message d'erreur du SMTP
        
} else {
            
$messageresultat="Votre message est transmis";
        }
?>


Voilà donc trois solutions pour envoyer des mails en Php. Si vous en connaissez d’autre écrivez-moi depuis la page de contact .