8797 sujets

Développement web côté serveur, CMS

Bonjour,


Il fonctionne à 90% , c'est déjà bien , il me manque qu'un contrôle pour éviter que le mail ne parte pas et qu'un message affiche la possibilité de recommencer l'envoi.
Voici la partie du code qui doit traiter l'envoi.

// Module principal
//
$subject=StripSlashes($_POST['subject']);
$msg=StripSlashes($_POST['msg']);
$msg="Message depuis votre site web:$msg";
$email=$_POST['email'];
$email1="";
$priority=$_POST['priority'];
$org="";
$organization="";
$NomFichier=$_FILES['NomFichier']['tmp_name'];
$maxsize=1048576; // 1 Mo
$NomFichier_name=$_FILES['NomFichier']['name'];
$m= new Mail; // create the mail
        $m->From( "$email" );
        $m->To( "$dest");     
        $m->Subject( "$subject" );
        $m->Body( $msg);        // set the body
if ($email1!="") {
        $m->Cc( "$email1");
	}
        $m->Priority($priority) ; 
if ("$NomFichier_name"!="") {
	if ($_FILES['NomFichier']['size']>$maxsize) {
		$err.="Le fichier dépasse la limite autorisée (1 Mo) !\n";
	}else{
		copy("$NomFichier","../upload/$NomFichier_name");
		$m->Attach( "../upload/$NomFichier_name", "application/octet-stream" );
	}
}
if($err==""){$m->Send();echo "$reponse";
	// if ("$NomFichier_name"!="") {
	// Unlink("../upload/$NomFichier_name");   }
}else{
	echo $err;
	echo "<br/><br/><a style='cursor:pointer' onClick='history.back()'>Cliquez ici pour corriger</a>";
}
?>

Merci de votre aide Smiley biggrin
Modifié par JPierre74 (03 May 2009 - 14:48)
Bon je reprends du début...

Hello JPierre74 et bienvenue parmi nous Smiley smile ,

En tant que modérateur, je me dois de te faire remarquer que tu n'as malheureusement pas respecté l'une des Règles de base du forum qui est d'afficher les codes et exemples proprement à l'aide des boutons [ code]... ici ton code HTML, CSS, PHP, etc.[ /code] (sans espace).

upload/1-code.gif

Je te remercie par avance de bien vouloir éditer ton message afin de le rendre conforme à cette règle. Smiley cligne

D'ailleurs, je rappelle que l'Aide (dont le lien est fourni lors de l'inscription) contient des pistes de recherche, des indications sur les règles de vie de la communauté, etc.
Modifié par Heyoan (03 May 2009 - 14:39)
Merci pour la mise en page.

JPierre74 a écrit :
il me manque qu'un contrôle pour éviter que le mail ne parte pas et qu'un message affiche la possibilité de recommencer l'envoi.
Euh... je ne comprends pas bien le rapport avec le titre de ton sujet... je vais donc faire comme si tu avais posé 2 questions Smiley smile :

1) Est-il possible de vérifier le poids avant l'upload ?

Pas à ma connaissance car il faudrait le faire côté client et donc avec un langage client (typiquement JavaScript). Or pour des raisons de sécurité JavaScript ne peut pas (par défaut) accéder au système de fichiers d'un ordinateur. Il faut donc uploader d'abord le fichier sur le serveur et vérifier le poids en PHP.


2) Si tout est OK (poids, extension, etc.) mais que seul l'envoi du mail ne fonctionne pas, est-il possible de réessayer sans avoir à soumettre une seconde fois le formulaire ?

Oui : il faut pour cela sauvegarder la variable superglobale $_FILES dans une variable de session. Voici un petit exemple dans lequel je simule une erreur lors de l'envoi du mail :
<?php
session_start();
// S'agit-il d'un nouvel essai ?
$nb_essais = 3; // Permet de tester : combien d'essais avant que ça marche
if(isset($_GET['retry'])) {
	$_SESSION['essai'] += 1; // Permet de réussir la 3ème fois
	$_FILES = $_SESSION['files']; // alimentation de $_FILES avec $_SESSION['files']
} else {
	$_SESSION['essai'] = 0;
}

$erreur = false;
if (!empty($_FILES)) { // Si le formulaire a été soumis ou si on réessaye
	if($_SESSION['essai'] < $nb_essais) {	
		echo '<p>Essai	: '.$_SESSION['essai']."</p>\n";
		echo '<p>Nom	: '.$_FILES['fichier']['name']."</p>\n";
		echo '<p>Type	: '.$_FILES['fichier']['type']."</p>\n";
		echo '<p>Temp	: '.$_FILES['fichier']['tmp_name']."</p>\n";
		echo '<p>Erreur	: '.$_FILES['fichier']['error']."</p>\n";
		echo '<p>Poids	: '.$_FILES['fichier']['size']."</p>\n";
		echo '<p>Is_uploaded	: '.is_uploaded_file($_FILES['fichier']['tmp_name'])."</p>\n";
	}
	
	// Traitement Erreur ou Poids > 1Mo ($erreur = 'une erreur')
	
	if(!$erreur) { // Si aucune erreur on envoie le mail avec la pièce jointe
		//if(@mail(...)) {
		if($_SESSION['essai'] == $nb_essais) { // Simulation de l'échec lors de l'envoi du mail
			// Suppression du fichier s'il existe déjà dans upload
			@unlink('upload/'.$_FILES['fichier']['name']);
			if(!move_uploaded_file($_FILES['fichier']['tmp_name'], 'upload/'.$_FILES['fichier']['name'])) {
				rename($_FILES['fichier']['tmp_name'], 'upload/'.$_FILES['fichier']['name']);
			}
			header("Location: page_confirmation.php"); // Si envoi OK -> redirection
		} else { // Sinon
			if(is_uploaded_file($_FILES['fichier']['tmp_name'])) {
				// On renomme le fichier temporaire pour qu'il ne soit pas supprimé
				$new_tmp = dirname($_FILES['fichier']['tmp_name']).'/new_tmp_'.time();
				rename($_FILES['fichier']['tmp_name'], $new_tmp);
				$_FILES['fichier']['tmp_name'] = $new_tmp;
			}
			$_SESSION['files'] = $_FILES; // sauvegarde de $_FILES avec $_SESSION['files']
			echo '<p>Problème lors de l\'envoi du mail. <a href="?retry=O">Réessayer</a></p>';
		}
	} else { // Affichage de l'erreur
		echo '<p>Erreur : '.$erreur.' <a href="upload.php">Retour au formulaire</a>'."</p>\n";
	}
} else {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>test</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<p>
	<label for="fichier">Fichier :</label>
	<input type="file" name="fichier" />
</p>
<p>
	<input type="submit" value="Uploader" />
</p>
</form>
<?php } ?>
</body>
</html>

Modifié par Heyoan (13 May 2009 - 15:14)
Ok, je me suis peux être mal exprimé, excusez-moi,
J'ai en fait un formulaire qui permet de joindre un fichier pdf et de la joindre au message en utilisant la fonction mail (php)
voici l'exemple > http://jp-nas.dnsalias.com/captcha/index.php
Merci de me dire ce que vous en pensez.
Merci d'être patient car c'est un petit serveur perso pour mes tests. Smiley eek
JPierre74 a écrit :
Ok, je me suis peux être mal exprimé, excusez-moi,
J'ai en fait un formulaire qui permet de joindre un fichier pdf et de la joindre au message en utilisant la fonction mail (php)
Euh... oui... c'est bien comme ça que je l'avais compris. Smiley rolleyes

Quelle-est ta question exactement ?
Merci à toi de m'aider, as-tu essayé le formulaire ? si le fichier dépasse 1 mo et bien je souhaite un simple retour un echo : votre fichier dépasse le poids autorisé et hop un clic et on retourne sur le formulaire, mais j'ai un message erreur de serveur.
Je teste tout en java script dans le formulaire sauf le poids,
Car le principe et vous l'avez compris, je copie le fichier dans un dossier "upload" avec les droits qui vont bien, ensuite je l'attache et j'envoie le mail, et je pense que c'est au moment de l'attachement que le contôle doit se faire? si sup > 1mo message d'erreur; le code c'est celui du premier message. Je rajoute que le que dès que le mail est parti, on détruit le fichier uploader, pour ne pas envahir le serveur.
Voilà si vous souhaitez tous les fichiers je peux vous envoyer Smiley ravi
En faisant un test j'ai le message
a écrit :
Warning: copy() [function.copy]: open_basedir restriction in effect. File() is not within the allowed path(s)

Ce sujet en parle.
Le dossier upload a pour attribut 777, donc je ne comprends pas pourquoi il ne peux pas le copier ? si c'est que tu ceux me faire comprendre. Smiley rolleyes
JPierre74 a écrit :
si c'est que tu ceux me faire comprendre. Smiley rolleyes
Non : si c'était ça tu aurais un message parlant de permission. Relis le sujet que je t'ai donné en lien car la réponse parlait plutôt d'une erreur de chemin (même si d'après les autres réponses ça pourrait être autre chose).
D'accord, mais ce n'est pas une erreur de chemin, en fait comme le fichier est > à 1 mo il n'est pas copier, donc lors de l'attachement il ne le trouve pas donc erreur serveur et je souhaite afficher " Le fichier dépasse la limite autorisée (1 Mo) " .
Car quand le fichier < 1 mo , la copie dans le dossier upload( j'ai contrôler sa présence) se fait bien et l'envoi du fichier en piece jointe est bon, le mail est dans ma boîte.
Alors je ne comprends pas pourquoi il ne veut pas m'afficher le message d'erreur, comme indiqué dans le code.

if ("$NomFichier_name"!="") {
	if ($_FILES['NomFichier']['size']>$maxsize) {
		$err.="Le fichier dépasse la limite autorisée (1 Mo) !\n";
	}else{
		copy("$NomFichier","../upload/$NomFichier_name");
		$m->Attach( "../upload/$NomFichier_name", "application/octet-stream" );
	}
}
if($err==""){$m->Send();echo "$reponse";
......

Merci de votre aide Smiley rolleyes
Modifié par JPierre74 (04 May 2009 - 09:30)
JPierre74 a écrit :
D'accord, mais ce n'est pas une erreur de chemin
Ben si le script essaie de copier un fichier qui n'existe pas c'est bien une erreur de chemin. Smiley cligne

Est-ce que tu as mis un MAX_FILE_SIZE dans le formulaire ?

En tout cas le message d'erreur parle de la fonction copy...

Je pense qu'il suffirait de vérifier que $_FILES['NomFichier']['error'] soit bien égal à 0 (aucune erreur) avant de continuer. Tu pourrais d'ailleurs préciser l'erreur en te basant sur cet article.

Pour préciser : si tu as une erreur lors de l'upload tu auras size=0 et du coup ton test > 1Mo n'est pas vérifié.
Modifié par Heyoan (04 May 2009 - 09:52)
Dans le formuliaire j'ai :

<input type="hidden" name="MAX_FILE_SIZE" value="1024000">

Je vais creuser ton idée
Merci
JPierre74 a écrit :
Dans le formuliaire j'ai :

<input type="hidden" name="MAX_FILE_SIZE" value="1024000">
Du coup cela confirme que tu as une erreur (2) lors de l'upload.