8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je cherche mon erreur depuis un moment et comme je n'arrive pas à trouver, je viens chercher de l'aide ici (je n'arrive plus à envoyer une piece jointe au mail).

Mon script à marché, mais lorsque j'ai voulu le securiser en refusant les fichiers dont l'extension est diffrente de word et pdf et dont la taille dépasse le taille maxi, cela n'a plus marché. Je suis donc revenu à la version précédente mais ca ne marche pas non plus.

Voici le code :

<h2>Candidature en ligne</h2>

<?php
if (isset($_POST['action']))
{
	//le formulaire a été soumis 
	if($_POST['action'] == 'submitted')
	{
		$expediteur = $_POST['eMail'];  //adresse mail saisie ds la formulaire
		$destinataire = "v.bachelot@voila.fr";  //adresse ccm destinataire du message
		$objet = "Formulaire candidature site CCM";

		$entete = "From: $expediteur\n";
		$entete .= "X-Mailer: PHP/" . phpversion() . "\n" ;
		$entete .= "X-Sender: $expediteur\n";
		$entete .= "X-Priority: 3\n";
		$entete .= "Return-Path: $expediteur\n";

		$boundary = "__==" . md5(uniqid("")) . "==__";
		$entete .= "Mime-version: 1.0\n";
		$entete .= "Content-type: multipart/mixed; boundary=\"$boundary\"\n";

		$message = "--$boundary\n"; //début de l'objet (le délimitateur est la valeur $boundary)
		$message .= "Content-type: text/plain; charset=\"iso-8859-1\"\n";
		$message .= "Content-transfer-encoding: 8bit\n\n";
		$message .= "Dépôt d'une candidature sur le site de CCM : \n\n";
		$message .= $_POST['prenom']." ".$_POST['nom']." a laissé le message suivant :\n\n";
		$message .= $_POST['message']." \n";
		$message .= "-- \n";

        echo "name=".$_FILES['fic_cv']['name'];
        echo "tmp_name=".$_FILES['fic_cv']['tmp_name'];
		echo "type=".$_FILES['fic_cv']['type'];

		if (is_file($_FILES['fic_cv']['tmp_name']) && ($fp = fopen($_FILES['fic_cv']['tmp_name'], "rb")))
		//présence d'une piece jointe 
		{
		echo "test envoi avec fichier";

			$extension  = substr($_FILES['fic_cv']['name'],-3); //extension du fichier uploadé

			//lecture du fichier uploadé sur le serveur dans un répertoire temporaire et avec un nom temporaire
			//ce fichier ne sera pas conservé sur le serveur (pas besoin, car envoi via mail)
			$data = fread($fp, filesize($_FILES['fic_cv']['tmp_name']));
			fclose($fp);
			//pour la transmission du fichier par courrier electronique, il doit etre scindé en lignes qui ne 	doivent pas dépasser 76 caracteres.
			//Pour cela php possède 2 fonctions :
			//(1)chunk_split permet de decouper les lignes en 76 caracteres
			//(2)base64_encode pour encoder base64
			$contents = chunk_split(base64_encode($data));
			$message .= "\n\n\n";
			$message .= "--$boundary\n";

			//on envoi le fichier sous un autre nom, du type "fic_cv_nom.extension"
			$nomFicEnvoi = "fic_cv_".$_POST['nom'].".".$extension;
			$message .= "Content-type:".$_FILES['fic_cv']['type'].";name=".$nomFicEnvoi." \n";
			$message .= "Content-transfer-encoding: base64\n";
			$message .= "Content-disposition: attachement; filename=".$nomFicEnvoi."\n\n";
			$message .= $contents; //ajout du contenu du fichier
		}

		$message .= "\n\n\n";
		$message .= "--$boundary--\n"; //fin du message

		if (mail($destinataire, $objet, $message, $entete))
		{
		echo "</br>";
	    echo "<p>Merci de nous avoir contacté, vous recevrez bientôt une réponse ...</p>";
		}
		else
		{
		echo "</br>";
	    echo "<p>Un problème est survenu lors de l’envoi de votre message,\n</p>";
	    echo "<p>L'adresse mail que vous avez indiqué est peut être erronée ...\n</p>";
		}
	}
}
else
{
	//saisie du formulaire 
.....



Pour info, voici le code que je voulai ajouter pour refuser l'envoi si maivaise extension de fichier ou taille de fichier trop grosse

		  //si présence d'une piece jointe 
		  if (isset($_FILES['fic_cv']['tmp_name']) && is_uploaded_file($_FILES['fic_cv']['tmp_name']))
		  {
			echo "test ok";
			//Vérifications de l'extension du fichier uploadé et de sa taille
			$extensions_ok = array('doc', 'pdf');  
			$taille_max = 100;  
			$format= substr(strrchr($_FILES['fic_cv']['name'], '.'), 1);

			$erreur="";
			//in_array() Indique si une valeur appartient à un tableau 
			//strrchr retourne le segment du nom du fichier qui commence avec la dernière occurrence de "." , 	jusqu'à la fin du nom (donc l'extension). 
			if( !in_array( substr(strrchr($_FILES['fic_cv']['name'], '.'), 1), $extensions_ok ) )  
			{    
			$erreur = "<br/><p>Votre fichier a le format ".$format."<br/><span class='texteRouge'>Attention : Les seuls formats de fichiers autorisés sont 'doc', et 'pdf' !</span></p>"; 
	        echo $erreur;
			}  
			$taille=$_FILES['fic_cv']['size'];

			//On va vérifier la taille du fichier en ne passant pas par $_FILES['fic_cv']['size'] pour éviter les failles de sécurité 
			$taille=filesize($_FILES['fic_cv']['tmp_name']);

			echo "taillefic=".$taille."___";
			if ($taille > $taille_max) 
			{    
				$erreur = "<p><span class='texteRouge'>Votre fichier doit faire moins de ".$taille_max." !</span></p>";  
			    echo $erreur;
			}
	        if ($erreur!="")
			{
				echo "<p>Pour recommencer<a href=".$_SERVER['PHP_SELF']."?lang=".$lang."> Cliquez ici </a></p>";
				exit; //arrêt de l'execution
			}
			//Fin des vérifications sur le fichier 
		  }


Merci pour votre coup de main.

Valérie
Il n'y a pas d'erreur retourné
car le message suivant s'affiche :
"Merci de nous avoir contacté, vous recevrez bientôt une réponse ..."

SAUF que je ne reçois pas le mail en piece jointe.
Pas facile de trouver ds ces conditions ...

Valérie
Salut,

Cela signifie que ton formualire fonctionne mais que ta pièce jointe n'est pas ajoutée.
Est-ce que la pièce jointe est détectée : test envoi avec fichier ?
En fait, le script marche seulement pour certains fichiers

J'ai fait plusieurs tests :
1***Avec le fichier duap_webdyn.pdf (10Ko) ca marche tj -> le texte "envoi avec fichier" s'affiche bien ainsi que le nom du fichier temporaire
Voici ce qui s'affiche apres l'envoi :
Candidature en ligne
name=duap_webdyn.pdf tmp_name=/tmp/phpliy9Bg type=application/pdf test envoi avec fichier
Merci de nous avoir contacté, vous recevrez bientôt une réponse ...


En renommant le fichier avec un nom trés long , ca marche encore.

2***Pour d'autres fichiers ca ne marche pas :
La piece jointe n'est pas détectée ("envoi avec fichier" ne s'affiche pas)
PresentLunoUnivNancy.pdf (201Ko)
FormationMetzUniversitéPour2005_brochure_ufr_sha_2004.pdf (862Ko)

Dans leurs cas, le code ci-dessous ne peut s'executer (car le nom temporaire est vide) :
if (is_file($_FILES['fic_cv']['tmp_name']) && ($fp = fopen($_FILES['fic_cv']['tmp_name'], "rb")))
puisque la phrase "test envoi avec fichier" ne s'affiche pas

Voici par exemple ce qui s'affiche apres l'envoi d'un de ces fichiers :
Candidature en ligne
name=PresentLunoUnivNancy.pdf tmp_name=none type=application/pdf
Merci de nous avoir contacté, vous recevrez bientôt une réponse ...


CONCLUSIONS :
---> il semble qu'il y ai un pb de taille de fichier. J'ai essayé d'uploader un fichier de 31Ko et ca a marché.
--->J'ai vérifié la variable globale upload_max_filesize avec phpinfo et elle indique 2M (chez mon hebergeur)

AUTRES PROBLEMES :
***SI la taille dépasse 2 M => ca ne marche pas, rien ne se passe; il n'y a aucune erreur fatale et le test sur la taille limite ne peut se faire
***SI le temps de chargement est trop long => une erreur fatal survient

Je suis en version php 4 chez mon hebergeur. Est-il possible de gérer les exceptions ?

Merci de vos infos
Modifié par valfr (23 Dec 2006 - 14:48)
Hello,

Il n'y a pas que le upload_max_filesize qu'il faille vérifier, il faut aussi vérifier la taille de post_max_size (taille du formulaire soumis, PJ y compris) qui doit être nécessaire supérieure à upload_max_filesize.

A+