Envoyer des Emails avec PHP

Introduction :

Avec PHP, l'envoi d'e-mails est facile. La fonction mail se charge de gérer tous les protocoles pour automatiser l'envoi des e-mails. Ainsi, nous verrons dans cette article comment envoyer des e-mails de base en PHP au format texte, dans un premier temps, puis ensuite au format HTML. Et finalement, nous verrons quelques optimisations telles que le contrôle de la validité de l'email.

 La fonction mail() en PHP :

Si vous envoyez des mails sous UNIX, la fonction mail() utilisera Sendmail. Sur les autres systèmes, elle se connectera à un serveur de courrier SMTP local ou distant. Pour configurer un serveur de messagerie, vous pouvez recourir à la directive SMTP dans le fichier php.ini (cf. Configuration dans le fichier php.ini).

La syntaxe de la fonction mail est la suivante :

   Code:

mail("chaine destinataire""chaine sujet""chaine corps""chaine en-têtes supplémentaires");
?>
Le courrier est donc envoyé au destinatire spécifié dans le premier argument et il est possible d'en indiquer plusieurs en les séparant par une virgule. Quant aux en-têtes supplémentaires (que nous allons voir juste après), ils sont optionnels. Si la fonction mail rencontre une erreur lors de la tentative de l'envoi d'un e-mail, celle-ci renvoie false.

Attention: Chez certains hébergeurs la fonction mail est désactivée (chez Free) ou remplacée par une autre fonction telle que email(), chez Online, dont la syntaxe est la suivante:

 Code:

email("chaîne compte","chaîne destinataire","chaîne sujet","chaîne message"[,"options"]);  
?>

 Les en-têtes supplémentaires :

Tout d'abord, voici comment envoyer un email simple au format texte:

   Code:

$email  "contact@easy-script.com";
$titre   "Mon sujet";
$message "Bonjour,n ici se trouve le texte de mon message !";
mail($email$titre$message);
?> 

NB: Les n à l'intérieur du corps de l'email permettent d'aller à la ligne.

Le quatrième argument optionnel permet d'ajouter des en-têtes supplémentaires au message qui sera envoyé. Par exemple cela permettra de spécifier la date, le logiciel utilisé, l'adresse de l'expéditeur ou l'adresse de retour... Quand plusieurs en-têtes sont insérés dans l'email, ils doivent être séparés par des retours chariots et des caractères de nouvelle ligne (rn). Voici un exemple d'envoi d'un email avec des en-têtes multiples:

 Code:

$destinataires "contact@easy-script.com,  webmaster@easy-script.com";
$titre "Mon sujet";
$message "Bonjour,n ici se trouve le texte de mon message !";

$entetedate  date("D, j M Y H:i:s -0600"); // Avec offset horaire
$entetemail  "From: toto@toto.comn"// Adresse expéditeur
$entetemail .= "Cc: exemple1@toto.comn"//Copies
$entetemail .= "Bcc: exemple2@toto.comn"// Copies cachées
$entetemail .= "Reply-To: toto@toto.comn"// Adresse de retour
$entetemail .= "Return-Path: toto@toto.comn"// Adresse de retour en cas d'échec
$entetemail .= "X-Mailer: PHP/" phpversion() . "n" // Maileur
$entetemail .= "X-Priority: 1n"//  Priorité allant de 1 à 5 (ici siginifie urgent)
$entetemail .= "Date: $entetedate"

mail($destinataires$titre$message$entetemail);
?>

Envoyer un email au format HTML :

Pour pouvoir envoyer des emails au format HTML en PHP, il suffit juste de modifier le quatrième argument de la fonction mail() en ajoutant un en-tête pour configurer le type Content-type.

   Code:

$destinataire "contact@easy-script.com"
$titre "Mon sujet"
$message 'Mon message ici ...'
$entetedate date("D, j M Y H:i:s -0600"); 
$entetemail "MIME-version: 1.0n";
$entetemail .= "Content-type: text/html; charset=iso-8859-1n";
$entetemail .= "Date: $entetedate"

mail($destinataire$titre$message$entetemail); 
?>
Ainsi, vous pourrez ajouter par exemple des images à vos emails. Cependant, si vous stockez les images sur votre serveur, lorsque le destinataire lira l'email il faudra qu'il reste connecté s'il veut les voir. Par contre, les emails reçus dans ce premier cas seront assez légers. Une autre solution consiste à attacher les images à votre email (ce que nous verrons dans un autre article): d'un coté cela permettra au destinataire de lire l'email avec les images hors connexion mais d'un autre coté rendra votre email plus lourd.

Bonjour,
 ici se trouve le texte de mon message !

 

Pour aller plus loin :

     Envoi d'un e-mail à partir des valeurs entrées dans un formulaire

Nous allons voir comment récupérer et utiliser les valeurs d'un simple formulaire pour envoyer un email, tout en faisant les vérifications nécessaires avant l'envoi. Tout d'abord voici le code HTML du formulaire:

   Code:
 

 

 
Votre email: 

Email du destinatire :  
 


Et voici maintenant le code PHP de la page envoi.php qui va traiter et effectuer les vérifications nécessaires des valeurs entrées dans le formulaire avant l'envoi de l'email:

   Code:
$from $_POST['from'];
$destinataire $_POST['destinataire'];

if(empty(
$from)) 

echo 
'Le champs Votre email est vide'
exit(); 
}
if(empty(
$destinataire)) 

echo 
'Le champs Email du destinataire est vide'
exit(); 
}else{

$message "Bonjour,n ici se trouve le texte de mon message !";
$entetedate  date"D, j M Y H:i:s -0600");
$entetemail  =  "From: $from n";  // Adresse expéditeur 
$entetemail .= "X-Mailer: PHP/" phpversion() .  "n" ;
$entetemail .= "Date: $entetedate";

mail($destinataire,"Mon sujet",$message,$entetemail); 

echo 
'L'email a bien été envoyé';
}

?> 


La première vérification, qui porte sur le champs $from, est réalisée à l'aide de la fonction empty() qui contrôle si celui-ci est vide ou non. Si le champs est vide, on affiche un message placé entre les accolades et on arrête l'exécution du code avec la fonction exit(). Si le champs n'est pas vide, ce qui est entre accolade n'est pas pris en compte et on passe à la deuxième vérification qui porte sur le champs $destinataire. La vérification fonctionne de la même façon que la précédente, donc si le champs n'est pas vide on continue et on envoie l'email...

     Vérification syntaxique d'une adresse email

Nous allons ici remplacer les deux vérifications faites dans l'exemple précédent par une expression régulière qui permet de vérifier la validité des adresses email entrées pas les utilisateurs.

   Code:
$from $_POST['from']; 
$destinataire $_POST['destinataire']; 

//Regex trouvée sur http://www.expreg.com 
if(!preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*.([a-z]{2,4})$`',$from)) 

echo 
'Votre email est invalide'
exit(); 

if(!
preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-_.]?[[:alnum:]])*.([a-z]{2,4})$`',$destinataire)) 

echo 
'L'Email du destinataire est invalide'
exit(); 
}else{ 

$message "Bonjour,n ici se trouve le texte de mon message !"
$entetedate  date"D, j M Y H:i:s -0600"); 
$entetemail  =  "From: $from n";  // Adresse expéditeur 
$entetemail .= "X-Mailer: PHP/" phpversion() .  "n" 
$entetemail .= "Date: $entetedate"

mail($destinataire,"Mon sujet",$message,$entetemail); 

echo 
'L'email a bien été envoyé'

?>


NB: Vous pouvez modifier la dernière valeur de l'intervalle de reconnaissance {2,4} pour le nom de domaine ayant plus de 4 caractères, comme museum par exemple ce qui donnera : {2,7}

Conclusion :

Pour conclure, vous venez de voir que l'envoi d'e-mails de base en PHP est assez simple. Je vous rappelle de plus que le SPAM est interdit par la loi !
Pour plus d'infos sur la fonction mail, vous pouvez consulter la doc officielle: Fonction mail()