8768 sujets

Développement web côté serveur, CMS

bonjour à tous,

Je viens vers vous concernant l'envoi de mail avec php.
Je sais qu'il y a plein de sujet à ce sujet Smiley smile , mais je n'arrive pas à trouver les réponses à mes questions.

J'utilise le script suivant :
//Envoi mail au client:
 if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $email2)) // 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 = 'Veuillez trouver ci-après vos paramètres de connexion au site : ' . $passage_ligne . 'Email : ' . $emailmdp . ' ' . $passage_ligne . 'Mot de passe : ' . $mdp_genere . ' '. $passage_ligne . 'Merci';
 $message_html = '<html><head>
  <title>ici le titre</title>
  <style type="text/css">ici le style</style>
  </head>

  <body><p>ici le mail</body>
  </html>';
  //==========
						  
//=====Création de la boundary
 $boundary = "-----=".md5(rand());
 //==========
						  
//=====Définition du sujet.
 $sujet = "Le sujet du message comporte un é";
 //=========
						  
//=====Création du header de l'e-mail.
 $header = "From: \"le nom\"<noreply@lenom.fr>".$passage_ligne;
 $header.= "Reply-to: \"lenom\" <noreply@lenom.fr>".$passage_ligne;
 $header.= "MIME-Version: 1.0".$passage_ligne;
 $header .= "X-Priority: 3".$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=\"UTF-8\"".$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=\"UTF-8\"".$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.
if(mail($email2,$sujet,$message,$header)) { } else { echo "Echec lors de l'envoi du message, veuillez recommencer.";}


Problème ou question numéro 1 :
Comme on peut le voir au début du code, on filtre les serveurs qui posent des problème et on change la variable $passage_ligne.
Dans mon message texte, je voulais me servir de cette valeur pour changer de ligne.
Si j'envoi le mail sur mon adresse "msn.com", sur mon iphone, cela indique "message vide", alors que le même mail lu sur outlook sur Pc, me fait bien apparaître le message avec les sauts de ligne.
Que ce passe-t-il?

Problème ou Question numéro 2 :
Lorsque j'envoi mon mail sur mon adresse "laposte.net", le sujet du message affiche bien le "é" sur outlook sur PC, mais affiche un "è" sur le portail l'aposte.net.
Par contre, dans les deux cas, les accents du message s'affichent correctement.
Aie ???

Je ne suis que sur le message au format txt pour le moment, comme vous le verrez, j'ai mis en commentaires la partie html du script.

Question subsidiaire :
Est-ce que ce script est toujours d'actualité ?

Je voudrais bien que le mail de réinitialisation du mot de passe soit accessible et lisible par tout le monde, si vous voyez ce que je veux dire Smiley smile

Par avance, je vous remercie de votre aide.
Modifié par Alexbass (05 Jan 2015 - 20:28)
Modérateur
Bonjour,

Pour la question 2, essaie (en supposant que ton script php est encodé en utf-8) :


$sujet = "Le sujet du message comporte un é";
$sujet = '=?utf-8?B?'.base64_encode($sujet).'?=';


On encode $sujet en base64, et on indique que la chaine initiale était en utf-8, ce qui permet au logiciel de messagerie à l'arrivée de faire les conversions appropriées.

Amicalement,
Modérateur
Bonjour,

Pour la question 1, voilà ce que j'ai compris du problème, mais je ne suis pas sûr à 100%.

Étant donné qu'on est en 2015, j'aurais abandonné le filtrage des serveurs et je me serais contenté d'un $passage_ligne = "\r\n"; et tant pis si une machine quelque part n'a pas les bons outils. Et ensuite, je testerais avec une adresse hotmail ou live ou msn et différents clients de messagerie.

La bidouille utilisée dans ton script consistant à remplacer "\r\n" qui est la norme par "\n" dans certains cas est là pour contourner me semble-t-il un double problème :
1) certains logiciels de certains serveurs rajoutent dans certains cas des \r aux \n (qu'ils soient précédés ou pas d'un "\n").
2) certains (vieux?) clients de messagerie (dont certains encore assez utilisés) n'aiment pas recevoir des "\r\r\n" (ce qui fait qu'ils plantent si l'email a été envoyé avec des "\r\n" et est passé par un serveur qui lui a rajouté des "\r").

Or, selon moi, rien ne garantit que cette bidouille identifie bien les serveurs bogués et seulement ceux-là (je suis même là sûr du contraire). Elle fait déjà de l'à peu près. Et même si l'identification était convenable, rien ne garantit que ces serveurs continueraient de rester bogués.

De plus, rien ne garantit que certains autres clients de messagerie qui respectent bien la norme ne vont pas planter au cas où ils ne recevraient que des "\n" au lieu de "\r\n" (dans le cas où tu mises sur le fait que le serveur va rajouté un "\r" et qu'en fait, il le fait pas).

Et évidemment, il y a sans doute aussi des clients de messagerie et des serveurs qui vont s'en sortir en toute circonstance, ce qui ne facilite pas le diagnostic.

Déjà, si tu reçois bien les mails avec les quelques tests que tu peux faire dans ton coin, et en utilisant systématiquement "\r\n", à mon avis, ça serait déjà pas mal. A tester.

Amicalement,

NB : attention aux espaces dans les adresses de messagerie. Certains serveurs sont pointilleux.
Bonjour,

Je te remercie pour ton retour.

Je pense avoir réussi l'affichage des "é" partout. en utilisant utf8_decode.
Sur le message :
$message_txt = utf8_decode('Veuillez trouver ci-après vos paramètres de connexion au site : ' . $passage_ligne . 'Email : ' . $emailmdp . ' ' . $passage_ligne . 'Mot de passe : ' . $mdp_genere . ' '. $passage_ligne . 'Merci');

sur le sujet :
$sujet = utf-8_decode("Le sujet du message comporte un é");

Mais cela implique de repassé le charset en ISO :
$message.= "Content-Type: text/plain; charset=\"iso-8859-1\"".$passage_ligne;

Avec tout ça, j'ai les accents partout : corps du message, sujet, sur outlook, sur le site du client de la messagerie (laposte.net, live (msn)), sur l'iphone et l'Ipad pour le sujet aussi. Je pense que ça doit être bon.

Pour ce qui concerne les sauts de lignes, dans le message txt, il suffit d'aller à la ligne dans le fichier php. Si, si, ça fonctionne.
$message_txt = utf8_decode('Veuillez trouver ci-après vos paramètres de connexion au site :
Email : ' . $emailmdp . '
Mot de passe : ' . $mdp_genere . '
Merci');


Par contre, tous les corps de message sont vides sur iphone et ipad.
Je pense que c'est parce que le $header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;est renseigné en multi-part, et que l'application mail cherche le mail html alors qu'il n'est pas défini dans mon script...
Je vais vérifier ce soir.
Bonsoir,

bon, je n'ai pas réussi à faire ce que je souhaitais.
Après pas mal de tests, le format HTML passe bien sur msn, laposte, gmail, clientweb ou outlook.
Je vais continuer ainsi.
En cas de réclamation client, je reverrais peut-être le truc.

Merci quand même.