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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;
?>