[AJAX] Caractères accentué pour envoi de mail
Bonjour,
je souhaite implémenter l'envoi d'un message en passant par la technologie AJAX. Pour le moment, tout marche bien (les champs sont bien récupérés en JS et envoyés grâce à PHP) sauf les accents. Je les reçois sous forme de losange sous thunderbird.
Pourtant, ma page HTML est bien déclarée en UTF-8, l'AJAX envoi les données en UTF-8, je crée un email en UTF-8 et mon thunderbird est configuré en UTF-8 !
Est-ce que quelqu'un peut me donner un conseil ?
Merci d'avance.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
// Avec ce code, je récupère plusieurs champs (le titre du mail, son
// contenu, l'adresse de celui qui l'a envoyé et l'adresse de la pièce jointe)
function mail_ajax() {
// Montrer le statut
if(document.all) var information = document.all["status"]; //IE
else var information = document.getElementById("status"); //FF
information.style.visibility = "visible";
// Requête ajax
var httpRequest = false;
if(window.XMLHttpRequest) {
httpRequest = new XMLHttpRequest();
if(httpRequest.overrideMimeType) {
httpRequest.overrideMimeType('text/xml');
}
}
else if(window.ActiveXObject) {
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if(!httpRequest) {
alert("Impossible de cr\351er une instance XMLHTTP. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
information.style.visibility = "hidden";
return;
}
try {
httpRequest.open("POST", "../scripts/envoi_mail.php", true);
}
catch(e) {
alert("L'ouverture du fichier distant a \351chou\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
information.style.visibility = "hidden";
return;
}
try {
var categorie = document.forms[0].categorie.value;
var titre = document.forms[0].titre.value;
var adresse = document.forms[0].adresse.value;
var contenu = document.forms[0].corps.value;
var pj = document.forms[0].piece_jointe.value;
// Remplace les & car caractère spécial pour transmission info AJAX
contenu = contenu.replace(/&/g,escape("&"));
titre = titre.replace(/&/g,escape("&"));
titre = titre.replace(/\r/g," ");
titre = titre.replace(/\n/g," ");
adresse = adresse.replace(/&/g,escape("&"));
pj = pj.replace(/&/g,escape("&"));
var data = "categorie="+categorie+"&titre="+titre+"&adresse="+adresse+"&contenu="+contenu+"&pj="+pj;
httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
httpRequest.send(data);
}
catch(e) {
alert("La communication avec le fichier distant a \351chou\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
information.style.visibility = "hidden";
return;
}
httpRequest.onreadystatechange = function() {
if(httpRequest.readyState == 4 && httpRequest.status == 200) {
var reponse = httpRequest.responseText;
switch(reponse) {
case "1":
alert("Le message a bien \351t\351 envoy\351, merci pour l'int\351r\352t que vous portez \340 ce site.");
document.forms[0].titre.value = "";
document.forms[0].adresse.value = "";
document.forms[0].corps.value = "";
document.forms[0].categorie.options[5].selected = true;
document.forms[0].piece_jointe.value = "";
break;
case "2":
alert("La pi\350ce jointe n'existe pas ou elle est trop volumineuse.");
break;
default:
alert("Votre message n'a pu \352tre envoy\351. Veuillez r\351it\351rer votre envoi ult\351rieurement.");
}
document.forms[0].titre.focus();
information.style.visibility = "hidden";
return;
}
}
} |
Puis le PHP qui reçoit cette requète :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
<?
// Il y a toujours des problèmes ici
$categorie = utf8_decode($_POST[categorie]);
$titre = utf8_decode($_POST[titre]);
$adresse = utf8_decode($_POST[adresse]);
$contenu = utf8_decode($_POST[contenu]);
$pj = $_POST[pj];
$reception = "adresse@fournisseur.fr";
// Entête générique
$entete_mail = "MIME-Version: 1.0\r\n";
$entete_mail .= "Date: ".date("D, j M Y H:i:s O")."\r\n";
// Entête si champs adresse mail rempli
if($adresse!="") {
$entete_mail .= "Reply-To: $adresse\r\n";
}
// Mandatory for file_exists and filesize function
clearstatcache();
if($pj=="") $erreur_pj = 1; // Pas de pièce jointe
else {
if(!file_exists($pj) || filesize($pj)>5242880) { // Maximum de 5Mo ou pièce inexistante
echo "2";
return;
}
$erreur_pj = 0; // Une pièce jointe
}
// Si pas de pièce jointe, mail classique
if($erreur_pj) {
$entete_mail.="Content-Type: text/plain; charset=utf-8\r\n";
$entete_mail.="Content-Transfer-Encoding: 8bit\r\n";
}
// Sinon, insertion de la pièce attachée
else {
include("mime_function.php");
$path_parts = pathinfo($pj);
$ext = $type[strtolower($path_parts["extension"])];
$boundary = "----=".md5(uniqid(mt_rand()));
$entete_mail .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n\r\n";
$entete_mail .= "--".$boundary."\r\n";
$entete_mail .= "Content-Type: text/plain; charset=utf-8\r\n";
$entete_mail .= "Content-Transfer-Encoding: 8bit\r\n";
$entete_mail .= "Content-Disposition: inline\r\n";
$contenu .= "\r\n\r\n--".$boundary."\r\n";
$contenu .= "Content-Disposition: attached\r\n";
if($ext=="") $ext = "application/octet-stream";
$contenu .= "Content-Type: ".$ext."; name=\"".$path_parts["basename"]."\"\r\n";
$contenu .= "Content-Transfer-Encoding: base64\r\n";
$contenu .= "Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"\r\n\r\n";
$fp = fopen($pj, "r");
$file = fread($fp, filesize($pj));
$file = chunk_split(base64_encode($file));
$contenu .= $file;
$contenu .= "\r\n\r\n--".$boundary."--\r\n";
}
$status_mail = mail($reception, $categorie." - ".$titre,$contenu,$entete_mail);
$status_mail = 1;
echo $status_mail;
?> |