OVH Community, votre nouvel espace communautaire.

envoi et réception d'e-mail depuis un fichier php


pière2
24/12/2012, 11h50
Merci pour la réponse.
La remarque est juste et j'ai corrigé immédiatement $expediteur par $adresse.
Une étourderie.
J'ai résolu mon problème d'affichage dans le champ Expéditeur de la façon suivante:
Code:
$search  = array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ');
$replace = array('=C0','=C1','=C2','=C3','=C4','=C5','=C6','=C7','=C8','=C9','=CA','=CB','=CC','=CD','=CE','=CF','=D0','=D1','=D2','=D3','=D4','=D5','=D6','=D7','=D8','=D9','=DA','=DB','=DC','=DD','=DE','=DF','=E0','=E1','=E2','=E3','=E4','=E5','=E6','=E7','=E8','=E9','=EA','=EB','=EC','=ED','=EE','=EF','=F0','=F1','=F2','=F3','=F4','=F5','=F6','=F7','=F8','=F9','=FA','=FB','=FC','=FD','=FE','=FF');

$prenom_nom_entete = str_replace($search, $replace, $prenom_nom);
Plus dans l'entête:
Code:
$entete .= "From: =?ISO-8859-1?Q?$prenom_nom_entete?=<$expediteur>".$saut;
Maintenant c'est propre.

ddavid
23/12/2012, 11h56
Bonjour,

Citation Envoyé par pière2
Code PHP:
// filtre des serveurs présentant des bogues.

if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#"$expediteur)){
    
$saut "\r\n";
} else {
    
$saut "\n";

Très suspect...

$expediteur désigne une variable récupérée par POST.

Je ne vois pas pourquoi faire un tel raisonnement en fonction du serveur qu'aurait utilisé l'expéditeur s'il avait passé par son webmail au lieu de ton script PHP.

À mon avis, vaut mieux chercher à vérifier le standard... (Et faire attention aux problématiques de la config du serveur PHP, mais sur du mutualisé ovh linux c'est clean de ce côté)

Citation Envoyé par pière2
Code PHP:
$prenom_nom $_POST['prenom_nom'];
$prenom_nom htmlspecialchars($prenom_nomENT_QUOTES'UTF-8');
$titre $_POST['titre'];
$titre htmlspecialchars($titre); 
Le titre et les entêtes de l'email ne constituent pas du contenu HTML, il ne faut donc pas utiliser htmlspecialchars.

Les entêtes ne peuvent contenir n'importe quel caractère pour des raisons de compatibilité, le message texte ne devrait pas non plus, ni celui HTML. Il faut donc certes tout encoder (du moins quand il y a des caractères problématiques), mais pas forcément tout de la même façon...

Faut jeter un coup d'oeil du côté des RFCs, du Q-encoding et du "quoted printable" encoding, de mémoire je ne me rappelle pas de tout...

pière2
21/12/2012, 19h03
Bonjour à tous,
J'ai un programme d'envoi d'e-mail en PHP qui fonctionne presque parfaitement hormis que les caractères spéciaux s'affiche avec une coquetterie dans la colonne Expéditeur (Thunderbird).
Le nom de l'Expéditeur étant François Arnaud il s'affiche : "François" Arnaud (les guillemets!).
C'est un détail mais j'aimerais bien comprendre d'où vient l'erreur et, si possible, pouvoir la corriger.
J'imagine que c'est dans l'en-tête que doit se situer le problème mais je n'arrive pas à mettre le doigt dessus.
Je n'ai pas d'erreurs dans le corps du message pas plus que dans le sujet ni même le "message de ..." quand j'emploie des caractères spéciaux.
D'avance merci pour vos réponses.

Code PHP :
//07 12 2012 17h54
$expediteur = $_POST['expediteur'];
$adresse = $_POST['adresse'];
$prenom_nom = $_POST['prenom_nom'];
$prenom_nom = htmlspecialchars($prenom_nom, ENT_QUOTES, 'UTF-8');
$titre = $_POST['titre'];
$titre = htmlspecialchars($titre);
$message_texte = $_POST['message_texte'];
$message_html = $_POST['message_html'];
$image = $_POST['image'];


// filtre des serveurs présentant des bogues.

if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $expediteur)){
$saut = "\r\n";
} else {
$saut = "\n";
}

//entête

$delimiteur = "-----=".md5(uniqid(rand()));
$delimiteur_alt = "-----=".md5(uniqid(rand()));


$entete = "MIME-Version: 1.0".$saut;
$entete .= "Content-Type: multipart/related;".$saut." boundary=\"$delimiteur\"".$saut;
$entete .= "From: ".$prenom_nom."<$expediteur>".$saut;
$entete.= "Reply-to : $expediteur\nX-Mailer:PHP".$saut;
$entete .= "Disposition-notification-to: ".$expediteur.$saut;
$entete .= "Return-Receipt-To: ".$expediteur.$saut;
$entete .= $saut;


//message

$msg = "Message de ".$prenom_nom.$saut;

//message texte

$msg .= $saut."--".$delimiteur.$saut;
$msg.= "Content-Type: multipart/alternative;".$saut." boundary=\"$delimiteur_alt\"".$saut;
$msg .= $saut."--".$delimiteur_alt.$saut;
$msg .= "Content-Type: text/plain; charset=\"utf-8\"; format=flowed".$saut;
$msg .= "Content-Transfer-Encoding:8bit".$saut;
$msg .= $saut.$titre.$saut;
$msg .= $message_texte.$saut;

//message HTML

$msg .= $saut."--".$delimiteur_alt.$saut;
$msg .= "Content-Type: text/html; charset=\"utf-8\"".$saut;
$msg .= "Content-Transfer-Encoding:8bit".$saut;
$msg .= $saut.$message_html.$saut;
$msg .= $saut."--".$delimiteur_alt.$saut;

//image

if($image != 'null'){
$image = '../photos/'.$image;
$fp = fopen($image, "rb");
$fichierattache = fread($fp, filesize($image));
fclose($fp);
$fichierattache = chunk_split(base64_encode($fichierattache));

$msg .= $saut."--".$delimiteur.$saut;
$msg .= "Content-Type: application/octet-stream; name=\"$image\"".$saut;
$msg .= "Content-Transfer-Encoding: base64".$saut;
$msg .= "Content-ID: ".$saut;
$msg .= $saut;
$msg .= $fichierattache.$saut;
}

$msg .= $saut.$saut;
$msg .= $saut."--".$delimiteur.$saut;

mail($adresse,$titre,$msg,$entete);

sleep(3);

echo "message à $adresse envoyé";
?>



Pi'ère2