Problème avec script d'envoie de mail et pièce jointe
Fermé
goldenfischDesign
Messages postés2Date d'inscriptionmercredi 3 octobre 2012StatutMembreDernière intervention 4 octobre 2012
-
3 oct. 2012 à 13:26
goldenfischDesign
Messages postés2Date d'inscriptionmercredi 3 octobre 2012StatutMembreDerniè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.
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:
Problème avec script d'envoie de mail et pièce jointe
Trouvez des réponses à vos questions sur les langages, les frameworks et les astuces de codage. Échangez avec d'autres développeurs passionnés pour améliorer vos compétences en programmation et rester au fait des dernières tendances du secteur.