Envoyer un mail PHP au format texte sans erreurs d’encodage …

Je trouve toujours géniaux les tutoriaux qui commencent pas « envoyer un mail au format texte avec la fonction mail() de PHP, c’est super simple… » (sous entendu : « en HTML par contre, pfoulala, ça c’est super dur :p « )
Personnellement j’ai toujours trouvé cela assez pénible : selon le logiciel de courrier du client, on a des erreurs d’encodage avec des signes cabalistiques partout dans 50% des cas ! Testez sur un iPhone, vous verrez …
Voilà ce que je fais pour éviter les erreurs, c’est pas sorcier mais au moins cela marche !
1. Récupérer les données à envoyer au bon format
D’abord la page où se trouve le formulaire de saisie, ou les données extraites de la base des données à envoyer, doivent être encodées en UTF-8 :
En-tête de la page du formulaire :
<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</head>
(pour les données extraites des bases voir le billet Web Tolosa sur ce sujet ici)
2. Préciser le type d’encodage utilisé dans l’en-têtes du mail : UTF-8
pourquoi UTF8 ? parce que les clients mails de pas mal de smartphones (Blackberry, iPhones, etc.) sont encodés en UTF8 et que de plus en plus de français les utilisent…
Donc le mail à envoyer sera formaté ainsi (on va prendre le cas de données récupérées depuis un formulaire en POST mais c’est pareil pour des données extraites d’une base des données):
$headers ='From: '.$_POST['mail']." "; // ici l'expediteur du mail
$headers .='Reply-To: '.$_POST['mail']." "; // ici l'adresse de réponse (facultatif)
$headers .='Content-Type: text/plain; charset="utf-8"'." "; // ici on envoie le mail au format texte encodé en UTF-8
$headers .='Content-Transfer-Encoding: 8bit'; // ici on précise qu'il y a des caractères accentués
3. Mettre en forme le message
La suite est plus classique. Par exemple pour la mise en forme possible des données d’un formulaire :
$message = " ";
$message .= "Message de ".$_POST['prenom']." ".$_POST['Nom']." ";
$message .= "Adresse : ".$_POST['Adresse']." - ".$_POST['Code-Postal']." - ".$_POST['Ville']." ";
$message .= "Tel : ".$_POST['Tel']." ";
$message .= "E-mail : ".$_POST['mail']." ";
$message .= "Texte du message : ";
$message .= "======== ";
$message .= $_POST['Message']." ";
$message .= "======== ";
$message .= "Envoi le ".date("d/m/Y - H:i");
4. Envoyer avec la fonction mail()…
Il n’y a plus qu’à l’envoyer tel quel avec la fonction mail() la plus simple :
if(mail("destinataire@fai.com", "Le sujet : message depuis mon formulaire", $message, $headers)) {
header("location: formulaire.php?error=0");
exit;
}
else {
header(« location: formulaire.php?error=1 »);
exit;
}
Bala… en principe ça marche partout !
Tu sembles avoir un problème de configuration du SMTP de ton serveur local : tu exécutes bien tes script PHP depuis ton ordinateur ?
Essaye de mettre en ligne ta page PHP sur ton serveur en ligne (OVH ou autre) et tente d’exécuter depuis le web le fichier qui contient ton script mail(). En principe les serveurs mail des serveurs web sont bien configurés.
aucun résultat et aucun spam.
Bonjour,
le mail n’est pas non plus dans ta boite de spam (courriers indésirables) de Yahoo ? Essaye d’envoyer à une autre adresse (Gmail, hotmail ou ce que tu veux)
slt
maintenant il m’affiche ce msg:
La fonction mail() fonctionne. Un e-mail a ete envoye a l’adresse khelassi.linda@yahoo.fr. S’il ne vous parvient pas, il y a probablement un blocage au niveau du serveur SMTP de votre hebergeur.
donc comment je règle ce blocage! car je ne reçoit rien
merci pr votre aide
salut a tous ^^
Monsieur j’ai modifie le fichier php.ini comme:
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = smtp.orange.fr
; http://php.net/smtp-port
smtp_port = 25
; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = khelassi.linda@gmail.com
; For Unix only. You may supply arguments as well (default: « sendmail -t -i »).
; http://php.net/sendmail-path
sendmail_path = « C:\wamp\sendmail\sendmail.exe »
et voila le code test que vous m’avez donné, aucune erreurs mais je ne reçoit rien
merci pour votre aide!
Bonjour Linda,
Ensuite tu demandes à l’admin. réseau de ton serveur de configurer la fonction mail() sur le fichier php.ini de ton serveur.
déjà, tu commence par dire « STP » et « merci »
Et si tu es en local, tu vas sur le fichier php.ini de ton serveur local et tu renseignes la ligne SMTP avec le smtp de ton FAI (par ex. : SMTP = « smtp.orange.fr »).
Cherche sur Google c’est très simple.
Il envoie « L’envoi par la fonction PHP mail() ne fonctionne pas ou est desactivee ! », alrs comment je l’active !
Vérifie si la fonction mail() est activée sur ton serveur en executant un fichier test.php qui contient le code suivant (si tu ne reçois pas de mail le pb vient de ton serveur) :
Voila mn code j’ai resolu tous les prblms mais il envoie rien
<?php
$mail = 'khelassi.linda@yahoo.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 = "Salut à tous, voici un e-mail envoyé par un script PHP.";
$message_html = "Salut à tous, voici un e-mail envoyé par un script PHP. »;
//==========
//=====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: \ »khelassi\ » ».$passage_ligne;
$header.= « Reply-to: \ »linda\ » « .$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);
//==========
?>
« error » c’est une erreur PHP… débugue ton code (les « ; » en fin de ligne, les erreurs de scripts, etc… il y a tant d’erreurs possible !!)
Et ne fait pas de copier-coller des codes depuis le net.
Il m’envoie error! svp aidez moi!
Merci l’article et le utf8_decode() qui a résolut mon problème.
Antoine.
Voila mon code qui marche chez l’hebergeur Gandi
$to = $_POST[’email’];
$subject = ‘La vie sur Paris..’;
$message = ‘Bonjour ‘. utf8_decode($_POST[‘prenom’]) .’ ‘. utf8_decode($_POST[‘nom’]) .’, merci pour votre message. Je vais bientôt vous répondre. Antoine’;
$headers = ‘From: toto@icloud.com‘ . « \r\n » .
‘Reply-To: toto@icloud.com‘ . « \r\n » .
‘Content-Type: text/plain; charset= »utf-8″‘ . « \r\n » .
‘Content-Transfer-Encoding: 8bit’. « \r\n » .
‘X-Mailer: PHP/’ . phpversion();
mail($to, $subject, $message, $headers);
Ne fonctionne pas sous outlook 2013 chez moi
Bonjour moi je n’arrive toujours pas si quelqu’un veut bien m’aider.
je reçois toujours les messages avec les caractère spéciaux HTML
Voici mon code PHP
<?php
// Couleur du texte des champs si erreur saisie utilisateur
$color_font_warn="#FF0000";
// Couleur de fond des champs si erreur saisie utilisateur
$color_form_warn="#FFCC66";
// Ne rien modifier ci-dessous si vous n’êtes pas certain de ce que vous faites !
if(isset($_POST['submit'])){
$erreur="";
// Nettoyage des entrées
while(list($var,$val)=each($_POST)){
if(!is_array($val)){
$$var=strip_tags($val);
}else{
while(list($arvar,$arval)=each($val)){
$$var[$arvar]=strip_tags($arval);
}
}
}
// Formatage des entrées
$f_1=trim(ucwords(preg_replace("[^a-zA-Z0-9éèàäö\ -]", "", $f_1)));
$f_2=strip_tags(trim($f_2));
$f_3=trim(preg_replace("[^0-9\ +]", "", $f_3));
// Verification des champs
if(strlen($f_1)<2){
$erreur.="Le champ « Nom » est vide ou incomplet. »;
$errf_1=1;
}
if(strlen($f_2)<2){
$erreur.="Le champ « Email » est vide ou incomplet. »;
$errf_2=1;
}else{
if(!ereg(‘^[-!#$%&\’*+\./0-9=?A-Z^_`a-z{|}~]+’.
‘@’.
‘[-!#$%&\’*+\/0-9=?A-Z^_`a-z{|}~]+\.’.
‘[-!#$%&\’*+\./0-9=?A-Z^_`a-z{|}~]+$’,
$f_2)){
$erreur.= »La syntaxe de votre adresse e-mail n’est pas correcte. »;
$errf_2=1;
}
}
if(strlen($f_3)<2){
$erreur.="Le champ « Téléphone » est vide ou incomplet. »;
$errf_3=1;
}
if(strlen($f_5)<2){
$erreur.="Le champ « Message » est vide ou incomplet. »;
$errf_5=1;
}
if($erreur== » »){
// Création du message
$titre= »Message du formulaire »;
$tete= »From:Site@Rochme.com\n »;
$corps.= »Nom : « .$f_1. »\n »;
$corps.= »Email : « .$f_2. »\n »;
$corps.= »Téléphone : « .$f_3. »\n »;
$corps.= »Entreprise : « .$f_4. »\n »;
$corps.= »Message : « .$f_5. »\n »;
if(mail(« contact@rochme.com », $titre, stripslashes($corps) , $tete)){
$ok_mail= »true »;
}else{
$erreur.= »Une erreur est survenue lors de l’envoi du message, veuillez refaire une tentative. »;
}
}
}
?>
Merci pour ce tuto très clair et concis. Le Php est décidément un langage de programmation formidable.
En peu de temps, une recherche sur le net m’à donné la solution au problème des lettres accentuées qui passaient en dans le courriel de l’Iphone.
J’ai dû rajouter des \r\n à la fin des lignes $headers :
$headers = ‘From: administrateur ‘.’\r\n’ ;
$headers .=’Content-Type: text/plain; charset= »utf-8″‘.’\r\n’;
$headers .=’Content-Transfer-Encoding: 8bit’;
Le message du courriel étant extrait d’un fichier texte, j’ai du aussi l’encoder en UTF8 : $message = utf8_encode($message);
Merci, c’est exactement ce que je cherchais !
Merci pour l’astuce. Tu me sauves la vie
Ca marche nickel, merci…Je me débattais depuis 1 siècle avec les caractères accentués !
Claude
Super ce tuto, c’est ce que je cherchais… Néanmoins je débute en php et quelques points m’échappent. Serait-il possible d’avoir un exemple concret ?
Merci
exact.
on peut aussi rajouter un utf8_decode($var) si on extrait/insere des variables d’une base des données encodée en UTF-8 directement dans le corps du mail, sinon on a des caractères spéciaux non reconnus par les iphones par exemple
testé et approuvé. Thx man