FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
En utilisant la fonction mail(), il faut indiquer
comme quatrième argument de la fonction. Le quatrième argument sert à spécifier des headers supplémentaires.
Lien : Comment envoyer un mail ?
Pour envoyer un mail en PHP, il nous faut utiliser la fonction mail() qui retourne TRUE si le mail a été accepté pour livraison, FALSE sinon.
- La fonction mail() est bien activée par l'hébergeur.
- Pour le vérifier, il suffit de regarder son phpinfo() : Le serveur SMTP est correctement configuré.
Pour configurer le serveur SMTP, il faut ouvrir le fichier php.ini et rechercher la ligne :
[mail function]
Puis mettre la configuration suivante :
; pour windows
smtp_port = 25
;Valeur par défaut
; pour windows
SMTP = smtp.monfai.fr
; pour windows
sendmail_from = moi@monfai.fr ; Pas obligatoire
; pour unix.
;sendmail_path = /usr/sbin/sendmail ou /usr/lib/sendmail
PS : sendmail_path est utilisé pour localiser le
programme d'envoi de mail par le serveur.
Attention : Si la directive sendmail_path est définie sous windows, alors smtp, smtp_port et sendmail_from seront ignorés et la commande spécifiée sera exécutée.
Une fois ces points réalisés, nous pouvons enfin passer à la construction du mail lui-même. Nous avons deux possibilités :
- L'envoi sous format texte
- L'envoi sous format HTML
Format texte
<?php
$destinataire
=
'adresse@fai.com'
;
// Pour les champs $expediteur / $copie / $destinataire, séparer par une virgule s'il y a plusieurs adresses
$expediteur
=
'adresse@fai.com'
;
$copie
=
'adresse@fai.com'
;
$copie_cachee
=
'adresse@fai.com'
;
$objet
=
'Test'
;
// Objet du message
$headers
=
'MIME-Version: 1.0'
.
"
\n
"
;
// Version MIME
$headers
.=
'Reply-To: '
.
$expediteur
.
"
\n
"
;
// Mail de reponse
$headers
.=
'From: "Nom_de_expediteur"<'
.
$expediteur
.
'>'
.
"
\n
"
;
// Expediteur
$headers
.=
'Delivered-to: '
.
$destinataire
.
"
\n
"
;
// Destinataire
$headers
.=
'Cc: '
.
$copie
.
"
\n
"
;
// Copie Cc
$headers
.=
'Bcc: '
.
$copie_cachee
.
"
\n\n
"
;
// Copie cachée Bcc
$message
=
'Un Bonjour de Developpez.com!'
;
if
(mail($destinataire
,
$objet
,
$message
,
$headers
)) // Envoi du message
{
echo 'Votre message a bien été envoyé '
;
}
else
// Non envoyé
{
echo "Votre message n'a pas pu être envoyé"
;
}
?>
Format HTML
<?php
$destinataire
=
'adresse@fai.com'
;
// Pour les champs $expediteur / $copie / $destinataire, séparer par une virgule s'il y a plusieurs adresses
$expediteur
=
'adresse@fai.com'
;
$copie
=
'adresse@fai.com'
;
$copie_cachee
=
'adresse@fai.com'
;
$objet
=
'Test'
;
// Objet du message
$headers
=
'MIME-Version: 1.0'
.
"
\n
"
;
// Version MIME
$headers
.=
'Content-type: text/html; charset=ISO-8859-1'
.
"
\n
"
;
// l'en-tete Content-type pour le format HTML
$headers
.=
'Reply-To: '
.
$expediteur
.
"
\n
"
;
// Mail de reponse
$headers
.=
'From: "Nom_de_expediteur"<'
.
$expediteur
.
'>'
.
"
\n
"
;
// Expediteur
$headers
.=
'Delivered-to: '
.
$destinataire
.
"
\n
"
;
// Destinataire
$headers
.=
'Cc: '
.
$copie
.
"
\n
"
;
// Copie Cc
$headers
.=
'Bcc: '
.
$copie_cachee
.
"
\n\n
"
;
// Copie cachée Bcc
$message
=
'<div style="width: 100%; text-align: center; font-weight: bold">Un Bonjour de Developpez.com !</div>'
;
if
(mail($destinataire
,
$objet
,
$message
,
$headers
)) // Envoi du message
{
echo 'Votre message a bien été envoyé '
;
}
else
// Non envoyé
{
echo "Votre message n'a pas pu être envoyé"
;
}
?>
Important : Afin de séparer les headers du corps du message, nous devons obligatoirement rajouter la chaîne "\r\n\r\n" à la fin de sa définition afin d'éviter les injections de headers.
Attention : Il est important de noter que ce n'est pas parce que le mail a été accepté pour livraison qu'il arrivera à destination.
Pour faire cela il suffit juste de rajouter une directive au header du mail qui est :
Disposition-
Notification-
To
Mais regardons ceci avec un petit exemple :
<?php
$destinataire
=
"son@adressemail.com"
;
// adresse mail du destinataire
$sujet
=
"Sujet"
;
// sujet du mail
$message
=
"Ton destinataire a bien lu ton mail"
;
// message qui dira que le destinataire a bien lu votre mail
// maintenant, on crée l'en-tête du mail
$header
=
"From: mon@adressemail.com
\r\n
"
;
$header
.=
"Disposition-Notification-To:mon@adressemail.com"
;
// c'est ici que l'on ajoute la directive
mail ($destinataire
,
$sujet
,
$message
,
$header
);
// on envois le mail
?>
Voici une fonction qui vous permettra de vérifier si une adresse mail est syntaxiquement correcte (c'est le rôle de l'expression régulière) et aussi si le domaine du mail existe (c'est le rôle de la fonction PHP getmxrr) :
<?php
function
verifMail ($mail
)
{
if
(preg_match ('/^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]/i'
,
$mail
) ) {
return
false
;
}
list
($nom
,
$domaine
) =
explode ('@'
,
$mail
);
if
(getmxrr ($domaine
,
$mxhosts
)) {
return
true
;
}
else
{
return
false
;
}
}
?>
Une deuxième solution existe en utilisant depuis la version 5.2 de PHP ce que l'on appelle les filtres et pour notre problème le filtre qui nous intéresse est FILTER_VALIDATE_EMAIL :
function verifEmail ($email
) {
if (filter_var ($email
,
FILTER_VALIDATE_EMAIL) ===
false) {
return false;
}
else {
return true;
}
}
Cependant, l'usage des filtres est critiqué par certains ; voir à ce sujet la documentation.
Lien : Tutoriel : initiation aux expressions régulières en PHP, par Guillaume Rossolini
Lien : Tutoriel sur la validation d'adresse e-mail en PHP, par Alexandre Tranchant