Page 1 sur 1

Envoi mail PHP + pièce jointe

Posté : 25 janv. 2016, 20:25
par alexroja
Bonjour à tous,

Je suis entrain de créer un formulaire en php avec plusieurs champs.
Une page envoie.php qui vérifie si tous les champs sont bien remplie et qui envoie le mail. (pour l'instant ça fonctionne)

Maintenant je voudrai avoir la possibilité d'ajouter une pièce jointe à mon mail. J'ai donc rajouté un champ supplémentaire à mon formulaire et j'ai essayé de modifier la page envoie.php sans succès. Cela fait 3jours que mes essais non rien donnés... j'ai regardé plusieurs tutos mais je n'arrive pas à l'adapter à mon code et je commence à baisser les bras. Si vous pouviez m'aider je vous en remercie d'avance (je ne suis pas super fort en php).

Voici mes pages :

formulaire.php
<label class="field prepend-icon file">
         <span class="button btn-black"> Choisir une photo </span>
         <input type="file" class="gui-file" name="fichier" id="fichier"
         onChange="document.getElementById('fichiertelecharger').value = this.value;">
         <input type="text" class="gui-input" id="fichiertelecharger" placeholder="Télécharger les photos de votre objet" readonly>
         <span class="field-icon"><i class="fa fa-upload"></i></span><br></label>
envoie.php
<?php




	define("WEBMASTER_EMAIL", '[email protected]');
	
	error_reporting (E_ALL ^ E_NOTICE);



	function ValidateEmail($emailaddress)
	{
		$regex = '/([a-z0-9_.-]+)'. 
		'@'. # at
		'([a-z0-9.-]+){2,255}'. 
		'.'. # period
		'([a-z]+){2,10}/i'; 
		
		if($emailaddress == '') 
			return false;
		else
			$eregi = preg_replace($regex, '', $emailaddress);
		return empty($eregi) ? true : false;
	}



	$post = (!empty($_POST)) ? true : false;
	
	if($post)
	{
	$nom =  strip_tags(trim($_POST["nom"]));	
	$nom = utf8_decode($nom);
	$prenom =  strip_tags(trim($_POST["prenom"]));	
	$prenom = utf8_decode($prenom);
	$emailaddress = strip_tags(trim($_POST["emailaddress"]));
	$emailaddress = strip_tags(trim($_POST["emailaddress"]));
	$telephone = strip_tags(trim($_POST["telephone"]));
	$typeobjet = strip_tags(trim($_POST["typeobjet"]));
	$description = strip_tags(trim($_POST["description"]));
	$description = utf8_decode($description);
        $captcha = strip_tags(trim($_POST["captcha"]));
	
	$fichier = uniqid();
	$fichier_telecharger = $fichier.$_FILES['fichier']['name'];
	$fichier_telecharger = fread($fichier, filesize("$fichier"));
	$fichier_telecharger = chunk_split(base64_encode($fichier_telecharger)); 
	  

	$error = array();
	 //valider nom
	if(isset($_POST["nom"])){
			if (!$nom) {
				$error[] = "Entrer votre nom";
			} elseif(strlen($nom) < 2)  {
				$error[] = "Entrer votre nom";
			}
	}
	  
	  //valider prenom
	if(isset($_POST["prenom"])){
			if (!$prenom) {
				$error[] = "Entrer votre prenom";
			} elseif(strlen($prenom) < 2)  {
				$error[] = "Entrer votre prenom";
			}
	}
	
	//valider mail
	if(isset($_POST["emailaddress"])){
		if (!$emailaddress) {
			$error[] = "Entrer votre email.";
		} else if (!validEmail($emailaddress)) {
			$error[] = "Entrer un email valide.";
		}
	}
		
	//valider le type d'objet
	if(isset($_POST["typeobjet"])){
			if (!$typeobjet) {
				$error[] = "Sélectionner le type de votre objet.";
			}
	}
	
	//valider le fichier telecharger
	if(isset($_FILES['fichier'])) {
		// taille maximum :: 2MB
		$maxsize    =  2097152; 
		// Fichier attacher
		if (empty($_FILES['fichier']['name'])) {
			$error[] = "Ajouter une photo.";
		}
		// Fichier trop lourd
		if ($_FILES['fichier']['size'] > $maxsize) {
			$error[] = "Le fichier est trop lourd. Il dépasse les 2MB.";
		}
		// Format fichier
		$valid_file_extensions = array(".jpg", ".jpeg", ".png");
		$file_extension = strrchr($_FILES["fichier"]["name"], ".");
		// Verifier le format du fichier
		if (!in_array($file_extension, $valid_file_extensions)) {
			$error[] = "Svp une image avec le format png ou jpg.";
		}		
	}	
	
	//Valider le message (description)
	if(isset($_POST["description"])){
		if (strlen($description) < 10) {
			if (!$description) {
				$error[] = "Veuillez faire une déscription de votre objet.";
			} else {
				$error[] = "Votre messsage doit faire plus de 10 caractères.";
			}
		}
	}
	
	// valider captcha 
	if(isset($_POST["captcha"])){
		if (!$captcha) {
			$error[] = "Entrer le code";
		} else if (($captcha) != $_SESSION['gfm_captcha']) {
			$error[] = "Le code est incorrect";
		}
	}
	
	
	if ($error) {
		$errortext = "";
		foreach ($error as $error) {
			$errortext .= '<li>'. $error . "</li>";
		}
		echo '<div class="alert notification alert-error">Erreur:<br><ul>'. $errortext .'</ul></div>';
	
	} else{		
		
		if ($_FILES['fichier']['error'] == 0) {
			move_uploaded_file($_FILES['fichier']['name'], '../telechargement/' .$fichier_telecharger);	
		
			include dirname(__FILE__).'/phpmailer/PHPMailerAutoload.php';
		
				
			$mail = new PHPMailer();
			$mail.= isSendmail();
			$mail.= ContentType = "text/html";
			$mail.= AddAttachment('../telechargement/'.$fichier_telecharger);	

	

		 
			    $mail  = mail(WEBMASTER_EMAIL, "Expertise : $typeobjet", $description,  
				"From: ".$nom." ".$prenom." =>  Num: ".$telephone." <".$emailaddress.">\r\n"
				."Reply-To: ".$emailaddress."\r\n"
				."X-Mailer: PHP/" . phpversion());
			
			if($mail)
				echo 'OK';
		} 
	  
	  
		else {
					echo '<div class="alert notification alert-error">Message non envoyé</div>';	
				}
		}
	}
?>

Re: Envoi mail PHP + pièce jointe

Posté : 25 janv. 2016, 20:52
par or 1
quelle est l'idée derrière cette ligne ?
$fichier_telecharger = fread($fichier, filesize("$fichier"));
qui ne peut pas fonctionner en l'état vu que $fichier est une chaine.

Re: Envoi mail PHP + pièce jointe

Posté : 26 janv. 2016, 16:01
par alexroja
C'étais lire le fichier.

J'ai apporté quelques modifications mais ça ne fonctionne toujours pas :/
<?php
 
define("WEBMASTER_EMAIL", '[email protected]');
error_reporting (E_ALL);
 
$error = array();
if(empty($_POST["nom"])) {
	$error[] = "Entrez votre nom";
}
 
if(empty($_POST["prenom"])) {
	$error[] = "Entrez votre prénom";
}
 
if(empty($_POST["typeobjet"])) {
	$error[] = "Sélectionner le type de votre objet.";
}
 
if(empty($_POST["emailaddress"]) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
	$error[] = "Entrez un email valide";
}
 
//Valider le message (description)
if(empty($_POST["description"]) || strlen(trim($_POST["description"])) < 10){
	$error[] = "La description doit faire plus de 10 caractères.";
}
 
// valider captcha 
if (empty($_POST["captcha"])){
		$error[] = "Entrer le code";
}
elseif ($_POST["captcha"] != $_SESSION['gfm_captcha']) {
		$error[] = "Le code est incorrect";
}
 
//valider le fichier telechargé
if(isset($_FILES['fichier']) && $_FILES['fichier']['error'] == 0) {
	// taille maximum :: 2MB
	$maxsize    =  2097152; 
	// Fichier attacher
	if (empty($_FILES['fichier']['name'])) {
		$error[] = "Ajoutez une photo.";
	}
	// Fichier trop lourd
	if ($_FILES['fichier']['size'] > $maxsize) {
		$error[] = "Le fichier est trop lourd. Il dépasse les 2MB.";
	}
	// Format fichier
	$valid_file_extensions = array(".jpg", ".jpeg", ".png");
	$info = new SplFileInfo($_FILES['fichier']['name']);
	if (!in_array($info->getExtension(), $valid_file_extensions)) {
		$error[] = "Svp une image avec le format png ou jpg.";
	}
}
else {
	$error[] = "Le fichier est manquant";
}
 
if ($error) {
	$errortext = "";
	foreach ($error as $error) {
		$errortext .= '<li>'. $error . "</li>";
	}
	echo '<div class="alert notification alert-error">Erreur:<br><ul>'. $errortext .'</ul></div>';
}
else {		
	include dirname(__FILE__).'/phpmailer/PHPMailerAutoload.php';
 
	$mail = new PHPMailer();
	$mail->SetFrom($emailadress, $nom . ' ' . $prenom);
	$mail->AddAddress(WEBMASTER_EMAIL);
	$mail->Subject = "Expertise : " . $_POST['typeobjet'];
	$mail->ContentType = "text/html";
	$mail->AddAttachment($_FILES['fichier']['tmp_name'], $_FILES['fichier']['name']);	
        $mail->SMTPDebug  = 1;
 
	if ($mail->Send()) {
		echo 'OK';
	}
	else {
			echo '<div class="alert notification alert-error">Message non envoyé</div>';	
	}
} 
?>

Re: Envoi mail PHP + pièce jointe

Posté : 26 janv. 2016, 17:30
par ynx
Salut,

Quel message d'erreur as tu avec ce nouveau code ?

PHPMailer permet également d'afficher le message d'erreur correspondant dans le cas où le mail n'est pas envoyé grâce à l'attribut ErrorInfo, un exemple est donné ici : https://github.com/PHPMailer/PHPMailer/ ... /mail.phps

On ne voit pas ta balise form mais celle-ci doit posséder l'attribut enctype="multipart/form-data" afin que php puisse récupérer le fichier uploadé.

Bonné journée

Re: Envoi mail PHP + pièce jointe

Posté : 27 janv. 2016, 14:39
par alexroja
Le problème c'est que le mail ne s'envoie pas et que je n'ai pas de message d'erreur...

Oui j'ai bien l'attribut enctype="multipart/form-data" dans ma balise form.

J'aime pas le PHP #-o :oops:

Re: Envoi mail PHP + pièce jointe

Posté : 27 janv. 2016, 14:51
par Spols
Divise ton problème en 2,

Essaye d'abords de sauvegarder un fichier envoyé par le formulaire
Puis envoyer par mail un fichier qui est sur ton serveur
Et seulement après fusionne les 2. Il y a des tutos pour chacune des 2 actions

Re: Envoi mail PHP + pièce jointe

Posté : 28 janv. 2016, 19:41
par alexroja
J'ai réussi à envoyer sur le serveur l'image du formulaire (dans le dossier telechargement)

Mais pour l'envoie du mail je n'y arrive toujours pas...

<?php 

if (!isset($_SESSION)) session_start(); 
	if(!$_POST) exit;
 
 include dirname(__FILE__).'/functions/emailValidation.php';

	$email_destinataire = "[email protected]";
	$nom = strip_tags(trim($_POST["nom"]));	
	$emailaddress = strip_tags(trim($_POST["emailaddress"]));
	$telephone = strip_tags(trim($_POST["telephone"]));
	$typeobjet = strip_tags(trim($_POST["typeobjet"]));
	$description = strip_tags(trim($_POST["description"]));
        $captcha = strip_tags(trim($_POST["captcha"]));
	$fichiertelecharger_1 = $_FILES['fichier']['name'];	
	



	$errors = array();
	if(empty($_POST["nom"])) {
	$error[] = "Entrez votre nom";
}
 
if(empty($_POST["prenom"])) {
	$errors[] = "Entrez votre prénom";
}
 
if(empty($_POST["typeobjet"])) {
	$errors[] = "Sélectionner le type de votre objet.";
}
 
if(empty($_POST["emailaddress"]) || !filter_var($emailaddress, FILTER_VALIDATE_EMAIL)) {
	$errors[] = "Entrez un email valide";
}
 
//Valider le message (description)
if(empty($_POST["description"]) || strlen(trim($_POST["description"])) < 10){
	$errors[] = "La description doit faire plus de 10 caractères.";
}
 
// valider captcha 
if (empty($_POST["captcha"])){
		$errors[] = "Entrer le code";
}
elseif ($_POST["captcha"] != $_SESSION['gfm_captcha']) {
		$errors[] = "Le code est incorrect";
}
 
//valider le fichier telechargé
if(isset($_FILES['fichier']) && $_FILES['fichier']['errors'] == 0) {
	// taille maximum :: 2MB
	$maxsize    =  2097152; 
	// Fichier attacher
	if (empty($_FILES['fichier']['name'])) {
		$errors[] = "Ajoutez une photo.";
	}
	// Fichier trop lourd
	if ($_FILES['fichier']['size'] > $maxsize) {
		$errors[] = "Le fichier est trop lourd. Il dépasse les 2MB.";
	}
	
}
else {
	$errors[] = "Le fichier est manquant";
}
	
	//In case there are errors, output them in a list
	if ($errors) {
		$errortext = "";
		foreach ($errors as $error) {
			$errortext .= '<li>'. $error . "</li>";
		}
		echo '<div class="alert notification alert-error">Erreurs suivantes:<br><ul>'. $errortext .'</ul></div>';
	
	} else{		
		
		if ($_FILES['fichier']['error'] == 0) {
			move_uploaded_file($_FILES['fichier']['tmp_name'], '../telechargement/' .$fichiertelecharger_1);	
		
			include dirname(__FILE__).'/phpmailer/PHPMailerAutoload.php';
			include dirname(__FILE__).'/templates/smartmessage.php';
				
			$mail = new PHPMailer();
			$mail->SetFrom($emailadress, $nom . ' ' . $prenom);
			$mail->CharSet = "UTF-8";
			$mail->Encoding = "base64";
			$mail->Timeout = 200;
			$mail->ContentType = "text/html";
			$mail->addAddress($email_destinataire);
			$mail->Subject = "Expertise : " . $_POST['typeobjet'];
			$mail->AddAttachment('../telechargement/'.$fichiertelecharger_1);	
			$mail->Body = $description;

			if($mail->Send()) {
			
			  	echo '<div class="alert notification alert-success">Message envoyé</div>'; 
			  				  
				} 
				else {
					echo '<div class="alert notification alert-error">Message non envoyé</div>';	
				}
		}
	}
?>