Envoi d'un mail avec pièces jointes en PHP

Sudiste
Invité n'ayant pas de compte PHPfrance

03 déc. 2018, 15:32

Bonjour tout le monde,

Je suis un débutant en PHP et j'ai décidé de m'y lancer pour aider ma sœur qui se construit une entreprise et la programmation c'est pas son truc.

Du coup j'ai tenté de créer un formulaire qui récupère diverses informations à propos d'un utilisateur (nom, prénom, adresse, etc...).
Cependant lorsque je veux tester pour script, il ne fonctionne pas, il s'inscrit comme un vieux <p> dans ma feuille HTML, du coup je vous contacte pour savoir si vous pourriez me venir en aide, voici le code ci-joint pour faciliter la compréhension.

Merci d'avance et à très vite.

Je tiens à préciser que je me suis inspiré de ce TUTORIEL (le lien envoit vers un autre site, ceci n'est pas de la pub, ce sont juste mes sources).


<?php
	function ajax() {
		
		error_reporting(E_ALL);
		ini_set('display_errors', 1);
		
		$x = htmlentities($_POST['demande']);
		if($x = "rens")
			$demande = "Renseignement";
		if($x = "devis")
			$demande = "Devis pour une prestation";
		if($x = "sign")
			$demande = "Signalement";
		if($x = "Autre")
			$demande = $x;
		
		$x = htmlentities($_POST['prestation']);
		if ($x = "trad")
			$prestation = "Traduction anglais-français";
		if($x = "correc")
			$prestation = "Relecture et correction";
		if($x = "redac")
			$prestation = "Rédaction de courriers et lettres de motivation";
		if($x = "cours")
			$prestation = "Cours particuliers d'anglais";
		if($x = "Autre")
			$prestation = $x;
		
		$x = htmlentities($_POST['paiement']);
		if ($x = "vir")
			$paiement = "Virement bancaire";
		if($x = "cheq")
			$paiement = "Chèque bancaire";
		if($x = "paypal")
			$paiement = "PayPal";
		if($x = "cesu")
			$paiement = "CESU";
		
		$sender = htmlentities($_POST['email']);
		$numero = htmlentities($_POST['numero']);
		$adresse = htmlentities($_POST['adresse']);
		$ville = htmlentities($_POST['ville']);
		$pays = htmlentities($_POST['pays']);
		$message = htmlentities($_POST['message']);
		
		//Verifie si le fournisseur prend en charge les r
		if(preg_match("#@(hotmail|live|msn).[a-z]{2,4}$#", $sender)) {
			$pl = "\n";
		} else {
			$pl = "\r\n";
		}
		
		$to = "logophile.translation@gmail.com";
		$objet = $nom . " " . $prenom . " - [" $demande . "][" . $prestation . "]";
		$boundary = md5(rand());
		
		$headers = "From: \"" . $nom . " " . $prenom . "\" <" . $sender . ">" . $pl;
		$headers.= "Reply-to: \"" . $nom . " " . $prenom . "\" <" . $sender . ">" . $pl;
		$headers.= "MIME-Version: 1.0" . $pl;
		$headers.= "Content-Type: multipart/mixed; boundary=" . $boundary . " " . $pl;
		
		$xmess = "Identite du demandeur: " . $nom . " " . $prenom . $pl;
		$xmess.= "Numero de telephone: " . $numero . $pl;
		$xmess.= "Adresse: " . $adresse . ", " . $ville . ", " . $pays . $pl;
		$xmess.= "Contenu de la demande: " . clean_string($message) . $pl;
		
		$email_message = "--" . $boundary . $pl;
		$email_message.= "Content-Type: text/plain; charset=\"utf-8\"" . $pl;
		$email_message.= "Content-Transfer-Encoding: 8bit" . $pl;
		$email_message.= $pl . $xmess . $pl;
		
		for($i = 1; $i < 3; $i++) {
			$fichier = "att".$i;
			
			if(isset($_FILES[$fichier]) &&  $_FILES[$fichier]['name'] != ""){ //Vérifie sur formulaire envoyé et que le fichier existe
				$nom_fichier = $_FILES[$fichier]['name'];
				$source = $_FILES[$fichier]['tmp_name'];
				$type_fichier = $_FILES[$fichier]['type'];
				$taille_fichier = $_FILES[$fichier]['size'];
							
				if($nom_fichier != ".htaccess"){ //Vérifie que ce n'est pas un .htaccess
					 if($type_fichier == "image/jpeg" 
						|| $type_fichier == "image/pjpeg" 
						|| $type_fichier == "application/pdf"){ //Soit un jpeg soit un pdf
						 
						if ($taille_fichier <= 2097152) { //Taille supérieure à Mo (en octets)
							$tabRemplacement = array("é"=>"e", "è"=>"e", "à"=>"a"); //Remplacement des caractères spéciaux
							
							$handle = fopen($source, 'r'); //Ouverture du fichier
							$content = fread($handle, $taille_fichier); //Lecture du fichier
							$encoded_content = chunk_split(base64_encode($content)); //Encodage
							$f = fclose($handle); //Fermeture du fichier
										
							$email_message .= $pl . "--" . $boundary . $pl; //Deuxième séparateur d'ouverture
							$email_message .= 'Content-type:'.$type_fichier.';name="'.$nom_fichier.'"'."n"; //Type de contenu (application/pdf ou image/jpeg)
							$email_message .= 'Content-Disposition: attachment; filename="'.$nom_fichier.'"'."n"; //Précision de pièce jointe
							$email_message .= 'Content-transfer-encoding:base64'."n"; //Encodage
							$email_message .= "n"; //Ligne blanche. IMPORTANT !
							$email_message .= $encoded_content."n"; //Pièce jointe
		 
						}else{
							//Message d'erreur
							$email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe mais celle ci était superieure à 2Mo.". $pl;
						}
					}else{
						//Message d'erreur
						$email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe mais elle n'était pas au bon format.". $pl;
					}
				}else{
					//Message d'erreur
					$email_message .= $pl ."L'utilisateur a tenté de vous envoyer une pièce jointe .htaccess.". $pl;
				}
			}
			$email_message .= $pl . "--" . $boundary . "--" . $pl;
		}
		
		if(mail($to, $objet, $email_message, $headers)==true){
			header('Location: contact.html');
		}
	}
	
	function clean_string($string) {
		$bad = array("content-type","bcc:","to:","cc:","href");
		return str_replace($bad,"",$string);
	}
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

03 déc. 2018, 23:40

il s'inscrit comme un vieux <p> dans ma feuille HTML
C'est à dire ?
Tu vois le code PHP dans ta page HTML ?

Si c'est le cas, c'est que tu n'as pas de serveur PHP pour exécuter ta page (ou que ton serveur PHP ne fonctionne pas)
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

04 déc. 2018, 16:45

En effet je n'ai pas de serveur PHP au moment de mon test. J'ai du coup essayé en mettant ma page HTML et mon fichier PHP sur un serveur dédié que je paye 1€, mais comment le configurer pour que le PHP puisse s'y lire ?

J'ai déjà chercher sur internet comment faire, mais les exemples sont montrés avec des Machines Virtuelles ou via commande UNIX, cependant je suis sur Windows, et je dispose seulement d'un serveur dédié de 2Go.

Pouvez-vous m'indiquer la marche à suivre? Ou tout simplement m'envoyer vers un tutoriel adapté à ma requête?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

04 déc. 2018, 21:12

Pour que ton site fonctionne il faut qu'il soit hébergé sur un serveur web qui sache exécuter du PHP.
Sur ton ordi Windows, tu peux installer un serveur web + un serveur PHP mais si tu n'as pas les compétences d'administration système indispensables pour éviter que ton ordi ne se fasse pirater, je te conseille trèèèèèèèèèèèèèèèèès fortement de prendre un hébergement chez un vrai hébergeur.

Par exemple chez OVH, le premier prix est à 1.79€ par mois et c'est honnètement beaucoup plus simple, rapide et sécurisé de partir sur ce type de service clé en main plutôt que de passer des heures à tout essayer de configurer.
J'ai cité OVH mais il en existe plein d'autres et le prix de départ est en général autour de 2€/mois
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

05 déc. 2018, 10:44

Merci de vos réponses @rthur.

J'ai déjà payé un abonnement à un serveur dédié, je l'ai commandé sur le site de Kimsufi qui est plus ou moins au même prix et il prend en compte PHP 5.5, 5.6 et 7, pourtant lorsque je teste mon script sur le serveur (en le déclenchant via ma page HTML), une page s'affiche disant qu'une erreur est survenue ou que la page n'existe pas.

Je suis actuellement au travail donc je ne peux pas fournir de screenshot, mais je le ferais ce soir car je ne me rappelle plus exactement ce qu'affiche la page d'erreur, alors un screen sera plus précis que moi. :roll:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

05 déc. 2018, 11:01

Ta page a bien l'extension ".php" et pas ".html" ?

Si cela te dis que la page n'existe pas, vérifie que l'url dans la barre d'adresse correspond bien au nom de tes dossiers et répertoires sur ton FTP
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

05 déc. 2018, 11:10

Oui oui tout est bon, mon fichier a bien l'extension .php et dans le html le form renvoit vers "contactform.php" qui se trouve dans le même dossier que le fichier "contact.html", preuve à l'appui :

http://image.noelshack.com/fichiers/201 ... 3-help.png

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

05 déc. 2018, 12:41

Sauf que là ta capture ce sont les fichiers sur ton PC, sur ton serveur, ça donne quoi via FTP ? quelle est l'url de contactform.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

06 déc. 2018, 11:20

L'URL de contactform.php dans FTP est : "/www/contactform.php"

Sudiste
Invité n'ayant pas de compte PHPfrance

06 déc. 2018, 12:16

Désolé du double post, mais j'ai du nouveau.

Sur mon serveur ça n'affiche plus qu'il y a un problème mais juste une page blanche et rien ne se passe, je ne reçois pas d'email. J'ai ajouté des echo un peu partout pour voir si c'est le code qui se lisait ou pas, mais aucun de mes echo ne s'affiche, la page reste toute blanche.

En gros je suis sur contact.html, je remplis le formulaire que je 'submit', ça m'envoit sur contactform.php mais page blanche. Que faire?

Mammouth du PHP | 995 Messages

06 déc. 2018, 14:44


Sudiste
Invité n'ayant pas de compte PHPfrance

10 déc. 2018, 09:16

J'ai déjà les lignes a propos des erreurs dans mon code et pourtant rien ne s'affiche, ni même dans la console alors je suis perdu là.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

10 déc. 2018, 19:34

J'ai déjà les lignes a propos des erreurs dans mon code et pourtant rien ne s'affiche, ni même dans la console alors je suis perdu là.
Et dans les logs de ton serveur ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Sudiste
Invité n'ayant pas de compte PHPfrance

11 déc. 2018, 11:30

Pendant que mes tests étaient en cours, j'ai déplacer mon site de test dans un dossier appelé "test" qui est disponible sur le domaine pour faire des essais à tout moment.

Du coup voici ce que disent les logs lorsque j'envoie mon Formulaire.
[11/Dec/2018:10:24:17 +0100] "POST /test/contactform.php HTTP/1.1" 500 - "http://xxxx.fr/test/contact.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"

[11/Dec/2018:10:24:17 +0100] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7783 Messages

11 déc. 2018, 18:33

Ça ce sont les logs d'accès, ça permet de voir que l'appel à ton fichier contactform.php provoque une erreur 500
Il faut que tu regardes dans le fichier de log d'erreur pour en savoir +
Quand tout le reste a échoué, lisez le mode d'emploi...