8796 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai créé un formulaire d'envoi de mail au format texte avec pièce jointe.
Il est correctement réceptionné dans Mail (Mac), Outlook Express 6 (XP SP2).
Par contre, en effectuant un autre test sur Outlook Express 6 (XP SP3) et sur Hotmail, c'est la cata.
Le contenu du mail est vide ou il apparaît en contenu brut...

Voici un extrait de mon code :

#Ecriture du message
		$boundary = '-----='.md5(uniqid(rand()));
		/* En-têtes de l'e-mail */
		$headers = 'From: '.$nom.' <'.$email.'>'."\r\n";
		$headers .= 'MIME-Version: 1.0'."\r\n";
		$headers .= 'Content-type: multipart/mixed; boundary='.$boundary."\r\n";
		$headers .= "\r\n";
        /* Construction du message */
		$message = '--'.$boundary."\r\n";
		$message .= 'Content-Type: text/plain; charset=utf-8'."\r\n";
		$message .= 'Content-Transfer-Encoding:8bit'."\r\n";
		$message .= "\r\n";
        $message .= 'Bonjour,'."\r\n\r\n";
        $message .= 'Ce mail a été envoyé depuis MonSite par '.$nom."\r\n";
        $message .= 'Voici le message qui vous est adressé :'."\r\n\r\n";
        $message .= '***************************'."\r\n";
        $message .= $msg."\r\n";
        $message .= '***************************'."\r\n";
		$message .= "\r\n";
		$message .= '--'.$boundary."\r\n";
		$message .= 'Content-Type: application/octet-stream ; name='.$nomfichier."\r\n";
		$message .= 'Content-Transfer-Encoding: base64'."\r\n";
		$message .= 'Content-Disposition: attachment; filename='.$nomfichier."\r\n";
		$message .= "\r\n";
		$message .= $piecejointe."\r\n";
		$message .= "\r\n\r\n";
		$message .= '--'.$boundary.'--'."\r\n";
        
        
        
        /* Envoi de l'e-mail */
			if (mail($to, $subject, $message, $headers))
			{
				$nom=$email=$sujet=$msg=$fichier='';
				echo '<p class="texte1">Votre email a &eacute;t&eacute; envoy&eacute; avec succ&egrave;s. Merci.</p>';
				unlink($destination); // suppression de la pièce jointe
	
				
			}
			else
			{
				$echo = '<p class="texte1">Erreur d\'envoi de l\'email.</p>';
			}
Bonjour,

Je voulais bien dire au format texte.

Mon problème se situe plus dans la façon de coder correctement les différentes parties du message ($headers, $message) pour qu'il soit compatible avec le plus de messageries possible.
J'ai du mal à trouver de l'info là-dessus.

Comme le site est en utf-8, je suis un peu obligé de laisser le charset en utf-8. En le mettant en iso-8859-1, j'ai des erreurs d'affichage de caractères.
Enfin ! Ça marche sur Hotmail :

J'ai enlevé les sauts de lignes "\r".
J'ai lu que ça générait des erreurs sur certaines messageries.
Voilà le code corrigé :


#Ecriture du message
		$boundary = '-----='.md5(uniqid(rand()));
		/* En-têtes de l'e-mail */
		$headers = 'From: '.$nom.' <'.$email.'>'."\n";
		$headers .= 'MIME-Version: 1.0'."\n";
		$headers .= 'Content-type: multipart/mixed; boundary='.$boundary."\n";
        /* Construction du message */
		$message = 'This is a multi-part message in MIME format.'."\n\n"; 
		$message .= '--'.$boundary."\n";
		$message .= 'Content-Type: text/plain; charset=utf-8'."\n";
		$message .= 'Content-Transfer-Encoding:8bit'."\n\n";
        $message .= 'Bonjour,'."\n";
        $message .= 'Ce mail a été envoyé depuis MonSite par '.$nom."\n";
        $message .= 'Voici le message qui vous est adressé :'."\n\n";
        $message .= '***************************'."\n";
        $message .= $msg."\n";
        $message .= '***************************'."\n\n";
		$message .= '--'.$boundary."\n";
		$message .= 'Content-Type: application/octet-stream ; name='.$nomfichier."\n";
		$message .= 'Content-Transfer-Encoding: base64'."\n";
		$message .= 'Content-Disposition: attachment; filename='.$nomfichier."\n\n";
		$message .= $piecejointe."\n";
		$message .= '--'.$boundary.'--'."\n";
        
        
        
        /* Envoi de l'e-mail */
			if (mail($to, $subject, $message, $headers))
			{
				$nom=$email=$sujet=$msg=$fichier='';
				echo '<p class="texte1">Votre email a &eacute;t&eacute; envoy&eacute; avec succ&egrave;s. Merci.</p>';
				unlink($destination); // suppression de la pièce jointe
	
				
			}
			else
			{
				$echo = '<p class="texte1">Erreur d\'envoi de l\'email.</p>';
			}