envoi plusieurs pieces jointes dans mail

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : envoi plusieurs pieces jointes dans mail

par HelloElo » 01 févr. 2007, 17:52

Voila ce que ça me donne :

Array
(
[lm] => Array
(
[name] => bidule.doc
[type] =>
[tmp_name] =>
[error] => 2
[size] => 0
)

)

Pourquoi je n'ai que le nom ?

par Ryle » 01 févr. 2007, 17:39

et l'upload ne marche pas
C'est à dire que tes fichiers n'arrivent pas sur le serveur ? Essaye de faire afficher le contenu de $_FILES pour vérifier que tes fichiers sont bien envoyés sur le serveur :
<pre>
print_r($_FILES);
</pre>
Vérifie également que l'enctype de ton formulaire est bien défini... :)

par HelloElo » 01 févr. 2007, 17:16

Je viens de tester move_uploaded_file(..) et l'upload ne marche pas !!! Même quanfd je met les variable directement.

Je met mon code bien qu'il ressemble étrangement à celui poster en haut du poste :

Code : Tout sélectionner

<? //Piece joint Lettre motivation $fichier1 = $_FILES['cv']; $temp1 = $fichier1['tmp_name']; $name1 = $fichier1['name']; $size1 = $fichier1['size']; move_uploaded_file($temp1, $name1); //Piece joint CV $fichier2 = $_FILES['lm']; $temp2 = $fichier2['tmp_name']; $name2 = $fichier2['name']; $size2 = $fichier2['size']; move_uploaded_file($temp2, $name2); //Routine d'envoi $boundary = "-----=".md5(uniqid(rand())); // Version du format MIME utilisé $header = "MIME-Version: 1.0\r\n"; // Boundary = Frontière en Anglais $header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; $header .= "\r\n"; //-------------------------------------------------- // Construction du message //-------------------------------------------------- $msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed.\r\n"; // Chaque partie du message est séparé par une frontière $msg .= "--$boundary\r\n"; // Et pour chaque partie on en indique le type $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n"; // Et comment il sera codé $msg .= "Content-Transfer-Encoding:8bit\r\n"; // Il est indispensable d'introduire une ligne vide entre l'entête et le texte $msg .= "\r\n"; // Enfin, vous pouvez écrire votre Message ici // Je vais vous expliquer comment faire votre description plus bas $msg .= "\n*** Resultat du formulaire ***\n"; if(count($HTTP_POST_VARS)){ while (list($key, $val) = each($HTTP_POST_VARS)){ $msg .="$key : $val\n"; } } if(count($HTTP_GET_VARS)){ while (list($key, $val) = each($HTTP_GET_VARS)){ $msg .="$key : $val\n"; } } $msg .="*************************\n"; $msg .= "\r\n"; // Tout d'abord lire le contenu du fichier $fp = fopen($name1, "rb"); // b c'est pour les windowsiens $attachment = fread($fp, filesize($name1)); fclose($fp); // puis convertir le contenu du fichier en une chaîne de caractère // certe totalement illisible mais sans caractères exotiques // et avec des retours à la ligne tout les 76 caractères // pour être conforme au format RFC 2045 $attachment = chunk_split(base64_encode($attachment)); // Ne pas oublier que chaque partie du message est séparé par une frontière $msg .= "--$boundary\r\n"; // Et pour chaque partie on en indique le type $msg .= "Content-Type: image/gif; name=\"$name1\"\r\n"; $msg .= "Content-Transfer-Encoding: base64\r\n"; // Petit plus pour les fichiers joints // Il est possible de demander à ce que le fichier // soit si possible affiché dans le corps du mail $msg .= "Content-Disposition: inline; filename=\"$name1\"\r\n"; // Il est indispensable d'introduire une ligne vide entre l'entête et le texte $msg .= "\r\n"; // C'est ici que l'on insère le code du fichier lu $msg .= $attachment . "\r\n"; $msg .= "\r\n\r\n"; // voilà, on indique la fin par une nouvelle frontière $msg .= "--$boundary\r\n"; //on fait la seconde piece $fp2 = fopen(name2, "rb"); // b c'est pour les windowsiens $attachment2 = fread($fp2, filesize($name2)); fclose($fp2); // puis convertir le contenu du fichier en une chaîne de caractère // certe totalement illisible mais sans caractères exotiques // et avec des retours à la ligne tout les 76 caractères // pour être conforme au format RFC 2045 $attachment2 = chunk_split(base64_encode($attachment2)); // Ne pas oublier que chaque partie du message est séparé par une frontière $msg .= "--$boundary\r\n"; // Et pour chaque partie on en indique le type $msg .= "Content-Type: image/gif; name=\"$name2\"\r\n"; $msg .= "Content-Transfer-Encoding: base64\r\n"; // Petit plus pour les fichiers joints // Il est possible de demander à ce que le fichier // soit si possible affiché dans le corps du mail $msg .= "Content-Disposition: inline; filename=\"$name2\"\r\n"; // Il est indispensable d'introduire une ligne vide entre l'entête et le texte $msg .= "\r\n"; // C'est ici que l'on insère le code du fichier lu $msg .= $attachment2 . "\r\n"; $msg .= "\r\n\r\n"; // voilà, on indique la fin par une nouvelle frontière $msg .= "--$boundary--\r\n"; $subject = "Prise de contact sur le site optilib.com "; $destinataire = "[email protected]"; $expediteur = "[email protected]"; $reponse = $expediteur; echo "Ici, vous mettez le message qui doit être affiché après l'envoie du courriel!"; mail($destinataire, "$subject", $msg,"Reply-to: $reponse\r\nFrom: $expediteur\r\n".$header); ?> </body> </html>
Pourriez-vous m'orienter car la je ne vois vraiment pas.
Merci

par Ryle » 01 févr. 2007, 16:56

Attention à la priorité d'exécution des opérateurs . (concatenation) et = (affectation).
echo "nom :".$name_file = $_FILES['lm']['name']."<br>"; 
// revient à :
echo ( "nom :" . ( $name_file = ( $_FILES['lm']['name']."<br>" ) ) ); 
Au final $name_file doit avoir un "<br>" (que tu ne vois pas affiché dans le nom à l'écran de ton navigateur, mais qui du coup plante le move_uploaded_file)

Distingue bien les deux actions :
$name_file = $_FILES['lm']['name'];
echo "nom : ". $name_file ."<br>"; 
ou utilise directement les variables, pas besoin de les stocker dans des variables intermédiaires :)
echo "nom : ". $_FILES['lm']['name'] ."<br>";
move_uploaded_file($_FILES['lm']['tmp_name'], $_FILES['lm']['name']);

par HelloElo » 01 févr. 2007, 16:37

Mon fichier ne peux pas s'ouvrir car je n'arrive pas à récupérer le chemin du fichier.( voir ligne rouge dans le code)

QUand j'affiche ma variable $source, ça ne m'affiche rien alors que je devrais avoir le chemin temporaire du fichier.

Mais je ne comprends pas pourquoi.

Merci pour votre aide.

Code : Tout sélectionner

<? //Piece joint Lettre motivation echo "nom :".$name_file = $_FILES['lm']['name']."<br>"; echo "Chemin".$source=$_FILES['lm']['tmp_name']."<br>"; move_uploaded_file($source, $name_file); //Piece joint CV echo $name_file2 = $_FILES['cv']['name']; echo $source2=$_FILES['cv']['tmp_name']; move_uploaded_file($source2, $name_file2); ....

Re: Les pièces jointes sont vides

par Ryle » 01 févr. 2007, 16:04

Warning: fopen(bidule.doc): failed to open stream: No such file or directory in ...
Il n'arrive pas à ouvrir le fichier "bidule.doc" (voir le détail des "..." pour savoir ou il le cherche et à quel endroit du script il en a besoin).
Vérifie que celui-ci est bien à l'endroit indiqué et que les droits du fichier permettent de le lire :)

Les pièces jointes sont vides

par HelloElo » 01 févr. 2007, 15:47

Bonjour,

Je n'arrivais pas envoyer 2 pièces jointes par mail via un formulaire. J'ai trouvé ce code. Je l'ai testé et j'ai les erreurs suivantes pour les 2 fichiers :

Warning: fopen(bidule.doc): failed to open stream: No such file or directory in ...
Warning: filesize(): Stat failed for bidule.doc (errno=2 - No such file or directory) in ....
Warning: fread(): supplied argument is not a valid stream resource in ...
Warning: fclose(): supplied argument is not a valid stream resource in ...

Je recois bien les 2 pièces jointes, mais bien sûr elle sont vides !

Je ne trouve pas d'ou vient le problème. Pourriez-vous m'aider ?

Merci d'avance

par albat » 06 nov. 2006, 18:33

Le piaf aboie et la coccinelle passe... :-({|=


Bon. C'est bien beau tout ça, mais... est-ce que cela a pu aider logone ? :-*

Non, parce qu'au départ, on parlait vaguement d'un truc en PHP... 8-[

par logone » 06 nov. 2006, 18:33

Merci pour ce coup de main en effet il semble que cela arrange mon probleme je recoit bien 2 PJ dans mon mail mais il semble qu'il y ai un probleme lors de la lecture d'une des 2 pieces

Warning: fopen(carte_vital_0001.pdf): failed to open stream: No such file or directory in c:\apache\htdocs\------exploit\optilib\recrutement.php on line 214

Warning: filesize(): Stat failed for carte_vital_0001.pdf (errno=2 - No such file or directory) in c:\apache\htdocs\------exploit\optilib\recrutement.php on line 215

Warning: fread(): supplied argument is not a valid stream resource in c:\apache\htdocs\------exploit\optilib\recrutement.php on line 215

Warning: fclose(): supplied argument is not a valid stream resource in c:\apache\htdocs\------exploit\optilib\recrutement.php on line 216

Le fichier existe bien dans le mail mais fais 4 octets.

Bizarre

par Ryle » 06 nov. 2006, 18:27

pfffff...
la bave de la coccinelle facétieuse n'atteind pas le dodu piou... Image
ou un truc du genre... ;)

par albat » 06 nov. 2006, 18:19

Et une victoire éclatante de la coccinelle facétieuse sur le piaf dodu !!! \:D/ :langue:

par Ryle » 06 nov. 2006, 18:13

Ah oki, au temps pour moi, je n'ai pas réalisé que tu parlais seulement de celui situé entre les deux pj. Et effectivement, c'est fort probable en effet qu'il ne faille fermer que le tout dernier..

Je retire donc ce que j'ai dit et vais aller expier en me fouetant avec des orties fraichement coupées ! :oops:

par albat » 06 nov. 2006, 17:55

Je me permets d'insister car je suis persuadé que...

la frontière initiale et les frontières intermédiaires s'écrivent :
"--" . $boundary . "\n";
seule la frontière finale ajoute deux - à la fin :
"--" . $boundary . "--\n";

par Ryle » 06 nov. 2006, 17:45

Bah euh.. non c'est pas la même chose.. en théorie le boundary s'ouvre avec 2 tirets avant et se referme avec 2 tirets avant et après :
$body .= "--" . $boundary . "\n";
...
$body .= "--" . $boundary . "--\n";
Ca serait pas le Content-Type (gif) qui ne serait pas adapté ?

par albat » 06 nov. 2006, 17:23

Je te suggère de remplacer :
// voilà, on indique la fin par une nouvelle frontière
$msg .= "--$boundary--\r\n";

//on fait la seconde piece 
par :
// voilà, on indique la fin par une nouvelle frontière
$msg .= "--$boundary\r\n";

//on fait la seconde piece