8722 sujets

Développement web côté serveur, CMS

Script sans sécuriter pour gérer l'envoi d'un mail et fichier :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Validation de la demande</title>

</head>
<?php

//--------------------------------------------------------------------------------------------------------------
//							RECUPERATION DES CHAMPS FORMULAIRE ET CREATION DES VARIABLES
//--------------------------------------------------------------------------------------------------------------

// Définir les limites entre la partie HTML et fichier
$frontiere = '-----=' . md5(uniqid(mt_rand())); 

// On initialise $allisok; à la moindre erreur, il passe à 0
$allisok=1;

// Récupération des fichiers de formulaire et on les assimile à une variable
$Champ01 = $_POST["ch01"];
$Champ02 = $_POST["ch02"];
$Champ03 = $_POST["ch03"];
$Champ04 = $_POST["ch04"];
$Champ05 = $_POST["ch05"];
$Champ06 = $_POST["ch06"];
$Champ07 = $_POST["ch07"];
$Champ08 = $_POST["ch08"];
$Champ09 = $_POST["ch09"];
$Champ10 = $_POST["ch10"];
$Champ11 = $_POST["ch11"];
$Champ12 = $_POST["ch12"];
$Champ13 = $_POST["monfichier"];

// Validation si un champ est oublié
if ($Champ01==""){
echo("Vous n'avez pas renseigné le champ 'Prénom Nom'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ02==""){
echo("Vous n'avez pas renseigné le champ 'UFR/Service/Association'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ03==""){
echo("Vous n'avez pas renseigné le champ 'Votre adresse mail : '. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ04==""){
echo("Vous n'avez pas renseigné le champ 'Pays'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ05==""){
echo("Vous n'avez pas renseigné le champ 'Titre de l'évènement'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ08==""){
echo("Vous n'avez pas renseigné le champ 'Nom de l'institution/organisateur'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ09==""){
echo("Vous n'avez pas renseigné le champ 'Description de l'évènement'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ11==""){
echo("Vous n'avez pas renseigné le champ 'Contact'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}
if ($Champ12==""){
echo("Vous n'avez pas renseigné le champ 'Site Web'. Faites précédent pour revenir sur la page du formulaire.<br/><br/>");
$allisok = 0;
}

// Préparation du $contenu
$nom = "<br /><h3>Coordonnées</h3>La demande provient de ".$Champ01."<br />";
$service = "Son UFR/Service/Association est : ".$Champ02."<br />";
$mail = "Son adresse mail est ".$Champ03."<br />";
$pays = "Pays : ".$Champ04."<br /><br />";
$titre = "<br/><h3>Détails de l'évènement</h3>Titre de l'évènement : ".$Champ05."<br />";
if ($Champ05=="") {
	$quand = "Date : ".$Champ06." ";
}
else {$quand="";}
if ($Champ06=="") {
	$lieu = "Lieu : ".$Champ07."<br />";
}
else {$lieu="";}
$organisateur = "Cette évènement est organisé par : ".$Champ08."<br />";
$description = "Voici le descriptif de l'évènement : <br /><br /> ".$Champ09."<br /><br />";
if ($Champ10=="") {
	$deadline = "La deadline de la publication est : ".$Champ10."<br />";
}
else {$deadline="";}
$contact = "Pous plus d'informations, joindre : <br/>".$Champ11."<br/>";
$siteweb = "Site web : ".$Champ12."<br/><br/><br/> Bonne insertion dans la newsletter !<br/><br/>"."\n";

// Annonce de quelques coordoonnées er que l'on va insérer plusieurs parties dans ce mail
$headers ='From: "Newsletter formulaire"<communication@uha.fr>'."\n";
$headers .="Reply-To: ".$Champ03.""."\n";
$headers .='MIME-Version: 1.0'."\n";
$headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"'."\n"."\n";

//--------------------------------------------------------------------------------------------------------------
//												PARTIE FICHIER
//--------------------------------------------------------------------------------------------------------------


// Validation si le fichier est uploadé
if ($_FILES['monfichier']['error'] > 0) {
	$erreur = "Erreur lors du transfert ! <br/>";
	echo $erreur;
	// Validation si le fichier a uneb onne taille ( obsolète )
	if ($_FILES['icone']['size'] > $maxsize) {
		$erreur1 = "La taille du fichier est trop gros.<br/><br/>";
		echo $erreur1;
	}
	$allisok = 0;
}


// Validation de l'extension du fichier
$extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png', 'pdf', 'doc', 'xls', 'txt' );
// On met en minuscule l'extension du fichier ou on retire le "."
$extension_upload = strtolower(  substr(  strrchr($_FILES['monfichier']['name'], '.')  ,1)  );
if ( !in_array($extension_upload,$extensions_valides) ) {
	$allisok = 0;
}


// Préparation des coordonnées et du titre de l'envoi
$mailto = "thomas.lambert@uha.fr";
$sujet ="Demande pour la newsletter : ".$Champ05;

// fichier temporaire uploadé déplacé dans un menu
if(isset($_FILES['monfichier']))
{ 
     $dossier = 'upload/';
	 $fichier = md5(uniqid(rand(), true));
	 $fichier .= '--';
	 $fname = $_FILES['monfichier']['name'];
     $fichier .= $fname;
     if(move_uploaded_file($_FILES['monfichier']['tmp_name'], $dossier.$fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
     {
          echo 'Upload effectué avec succès !';
     }
     else //Sinon (la fonction renvoie FALSE).
     {
          echo 'Echec de l\'upload !';
     }
}

// On va gérer le content-type en fonction du fichier envoyé
if ($extension_upload=="pdf"){
	$ctype = "application/pdf" ;	
}
else {
	if ($extension_upload=="jpeg"||$extension_upload=="jpg"){
		$ctype = "image/jpeg" ;	
	}
	else {
		if ($extension_upload=="gif"){
			$ctype = "image/gif" ;	
		}
		else {
			if ($extension_upload=="png"){
				$ctype = "image/png" ;	
			}
			else {
				if ($extension_upload=="doc"){
					$ctype = "application/msword" ;	
				}
				else {
					if ($extension_upload=="xls"){
						$ctype = "application/vnd.ms-excel" ;	
					}
					else {
						if ($extension_upload=="txt"){
							$ctype = "application/text/plain" ;	
						}
						else {
							$ctype = "application/text/plain" ;
						}
					}
				}	
			}	
		}	
	}
}

// On le prépare à l'envoi !
$message = "\n\n";
$message .= '--'.$frontiere."\n"; ; 
$message .= 'Content-Type: $ctype; name="'.$fichier.'"'."\n";
$message .= 'Content-Transfer-Encoding: base64'."\n";
$message .= 'Content-Disposition:attachement; filename="'.$fname.'"'."\n\n"; 
$attachment = chunk_split(base64_encode(file_get_contents(''.$dossier.$fichier.''))); 
$message .= $attachment."\n\n";
$message .= '--'.$frontiere.'--'."\n";

//--------------------------------------------------------------------------------------------------------------
//											PARTIE PREPARATION A L'ENVOI
//--------------------------------------------------------------------------------------------------------------

$contenu = "Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed.\n";
$contenu .= '--'.$frontiere."\n"; 
$contenu .= 'Content-Type: text/html; charset="utf-8"'."\n";
$contenu .= 'Content-Transfer-Encoding: 8bit'."\n\n"; 
$contenu .= "<html><head><title>Validation de la demande</title></head><body>".$nom.$service.$mail.$pays.$titre.$quand.$lieu.$organisateur.$description.$deadline.$contact.$siteweb."</body></html>".$message;

// Envoie du mail
if ($allisok == 1) {
	mail($mailto, $sujet, $contenu, $headers);
	echo "<br />Message test envoyé";
}
else {
	echo "<br />Le mail n'a pas pu être envoyé";
}
// Suppression du fichier :
unlink($dossier.$fichier);
?>
<body></body></html>

Modifié par Woodeath (05 Apr 2013 - 11:28)
Salut,

Tu peux amplement optimiser ce bout :

// On va gérer le content-type en fonction du fichier envoyé
if ($extension_upload=="pdf"){
	$ctype = "application/pdf" ;	
}
else {
	if ($extension_upload=="jpeg"||$extension_upload=="jpg"){
		$ctype = "image/jpeg" ;	
	}
	else {
		if ($extension_upload=="gif"){
			$ctype = "image/gif" ;	
		}
		else {
			if ($extension_upload=="png"){
				$ctype = "image/png" ;	
			}
			else {
				if ($extension_upload=="doc"){
					$ctype = "application/msword" ;	
				}
				else {
					if ($extension_upload=="xls"){
						$ctype = "application/vnd.ms-excel" ;	
					}
					else {
						if ($extension_upload=="txt"){
							$ctype = "application/text/plain" ;	
						}
						else {
							$ctype = "application/text/plain" ;
						}
					}
				}	
			}	
		}	
	}
}


par :

$ctype_assoc = array(
    "pdf" => "application/pdf",
    "jpg" => "image/jpeg",
    "jpeg" => "image/jpeg",
    "doc" => "application/msword",
    etc...
);

$ctype = $ctype_assoc[$extension_upload];


Et d'autres optimisations comme pour tes validations de champs, tu peux passer par une boucle vu que tu connais le nombre de champs et ensuite rendre dynamique une variable pour que tu puisses l'adapter (voir du coter de "$$var", google t'en dira plus Smiley cligne )