Erreur lors de l'envoi d'une piece jointe

Résolu/Fermé
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014
- 26 mars 2013 à 21:29
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014
- 27 mars 2013 à 22:20
Bonjour,

J'ai une erreur au moment de l'envoi d'une pièce jointe , les données sont récupérer via un formulaire pour être envoyer à une adresse mail , tout passe sauf la pièce jointe .

L'erreur remonté après l'envoi :

Warning: file_get_contents([nom du fichier]) [function.file-get-contents]: failed to open stream:
No such file or directory in /homez.579/relevepa/www/form_mail.php on line 46


La ligne incriminée :


// Lecture du fichier

$fichier = '[nom du fichier]';
$contenu = file_get_contents($fichier);
$attachement = "\n------=$limite\n";

// Fichier Image

$attachement .= "Content-Type: image/jpeg; name=\"[nom du fichier]\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"[nom du fichier]\"\n\n";

// Joint du fichier en l'encodant en base 64

$attachement .= chunk_split(base64_encode($contenu));


Merci d'avance!
;-)


27 réponses

Utilisateur anonyme
26 mars 2013 à 22:26
Bonjour

Ton message d'erreur n'indique pas un problème de mail, mais un problème de fichier. PHP ne trouve pas la pièce à joindre, vérifie le nom du fichier.
1
ReDLoG
Messages postés
244
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 octobre 2021
57
26 mars 2013 à 22:30
A cette ligne il ne spécifie pas le nom du fichier alors PHP relève une erreur => $fichier = '[nom du fichier]';
Warning: file_get_contents([nom du fichier])

Cdlt.
0
Utilisateur anonyme
26 mars 2013 à 22:34
En effet, je n'avais même pas relevé. Ça sent le copier-coller pur et dur depuis un tuto !
0
ReDLoG
Messages postés
244
Date d'inscription
mardi 12 mars 2013
Statut
Membre
Dernière intervention
28 octobre 2021
57
26 mars 2013 à 22:42
Tout comme je n'avais pas vu pour la fonction paramétrée avec des variables $_POST ;-)
Parfois on ne voit pas les erreurs évidentes, il faut un regard externe pour faire la différence...!
Cdlt.
0
Utilisateur anonyme
27 mars 2013 à 15:39
Pour commencer, il faut OBLIGATOIREMENT mettre enctype="multipart/form-data" dans la balise <form>.

Ensuite, tu vas récupérer dans form_mail.php (si tout va bien) un tableau $_FILES (en plus de $_POST).
Comme tu as appelé ton champ fichier 'photo', tu vas t'intéresser à $_FILES['photo'] qui est lui-même un tableau.
Tu peux faire
print_r ($_FILES['photo']); die() ;
dès le début de form_mail.php pour voir si les informations récupérées te semblent correctes. Tu devrais retrouver $_FILES['photo']['name'], $_FILES['photo']['type'], etc comme indiqué dans le doc dont je t'ai donné le lien
1
Utilisateur anonyme
27 mars 2013 à 22:04
Voilà, ça marche chez moi. Comme je t'ai dit, pas peaufiné :

$nom=$_POST['nom'];
$email=$_POST['email'];
$ref_gaz=$_POST['ref_gaz'];
$comments=$_POST['comments'];
$type_image=$_FILES['photo']['type'];
$nom_image=$_FILES['photo']['name'];

//Préparation de l'entête du mail: 
$limite='-------'.uniqid();
$mail_entete = "MIME-Version: 1.0\r\n"; 
$mail_entete .= "From: $nom <$email>\r\n"; 
$mail_entete .= "Reply-To: $email\r\n"; 
$mail_entete .= "Content-Type: multipart/mixed; \r\n";
$mail_entete .= "   boundary=\"$limite\"\r\n\r\n";

// Préparation du corps du mail 
$mail_corps ="--$limite\r\n";
$mail_corps .="Content-Type: text/plain; charset=ISO-8859-1; format=flowed\r\n";
$mail_corps .="Content-Transfer-Encoding: 7bit\r\n\r\n";
$mail_corps .= "Message de : $nom, $email\n"; 
$mail_corps .= "Reference : $ref_gaz\n"; 
$mail_corps .= "$comments\r\n\r\n";
 
// Traitement PJ 
// Lecture du fichier 

$fichier = $_FILES['photo']['tmp_name']; 
$contenu = chunk_split(base64_encode(file_get_contents($fichier))); 

$mail_corps .="--$limite\r\n";
$mail_corps .="Content-Type: $type_image;\r\n";
$mail_corps .=" name=\"$nom_image\"\r\n";
$mail_corps .="Content-Transfer-Encoding: base64\r\n";
$mail_corps .="Content-Disposition: attachment;\r\n";
$mail_corps .=" filename=\"$nom_image\"\r\n\r\n";

$mail_corps .=$contenu;

// fin du message

$mail_corps .="--$limite--\r\n";


// Envoi du mail 
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) { 

//Le mail est bien expédié 

echo $msg_ok; 
} else { 

//Le mail n'a pas été expédié 
echo "Une erreur est survenue lors de l'envoi du formulaire par email"; 
} 
?>
1
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 12:25
Bonjour

Pour commencer merci de vos interventions sur ce sujet.

Alors oui j'ai suivi un tuto pour envoyer une pièce jointe , mais très franchement ce n'est pas un copier-coller brut !! ;-)

Je comprend ce vous m'avez expliquer mais je n'arrive pas a solutionner le problème. Je ne suis qu'un simple débutant mais qui aimerai comprendre...

Si quel qu' un a une idée je suis preneur, en tous les cas MERCI pour vos réponses.

Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
27 mars 2013 à 13:29
Dans cette ligne :
$fichier = '[nom du fichier]';

il faut remplacer [nom du fichier] par un vrai nom de fichier qui existe, en respectant les majuscules/minuscules et en indiquant aussi le chemin si ce fichier n'est pas dans le même dossier que le script
De la même manière, dans filename=\"[nom du fichier]\", il faut remplacer [nom du fichier] par un vrai nom de fichier SANS chemin (car c'est le nom qui sera proposé à celui qui recevra le mail, et qui choisira lui-même le chemin)
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 13:42
Bonjour ,
Merci encore une fois de votre intervention , vous m'avez déjà beaucoup aide.

Mais ce que je ne comprend pas c'est le faite de mettre un vrai nom de fichier existant , hors je ne peut pas encore le connaitre puis-qu il sera envoyé via un formulaire avec le bouton "parcourir".

J'ai 4 valeurs à récupérer :
nom , adresse mail , une référence (17chiffres) , la pièce jointe et éventuellement des commentaires .

Encore merci.

Cordialement
0
Utilisateur anonyme
27 mars 2013 à 13:56
Ne mélangeons pas les problèmes...
Tu essayes de tout faire à la fois, c'est le meilleur moyen de te noyer si tu débutes.
Par quel point veux-tu commencer : récupérer un fichier via un formulaire, ou essayer d'envoyer un fichier en pièce jointe ?
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 13:59
Tu as entièrement raison ! Je pense m'être mal explique :

Mon but ultime est de récupérer cette fameuse pièce jointe via le formulaire.
0
Dans un premier temps, il faut le télécharger vers le serveur.
Quand tu dis dans ton 1er message que les données sont récupérées via le formulaire, est-ce que ça veut dire que le fichier aussi est récupéré, ou seulement le nom du fichier ? Tu vois bien la différence ?
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 14:23
Oui je pense faire la différence , enfin j'espère ?

Ce que je voudrai c'est récupérer le fichier (ici une photo)

Mais dans l'état actuelle des choses je ne reçoit, ni l'un ni l'autre.
En lieu et place de la pièce jointe , j'ai la partie du code concernant la pièce jointe.
0
Utilisateur anonyme
27 mars 2013 à 14:38
On avait dit qu'on séparait les problèmes. Oublie complètement le mail.
Car avant que ton mail puisse envoyer une pièce joine, il faut d'abord que cette future pièce jointe soit sur ton serveur (ton hébergement)
Ton fichier est-il oui ou non téléchargé ou pas vers ton serveur ?
Si tu n'en as aucune idée, montre le script qui traite le formulaire.
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 14:58
Ok je comprend mieux !
Alors en effet le fichier n'est pas pas télécharger sur mon serveur .

Voici mon code coté php :

$msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>";
$msg_ok = "Votre demande a bien été prise en compte.";
$message = $msg_erreur;

define('MAIL_DESTINATAIRE','cpcr75@gmail.com'); // remplacer par votre email
define('MAIL_SUJET','Index PHOTO DZ');

// vérification des champs

if (empty($_POST['nom']))
$message .= "Votre nom<br/>";

if (empty($_POST['email']))
$message .= "Votre adresse mail<br/>";

if (empty($_POST['ref_gaz']))
$message .= "Votre reference<br/>";

if (empty($_POST['photo']))
$message .= "Votre photo<br/>";

// si un champ est vide, on affiche le message d'erreur et on stoppe le script
if (strlen($message) > strlen($msg_erreur)) {
echo $message; die();
}

// sinon c'est ok => on continue
foreach($_POST as $index => $valeur) {
$$index = stripslashes(trim($valeur));
}

//Préparation de l'entête du mail:

$mail_entete = "MIME-Version: 1.0\r\n";
$mail_entete .= "From: {$_POST['nom']} "
."<{$_POST['email']}>\r\n";
$mail_entete .= 'Reply-To: '.$_POST['email']."\r\n";
$mail_entete .= 'Content-Type: text/html; charset="iso-8859-1"';
$mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
$mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";

// Traitement PJ
// Lecture du fichier

$fichier = '[nom du fichier]';
$contenu = file_get_contents($fichier);
$attachement = "\n------=$limite\n";

// Fichier Image

$attachement .= "Content-Type: image/jpeg; name=\"[nom du fichier]\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"[nom du fichier]\"\n\n";

// Joint du fichier en l'encodant en base 64

$attachement .= chunk_split(base64_encode($contenu));


// Préparation du corps du mail

$mail_corps = "Message de : $nom, $email\n";
$mail_corps .= "Reference : $ref_gaz\n";
$mail_corps .= "Photo : $attachement\n";
$mail_corps .= $comments;

// Envoi du mail
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete)) {

//Le mail est bien expédié

echo $msg_ok;
} else {

//Le mail n'a pas été expédié
echo "Une erreur est survenue lors de l'envoi du formulaire par email";
}
?>
0
Utilisateur anonyme
27 mars 2013 à 15:04
Effectivement, ce script ne télécharge rien du tout.
Peux-tu montrer le formulaire ?
Le téléchargement des fichiers est expliqué dans le doc :
https://www.php.net/manual/fr/features.file-upload.php

Et ne fais pas ça :
// sinon c'est ok => on continue 
foreach($_POST as $index => $valeur) { 
$$index = stripslashes(trim($valeur)); 
} 

C'est une grosse faille de sécurité.
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 15:16
Je pensai que ça éviter d'envoyer du code via le formulaire .

Oui bien sur : voici le code cote formulaire :

<form method="POST" action="form_mail.php" >

<input type="hidden" name="subject" value="formmail">
<br/>
<p class="infofor">Veuillez vous munir du courrier reçu pour la réference de votre contrat gaz.</p>

<p>
<table>

<tr><td> Nom :</td>
<td><input type="text" name="nom" size="30" class="nom"></td></tr>

<tr><td> Email :</td>
<td><input type="email" name="email" size="30" class="email"></td></tr>

<tr><td>Réference du contrat Gaz :</td>
<td><input type="number" name="ref_gaz" size="18" maxlength="17" class="ref_gaz" title="Indiquer les 17 chiffres figurant dans notre courrier"></td></tr>

<tr><td>Photo de votre compteur :</td>
<td><input type="file" name="photo"/></td></tr>

<tr><td colspan=2>Commentaires :<br>
<textarea COLS=51 ROWS=2 name="comments" class="comments"></textarea></td></tr>
<br/>
</table>
</p>

<input type="submit" value="Envoyer" class="envoyer"><input type="reset" value="Annuler" class="annuler">
</div>
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 16:19
J'ai bien changer le "enctype " cote formulaire ,
ensuite je ne comprend rien du tout .... doit je effacer mon code ou insérer
$_FILES ['photo']

Et pour le print _r je lai mis au tout début du code php mais rien ne ce passe !

Je suis complétement perdu !
0
Utilisateur anonyme
27 mars 2013 à 16:56
J'ai supposé que le formulaire et son traitement étaient dans deux pages différentes... Est-ce bien le cas ou ton formulaire est-il lui-même dans form_mail.php ?
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 17:53
Oui c 'est exactement mon cas :
D'un cote le formulaire en html (envoyer.html) et de l'autre mon fichier de traitement en php (form_mail.php)
0
Utilisateur anonyme
27 mars 2013 à 17:56
Alors tu mets dès le début de form_mail.php , juste après <?php :
print_r ($_FILES['photo']); 
die() ;
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 18:05
C 'est ajouter .

En faisant un test pour envoyer une pièce jointe , je remplis tous les champs demande et la, le message d'erreur que j'ai maintenant est le suivant :

Array ( [name] => double.jpg [type] => image/jpeg [tmp_name] => /var/log/tmp/phph6SpVc [error] => 0 [size] => 39166 )
0
Utilisateur anonyme
27 mars 2013 à 18:33
Mais ce n'est pas un message d'erreur ! C'est le résultat du print_r et ça montre que le fichier est bien téléchargé : il fait 39166 octets et est enregistré dans /var/log/tmp/phph6SpVc

Tu peux supprimer le print_r et le die.

Il faut maintenant modifier le reste pour prendre en compte le fichier où se trouve l'image et son nom :
remplace
$fichier = '[nom du fichier]';

par
$fichier = $_FILES|'photo']['tmp_name']; 


et
$attachement .= "Content-Disposition: attachment; filename=\"[nom du fichier]\"\n\n"; 

par
$attachement .= "Content-Disposition: attachment; filename=\"" . $_FILES['photo']['name']."\"\n\n"; 
0
cpcr
Messages postés
29
Date d'inscription
jeudi 7 mars 2013
Statut
Membre
Dernière intervention
16 avril 2014

27 mars 2013 à 19:24
Je comprend mieux cette commande .
J'y vois un peu plus clair , donc déjà un énorme Merci ;-)

Ensuite pour le code
$fichier=... et $attachement=....
Cette partie a été remplace dans le fichier de traitement .

Par contre, maintenant à l'envoi du formulaire , j'ai bien le message
" Votre demande a été prise en compte ".

Mais rien dans la boite .....
0
Utilisateur anonyme
27 mars 2013 à 20:14
Pour séparer les problèmes, on va envoyer un mail simple :
if (mail(MAIL_DESTINATAIRE,MAIL_SUJET,"coucou")) { 
0