Problème avec script d'envoie de mail et pièce jointe

Fermé
goldenfischDesign Messages postés 2 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 4 octobre 2012 - 3 oct. 2012 à 13:26
goldenfischDesign Messages postés 2 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 4 octobre 2012 - 4 oct. 2012 à 13:52
Bonjour,

Je post sur le forum un peu à l'emporte pièce car je suppose que la question a déjà été abordée et sûrement résolu mais le temps ne m'aide pas pour fouiller tous les post.

Je viens de réaliser un formulaire de demande d'emploi (enfin c'est l'objectif final) dans lequel, les utilisateurs pourraient soummettre leur CV, diplôme, et une photo d'identité en plus de renseigner leur mail, nom, prenom et remplir une lettre de motivation en ligne.

Pour des besoins de test, j'ai simplifié le formulaire à un seul fichier le temps de voir comment le poster.

Structure de la page form_test_envoiemail.php

<html>
<head>
<title></title>
</head>

<body>
<form id="form_carriere" method="post" action="reception_variables.php" enctype="multipart/form-data">
  <fieldset>
  <legend>Votre identité</legend>
   <p>
    <label for="nom">Nom :</label>
    <input type="text" style="background-color:#09C; padding-left:10px; font-family:'nevis Bold', Arial; font-size:11px; color:#FFF;" name="nom" id="nom">
   </p>
   
   <p>
    <label for="prenom">Prénom :</label>
    <input type="text" style="background-color:#09C; padding-left:10px; font-family:'nevis Bold', Arial; font-size:11px; color:#FFF;" name="prenom" id="prenom">
   </p>
   
   <p>
    <label for="objet">Objet de votre mail :</label>
    <input type="text" style="background-color:#F00; padding-left:10px; font-family:'nevis Bold', Arial; font-size:11px; color:#FFF;" name="objet" id="objet">
   </p>
   
   <p>
    <label for="message">Message :</label><br/>
    <textarea style="background-color:#FFF; padding:4px; font-family:'nevis Bold', Arial; font-size:12px; color:#555;" name="message" id="message" cols="50" rows="12"></textarea>
   </p>
   
   <p>
    <label for="email">Email pour vous répondre :</label>
    <input type="text" style="background-color:#Fbf; padding-left:10px; font-family:'nevis Bold', Arial; font-size:11px; color:#000;" name="email" id="email">
   </p>
  </fieldset>
  
  <fieldset>
   <legend>Votre pièce à joindre</legend>
   <label for="piecejointe" style="margin-top:8px; margin-bottom:8px;">Sélectionner un fichier (seuls les fichiers .doc, .jpg, .gif, .png ou .pdf sont acceptés)</label><br/>
   <input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
   <input type="file" name="piecejointe" id="piecejointe">
  </fieldset>
  <input type="submit" name="submit" id="submit" value="Envoyer">
</form>
</body>
</html>


Voici le code de la première version du fichier de traitement reception_variables.php:

<?php
// On vérifie que le formulaire a été correctement rempli

if(isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['objet']) && isset($_POST['message']) && isset($_POST['email'])){

// si la réponse est positive, alors on récupère les valeurs à traiter
	
	$_nomExpediteur = $_POST['nom'];
	$_prenomExpediteur = $_POST['prenom'];
	$_objet = $_POST['objet'];
	$_messageExpediteur = $_POST['message'];
	$_emailExpediteur = $_POST['email'];
	
	echo "<br/>".$_prenomExpediteur."<br/>";
	
	// clé aléatoire de limite
	$_boundary = md5(uniqid(microtime(), TRUE));
	
	// headers des mails
	$_headers = 'From : '.$_nomExpediteur.' '.$_prenomExpediteur.'<'.$_emailExpediteur.'>'."\r\n";
	$_headers .= 'Ccc : Lucius SAHAJ <lesahaj@gmail.com>'."\r\n";
	$_headers = 'Mime-Version: 1.0'."\r\n";
	$_headers .= 'Content-type: multipart/mixed;boundary='.$_boundary."\r\n";
	$_headers .= "\r\n";
	
	// encodage des caractères
	$_msg = 'Ceci est un mail automatique provenant de webmaster ANINF et est sous forme multipart/mixed';
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= 'Content-type:text/plain;charset=utf-8'."\r\n";
	$_msg .= 'Content-transfer-encoding:8bit'."\r\n";
	$_msg .= 'Test message avec une pièce jointe.'."\r\n";
	
	// au contenue de $_msg je vais ajouter le message du visiteur
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= $_messageExpediteur."\r\n";
	$_msg .= "\r\n";
	
        // On test l'existence du fichier joint

	if (isset($_FILES['piecejointe']) && is_uploaded_file($_FILES['piecejointe'])){

	// on récupère les valeurs du fichier en piece jointe

	$_nomFichier =  $_FILES['piecejointe']['name'];           // Le nom original du fichier, comme sur le disque du visiteur (exemple : mon_icone.png).
	$_typeFichier =  $_FILES['piecejointe']['type'];          //  Le type du fichier. Par exemple, cela peut être « image/png ».
	$_tailleFichier =  $_FILES['piecejointe']['size'];         //   La taille du fichier en octets.
	
	// traitement du  fichier joint
	$_content = chunk_split(base64_encode(file_get_contents($_nomFichier)));
	
	// on attache les fichiers
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= 'Content-type:'.$_typeFichier.';name='.$_nomFichier."\r\n";
	$_msg .= 'Content-transfer-encoding:base64'."\r\n";
	$msg .= "Content-Disposition: attachment; filename=\"$_nomFichier\"\n\n";
	$_msg .= $content."\r\n";
	
	// fin de tous les traitements de fichiers
	$_msg .= '--'.$_boundary."\r\n";

	// Toutes les valeurs sont correctes alors on lance l'envoie du mail
	
	// @mail de destination des mails
	$_to = 'lucien.momba@aninf.ga';
	
	// On envoit le mail
	if(mail($_to, $_objet, $_message, $_headers)){
		echo "Votre mail a bien été envoyé nous vous répondrons dans les plus bref délais. <br><p> Merci de votre visite</p>";
	}
	else echo "L'envoie du dossier a échoué<br/>";
	}
	else echo "Problème avec la pièce jointe. <br/>Le mail n'a pas été envoyé ";
}
else echo "Remplissez correctement le formulaire";
?>


Le souci du code ci-dessous est qu'après validation du formulaire, je reçois le message ci-dessous de firefox:


Problème avec la pièce jointe.
Le mail n'a pas été envoyé


J'ai donc ajouté un test conditionnel sur le bouton submit en faisant avant tout le code php ci-dessus pour aboutir à:

<?php
if(isset($_POST['submit'])){
 // On vérifie que le formulaire a été correctement rempli

if(isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['objet']) && isset($_POST['message']) && isset($_POST['email'])){

// si la réponse est positive, alors on récupère les valeurs à traiter
	
	$_nomExpediteur = $_POST['nom'];
	$_prenomExpediteur = $_POST['prenom'];
	$_objet = $_POST['objet'];
	$_messageExpediteur = $_POST['message'];
	$_emailExpediteur = $_POST['email'];
	
	echo "<br/>".$_prenomExpediteur."<br/>";
	
	// clé aléatoire de limite
	$_boundary = md5(uniqid(microtime(), TRUE));
	
	// headers des mails
	$_headers = 'From : '.$_nomExpediteur.' '.$_prenomExpediteur.'<'.$_emailExpediteur.'>'."\r\n";
	$_headers .= 'Ccc : Lucius SAHAJ <lesahaj@gmail.com>'."\r\n";
	$_headers = 'Mime-Version: 1.0'."\r\n";
	$_headers .= 'Content-type: multipart/mixed;boundary='.$_boundary."\r\n";
	$_headers .= "\r\n";
	
	// encodage des caractères
	$_msg = 'Ceci est un mail automatique provenant de webmaster ANINF et est sous forme multipart/mixed';
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= 'Content-type:text/plain;charset=utf-8'."\r\n";
	$_msg .= 'Content-transfer-encoding:8bit'."\r\n";
	$_msg .= 'Test message avec une pièce jointe.'."\r\n";
	
	// au contenue de $_msg je vais ajouter le message du visiteur
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= $_messageExpediteur."\r\n";
	$_msg .= "\r\n";
	
        // On test l'existence du fichier joint

	if (isset($_FILES['piecejointe']) && is_uploaded_file($_FILES['piecejointe'])){

	// on récupère les valeurs du fichier en piece jointe

	$_nomFichier =  $_FILES['piecejointe']['name'];           // Le nom original du fichier, comme sur le disque du visiteur (exemple : mon_icone.png).
	$_typeFichier =  $_FILES['piecejointe']['type'];          //  Le type du fichier. Par exemple, cela peut être « image/png ».
	$_tailleFichier =  $_FILES['piecejointe']['size'];         //   La taille du fichier en octets.
	
	// traitement du  fichier joint
	$_content = chunk_split(base64_encode(file_get_contents($_nomFichier)));
	
	// on attache les fichiers
	$_msg .= '--'.$_boundary."\r\n";
	$_msg .= 'Content-type:'.$_typeFichier.';name='.$_nomFichier."\r\n";
	$_msg .= 'Content-transfer-encoding:base64'."\r\n";
	$msg .= "Content-Disposition: attachment; filename=\"$_nomFichier\"\n\n";
	$_msg .= $content."\r\n";
	
	// fin de tous les traitements de fichiers
	$_msg .= '--'.$_boundary."\r\n";

	// Toutes les valeurs sont correctes alors on lance l'envoie du mail
	
	// @mail de destination des mails
	$_to = 'lucien.momba@aninf.ga';
	
	// On envoit le mail
	if(mail($_to, $_objet, $_message, $_headers)){
		echo "Votre mail a bien été envoyé nous vous répondrons dans les plus bref délais. <br><p> Merci de votre visite</p>";
	}
	else echo "L'envoie du dossier a échoué<br/>";
	}
	else echo "Problème avec la pièce jointe. <br/>Le mail n'a pas été envoyé ";
}
else echo "Remplissez correctement le formulaire";
}
?>


qui m'a généré l'erreur suivante:


ANINF

Warning: is_uploaded_file() expects parameter 1 to be string, array given in C:\wamp\www\static\reception_variables.php on line 40
Problème avec la pièce jointe.
Le mail n'a pas été envoyé


J'ai donc changer le code en ajoutant un move_upload_file:

<?php
/*********************************************************************
== Avant toutes actions, on prépare la structure de notre mail html ==
==                                                                  ==
*********************************************************************/

// Création de la clé aléatoire délimitant les parties du mail
$_boundary = md5(uniqid(microtime(), TRUE));

// Mime versions
$_headersMimev = 'Mime-Version: 1.0'."\r\n";
$_headersContent .= 'Content-type: multipart/mixed;boundary='.$_boundary."\r\n";
$_headersChariot .= "\r\n";

// encodage des caractères
$_msg = 'Ceci est un mail automatique provenant de webmaster ANINF et est sous forme multipart/mixed';
$_msg .= '--'.$_boundary."\r\n";
$_msg .= 'Content-type:text/plain;charset=utf-8'."\r\n";
$_msg .= 'Content-transfer-encoding:8bit'."\r\n";
$_msg .= 'Test message avec une pièce jointe.'."\r\n";

// @mail de destination des mails
$_to = 'lucien.momba@aninf.ga';

/*********************************************************************
===  Traitement des données issue du formlaire de demande d'emploi ===
==                                                                  ==
*********************************************************************/
	
// On vérifie que le formulaire a été correctement rempli
if(isset($_POST['submit'])){

// On vérifie que les chanmps existent
if(isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['objet']) && isset($_POST['message']) && isset($_POST['email'])){
	// les champs  ci-dessus sont correctes alors on récupère leur valeur
	$_nomExpediteur = $_POST['nom'];
	$_prenomExpediteur = $_POST['prenom'];
	$_objet = $_POST['objet'];
	$_messageExpediteur = $_POST['message'];
	$_emailExpediteur = $_POST['email'];
	
	// On test la véracité de la condition isset de ces champs en affichant par exemple le nom de l'expéditeur
	echo "Merci M., Mlle, Mme ".$_nomExpediteur." de nous avoir visité <br/>";
	
	// On écrit le header en y insérant les nom, prénom et mail de demandeur
	$_headers .= 'From : '.$_nomExpediteur.' '.$_prenomExpediteur.'<'.$_emailExpediteur.'>'."\r\n".'Reply-To:'.$_emailExpediteur."\r\n".'X-Mailer:PHP/'.phpversion();
	$_headers .= 'Ccc : Lucius SAHAJ <lesahaj@gmail.com>,'.$_nomExpediteur.' '.$_prenomExpediteur.'<'.$_emailExpediteur.'>'."\r\n";
	$_headers .= $_headersChariot;
	$_headers .= $_headersMimev;
	$_headers .= $_headersContent;
	$_headers .= $_headersChariot;
	
	// Ensuite, on vérifie la présence de la pièce jointe et on l'attache
	if (isset($_FILES['piecejointe']) && $_FILES['piecejointe']['error'] == 0){
		if ($_FILES['piecejointe']['size'] <= 1000000){
		$_infosfichier = pathinfo($_FILES['piecejointe']['name']);{
			move_uploaded_file($_FILES['piecejointe']['tmp_name'], './' .basename($_FILES['piecejointe']['name']));
			echo "Opération effectué avec succè";
		}
		}
	}
	//else echo "le chargement du fichier ".$_FILES['piecejointe']['name']." a échoué";
	$_nomFichier = $_FILES['piecejointe']['name'];
	if (file_exists($_nomFichier)){
		echo $_nomFichier;
		$_typeFichier = filetype($_nomFichier);
		$_tailleFichier = filesize($_nomFichier);
		$_content = chunk_split(base64_enncode(file_get_contents($_nomFichier)))."\n";
		
		// On écrit le mail
		$_msg .= '--'.$_boundary."\r\n";
		
		// On joint le message de l'utilisateur
		$_msg .= $_messageExpediteur;
		$_msg .= '--'.$_boundary."\r\n";
		
		// On attache la pièce jointe
		$_msg .= 'Content-type:'.$_typeFichier.';name='.$_nomFichier."\r\n";
		$_msg .= 'Content-transfert-encoding:base64'."\r\n";
		$_msg .= "Content-Disposition: attachement; filename=\"$_nomFichier\"\n\n";
		$_msg .= $_content."\r\n";
	}
	if(!mail($_to,$_POST['intitule_des_problemes'], $_msg, $_headers)){
		echo "ERROR";
	}
	else echo "Mail bien envoyé";
}
else echo " Veuillez vérifier que les champs nom, prenom, objet, message et email aient été bien renseigné";
}
else echo "Formulaire non envoyé";
?>


Là, plus d'erreur mais je ne reçois pas mon mail. Mais vraiment rien du tout (ni texte ni pièce jointe)

Merci de bien vouloir m'aider.
A voir également:

1 réponse

goldenfischDesign Messages postés 2 Date d'inscription mercredi 3 octobre 2012 Statut Membre Dernière intervention 4 octobre 2012
4 oct. 2012 à 13:52
Personne????
0