8768 sujets

Développement web côté serveur, CMS

Hello!

toujours dans mon projet développé tout à la main,
je veux créer un formulaire de contact.
Je dois vous avouer que je n'avais pas joué à ça depuis ma 1e année de formation, en l'an de grâce ouhhhh, Netscape concurrençait encore IE6, bref...

Pour le formulaire html, pas de soucis,
pour la validation des champs avec JQuery.validate, je m'en suis sortie
pour l'envoi des données en format texte à la bonne adresse mail, check!

...sauf l'envoi de fichier joint Smiley ohwell
là, je bloque, je ne me souviens plus du tout comment on fait, et le peu de ressources trouvées sont extrêmement complexes, avec moultes vérifications, codes d'erreur, et sans explication simple.

Alors voilà, je me pose en débutante premier niveau sur ce coup là, et je demande humblement votre aide.

Avez vous un bout de tuto simple pour m'orienter sur une bonne piste,
ou un conseil de vieux de la vieille bien veillant (répète ça 5 fois sans te tromper!)

j'ai autant besoin de savoir si je dois mettre quelque chose de spécial dans l'entête du mail (multipart-quelque-chose?), si je dois créer un répertoire pour héberger temporairement le fichier sur le serveur (et quel serait son chemin relatif/absolu par rapport à mon fichier php qui envoie le mail?), quels sont les bouts de fichier important (son poids, son nom, ect...) à utiliser, et comment inclure le fichier dans le contenu de l'email envoyé...

oui, je sais, là je recommence à zéro, comme au CP en quelque sorte Smiley cligne

merci de votre soutien!
Modifié par Claire39 (03 Oct 2014 - 13:03)
A part les retraités personne ne perd son temps à recoder ce genre de fonctionnalités à la main. Tu as des bibliothèques pour la gestion et l'envoi d'emails qui font ça très bien, PHPMailer (léger) ou SwiftMailer (plus lourd) ou moult services d'envoi d'emails.

Si c'est pour apprendre il te suffit de regarder le code source de ces bibliothèques pour voir comment c'est fait.
"A part les retraités"
pan! dans les dents!

merci Garcia13 pour le nom des deux bibliothèques php, il est vrai qu'à force de ne bosser que sur cms, on en oublie la simplicité ...

je me penche sur PHPMailer qui feras sans aucun doute tout ce que je lui demande Smiley smile
Bonjour,

Tu peux aussi coder une classe ou une fonction qui gère cette fonctionnalité d'upload de fichiers pour ainsi l'adapter à ton besoin et la réutiliser à volonté pour d'autres projets...

On gagne certainement du temps à se reposer sur des bibliothèques qui nous facilite les choses, mais parfois c'est tout aussi bien de faire les choses par soi-même afin de comprendre d'une part comment faire, puis pour éviter de transformer son programme en usine à gaz à librairies...

Ceci dit, l'utilisation de une ou deux librairies ne devrait pas en soi polluer ton site, il faut juste faire attention...
Modifié par ohweb (26 Sep 2014 - 09:54)
Modérateur
Salut,

C'est très bien de vouloir coder une chose soi même mais c'est seulement quand on a le temps. Si une librairie ne répond pas au besoin du développeur, là encore il est bon de le coder soi même.

En ce qui concerne phpmailer, c'est pas mal et c'est simple.
Hello, merci de vos réponses à tous Smiley smile

comme je l'ai dit plus haut, je tente d'utiliser PHPMAILER, après tout, pourquoi faire compliqué quand on peut faire simple?

moui... sauf que j'arrive à faire aussi bien que ce que je faisais jusqu'ici, soit récupérer les données "texte" d'un formulaire de contact, mais toujours pas à envoyer de pièce jointe, pas même une pièce jointe prédéfinie du genre logo du site Smiley ohwell

mon php di ceci :


<?php
//adresse de réception et nom de la personne
$to = "je@moimeme.com";
$toname = "Claire";

//email et nom de l'expéditeur
$from = $_REQUEST['email'];
$name = $_REQUEST['name'];

//sujet
$subject = "Message du site";

//un tableau des données récupérées du formulaire
$fields = array();
$fields{"name"} = "\nNom";
$fields{"email"} = "\nEmail";
$fields{"tel"} = "\nTel";
$fields{"ville"} = "\nVille";
$fields{"departement"} = "\nDépartement";
$fields{"message"} = "\nMessage";

// et la création du corps du message
$body = "Ce message vient de vous être envoyé :\n\n"; 
foreach($fields as $a => $b){ $body .= sprintf("%20s: %s",$b,$_REQUEST[$a]); }  

//j'appelle PHPMailer
require('class.phpmailer.php');
   
// On créé une nouvelle instance de la classe
   $mail = new PHPMailer();
   
// De qui vient le message, e-mail puis nom
   $mail->From = $from;
   $mail->FromName = $name;
   
// Définition du sujet/objet
   $mail->Subject = $subject; 
   
// au passage, je veux de l'UFT-8
   $mail->CharSet = 'UTF-8';
   
// On définit le corps du message, pas besoin que ce soit du html
   $mail->Body = $body;
   
// On met le logo du site en pièce jointe
   $mail->AddAttachment('http://www.monsite.com/img/image.jpg');

//j'ai également testé ça mais c'est pas mieux : 
// $mail->AddAttachment('./img/image.jpg');

   // Il reste encore à ajouter au moins un destinataire
   $mail->AddAddress($to, $toname);
 
   // Pour finir, on envoi l'e-mail
   $mail->send();   
?>


et je reçois un chouette email avec tout dedans, tout bien, mais sans pièce jointe. Smiley ohwell

je ne comprends pas bien parce que ça a l'air d'être le b-a-ba de PHPMailer, ça, tout le monde reproduit ce type de code sur son tuto, en français comme en anglais, et je ne vois pas où ça merdouille.

auriez vous une petite piste pour m'aider? merci!
j'avance, je ne me décourage pas!

mon problème de fichier joint commence à se résoudre, ouisqu'aujourd'hui, je peux envoyer avec les différentes données du formulaire de contact (sauf la pièce jointe) une image définie dans le traitement PHPMailer, par exemple le logo du site.

je sais, cela ne sert pas à grand chose d'envoyer au webmaster le logo de son propre site quand quelqu'un utilise le formulaire de contact, mais jusqu'ici, je n'y arraivais pas! c'est donc une première victoire de canard!

au passage, mon problème hier venait du chemin du fichier à envoyer :

domaine/dossier/fichier -> ne passe pas
./dossier/fichier -> ne passe pas

mais par contre :

../dossier/fichier -> ça passe Smiley smile

bon, reste à obtenir une pièce jointe envoyée grâce au formulaire plutôt que mon bête logo...

still testing!
Ce coup ci c'est la bonne,
après ma grande victoire hier, j'ai réussi ce que je voulais vraiment faire,
à savoir : permettre l'envoi de pièces jointes avec un formulaire de contact.

je met ici le script commenté, pour tous ceux que ça pourra aider à l'avenir :


<?php
// destinataire du message : son email et son nom
$to = "claire39@moi-meme.fr";
$toname = "Claire39";

// expéditeur du message : son email et son nom
$from = $_POST['email'];
$name = $_POST['name'];

// sujet du message
$subject = "Message du site";

// associer un label à chaque donnée récupérée du formulaire dans un tableau 
$fields = array();
$fields{"name"} = "\nNom";
$fields{"email"} = "\nEmail";
$fields{"tel"} = "\nTel";
$fields{"ville"} = "\nVille";
$fields{"departement"} = "\nDépartement";
$fields{"message"} = "\nMessage";

// le répertoire où son envoyés les fichiers uploadés 
$chemin_destination = '../uploads/';

// et la commande pour les mettre dans le bon répertoire (je permet 3 fichiers dans mon formulaire)
move_uploaded_file($_FILES[fichier1]['tmp_name'], $chemin_destination.$_FILES[fichier1]['name']);
move_uploaded_file($_FILES[fichier2]['tmp_name'], $chemin_destination.$_FILES[fichier2]['name']);
move_uploaded_file($_FILES[fichier3]['tmp_name'], $chemin_destination.$_FILES[fichier3]['name']);

// création du corps du message, en texte brut dans mon cas
$body = "Message d'un internaute:\n\n"; 
foreach($fields as $a => $b){ $body .= sprintf("%20s: %s",$b,$_REQUEST[$a]); }  

//j'appelle la classe PHPMailer
   require('class.phpmailer.php');
   
// On créé une nouvelle instance de la classe
   $mail = new PHPMailer();
   
// De qui vient le message, e-mail puis nom
   $mail->From = $from;
   $mail->FromName = $name;
   
// Définition du sujet/objet
   $mail->Subject = $subject; 
   
// Le message est en UTF-8 
   $mail->CharSet = 'UTF-8';
   
// On définit le corps du message
   $mail->Body = $body;
   
// j'associe les pièces jointes 
   $mail->AddAttachment("../uploads/".$_FILES[fichier1]['name']);
   $mail->AddAttachment("../uploads/".$_FILES[fichier2]['name']);
   $mail->AddAttachment("../uploads/".$_FILES[fichier3]['name']);

// le destinataire
   $mail->AddAddress($to, $toname);
 
// Pour finir, j'envoi l'e-mail
   $mail->send();   
   
//il me reste à supprimer les fichiers uploadés pour ne pas encombrer inutilement le serveur
   unlink ("../uploads/".$_FILES[fichier1]['name']);
   unlink ("../uploads/".$_FILES[fichier2]['name']);
   unlink ("../uploads/".$_FILES[fichier3]['name']);
?>

//ouf, j'ai bien reçu le message et les pièces jointes ... ##happy##


c'est [RESOLU] pour aujourd'hui Smiley smile