# envoyer un formulaire HTML sans logiciel de messagerie



## danny (16 Janvier 2006)

Bonjour

je souhaite creer un formulaire en html dans une page html, mais je souhaiterais qu'il soit envoye directement depuis le site, sans qu'il ne m'ouvre un logiciel de messagerie quand je clique sur envoi.
Tout d'abord est-ce possible? Sinon comment dois-je faire? (je n'ai pas trouve la reponse en faisant recherche sur le site de mac generation)
Ensuite, j'ai lu dans un post sur le sujet que les formulaires html etaient "depasses"... pourquoi?
Enfin, dans les proprietes de mon bouton, je lui donne le nom: "OK" mais a l'affichage, il y a toujours le nom "submit" qui apparait, c'est curieux... auriez-vous une explication svp?
merci d'avance


----------



## OlivierL (16 Janvier 2006)

<form action="mailto:moi@free.fr?subject=Le sujet;CC=moi2@gmail.com" method="post" enctype="text/plain">

        <i>Si vous souhaitez nous laisser un message...</i> <br>
        <textarea name="Commentaire" rows="5" cols="50" wrap="PHYSICAL"></textarea><br>
        <input value="Envoyer" type="submit">
<input value="Annuler" type="reset">

      </form>


----------



## danny (16 Janvier 2006)

merci olivier pour ta reponse concernant le nom des boutons, en fait il faut changer "value" directement dans le code, car l'inspecteur de proprietes de dreamweaver ne fonctionne pas (chez moi en tout cas). Par contre, est ce que ta 1ere ligne





> <form action="mailto:moi@free.fr?subject=Le sujet;CC=moi2@gmail.com" method="post" enctype="text/plain">


 me permet de resoudre le probleme de la messasgerie? car il me semble que le mailto fait justement appel a un programme de mail non?


----------



## PA5CAL (16 Janvier 2006)

... Oui, mais... Non. Il était précisé "sans qu'il ne m'ouvre un logiciel de messagerie quand je clique sur envoi".

Il est nécessaire de passer par un système de messagerie à un moment ou à un autre.

Par exemple, Free permet d'héberger et de faire tourner des scripts PHP qui peuvent envoyer directement des e-mails quand on les appelle.

Le script PHP forme l'entête et le corps du message à partir des paramètres d'appels remplis par l'utilisateur dans une <FORM> (comme ci-dessus, mais avec l'URL du script à la place de "mailto:..."), puis il appelle la fonction "*mail(*adresse*,* sujet*,* message*,* entête*);*" fournie par Free.

J'en déjà fait un, et ça marche bien. Ça me permet même d'envoyer des pièces jointes en upload. J'avais trouvé toutes les informations nécessaires sur le site de Free.

Je pense qu'il est possible de faire pareil sur n'importe quel serveur Web où le PHP et la fonction "mail()" sont activés.


----------



## danny (16 Janvier 2006)

PA5CAL a dit:
			
		

> ... Oui, mais... Non. Il était précisé "sans qu'il ne m'ouvre un logiciel de messagerie quand je clique sur envoi".
> 
> Il est nécessaire de passer par un système de messagerie à un moment ou à un autre.
> 
> ...



hum.... je ne comprends pas bien ton explication desole... :rose: 
qu'il faille passer par un systeme de messagerie ok, ca semble logique, mais j'aimerais que ca puisse se faire de facon transparente, sans qu'il n'ouvre le programme comme avec un mailto.
j'ai lu sur un bouquin qu'il fallait creer une page en .php specialement pour traiter le formulaire, est-ce exact? (auquel cas je vais etre bloque vu que je ne connais que tres peu le php)
sinon je regarde ce systeme chez free de suite


----------



## PA5CAL (16 Janvier 2006)

Désolé si ce n'est pas très clair.

Le principe, c'est :
- une première page purement HTML et contenant un formulaire (<FORM>...</FORM>) permet à l'utilisateur de saisir son message
- la validation du formulaire appelle un script PHP, qui fabrique l'email à partir des données saisies par l'utilisateur et l'envoie au serveur SMTP par le bias d'une fonction "mail(...)", puis retourne la page HTML suivante à l'utilisateur (avec un texte du style "Message bien envoyé", par exemple).


Voici un exemple de script PHP (à adapter selon son cas):

```
<?php

   $boundary = '--' . md5( uniqid("myboundary") );
   $sep = chr(13) . chr(10);

// Adresse de réception
   $email = "monadresse@free.fr";   

   $from = $_POST['from'];
   if ( $from=="" )
      $from = "monadresse@free.fr";   

   $subject = $_POST['subject'];
   if ( $subject=="" )
      $subject = date("d/m/Y G:i:s",mktime());

   $nprio = $_POST['priority'];
   if ( $nprio=="1" )
      $priority = "1 (Highest)";
   else
   if ( $nprio=="2" )
      $priority = "2 (High)";
   else
   if ( $nprio=="4" )
      $priority = "4 (Low)";
   else
   if ( $nprio=="5" )
      $priority = "5 (Lowest)";
   else
      $priority = "3 (Normal)";

   $header .= "From: $from\n";
   $header .= "X-Priority: $priority\n";
   $header .= "Mime-Version: 1.0\nContent-Type: multipart/mixed;\n boundary=\"$boundary\"\n"; 
   $header .= "Content-Transfer-Encoding: 8bit\n";
   $header .= "X-Mailer: PhpMailer\n";
   $message .= "This is a multi-part message in MIME format.\n";

   $message .= "--$boundary\n";

   $message .= "Content-Type: text/plain; charset=iso-8859-1\n";
   $message .= "Content-Transfer-Encoding: 8bit\n";

// Ici, constitution du message
   $message .= "\n" . $_POST['text'] . "\n\n";

   $filename = $_FILES['attachment']['name'];
   $filetype = $_FILES['attachment']['type'];

// Pièce jointe
   if ( $filename != "" ) {
     $message .= "--$boundary\n";

     $message .= "Content-type: $filetype ;\n";
     $message .= " name=\"$filename\"\n";
     $message .= "Content-Transfer-Encoding: base64\n";
     $message .= "Content-Disposition: inline;\n";
     $message .= " filename=\"$filename\"\n";
               
     $linesz = filesize( $_FILES['attachment']['tmp_name'] ) + 1;
              
     $fp = fopen( $_FILES['attachment']['tmp_name'], 'r' );
     $content = chunk_split( base64_encode( fread( $fp, $linesz ) ) );
     fclose( $fp );

     $message .= $sep.$content;
   }                   

   $sended = mail($email, $subject, $message, $header);
   if ($sended) {

// Ici, page de retour quand l'envoi a été effectué
   ...

   } else {

// Ici, page de retour en cas d'erreur
   ...

   }
 
?>
```

La page d'appel en HTML ressemble à ça :

```
<html>

<body>


<form enctype="multipart/form-data" action="http://monsite.free.fr/monscript" method="post">

Exp&eacute;diteur :<br>
<input name="from" type="text" value="" size="50">
<br><br>

Sujet :<br>
<input name="subject" type="text" value="" size="50">
<br><br>

Importance :<br>
<input name="priority" type="text" value="" size="2">
<br><small>de 1 (haute) &agrave; 5 (basse). 3 par d&eacute;faut</small>
<br><br>

Texte :<br>
<textarea name="text" cols="50" rows="10" wrap="virtual">
</textarea>
<br><br>

Fichier joint:<br>
<input name="attachment" type="file">
<br><br>

<input type="submit" value="Envoyer">

</form>

</body>
</html>
```


----------



## danny (18 Janvier 2006)

merci pour ta reponse Pascal
j'ai essaye d'etudier un peu le code que tu me proposes, mais pour le moment je reste perdu
Neammoins je me servirai de ton exemple lors de mon prochain cours sur le php, car pour le moment meme si je comprends un minimum de choses, je ne suis pas encore operationnel. Merci quand meme


----------



## Warflo (24 Janvier 2006)

A priori, tu n'a pas besoin toi de savoir le php, c'est juste un exemple de script utilisé par l'hebergeur.


----------



## PA5CAL (24 Janvier 2006)

Warflo a dit:
			
		

> A priori, tu n'a pas besoin toi de savoir le php, c'est juste un exemple de script utilisé par l'hebergeur.


En fait si, parce que le script en question n'est pas fourni par l'hébergeur (en tout cas c'est comme ça chez Free), et doit donc être fabriqué par l'hébergé et déposé sur son site perso.


----------



## danny (3 Février 2006)

> Pascal

dans ton code il y a



> // Ici, page de retour quand l'envoi a été effectué
> ...
> 
> } else {
> ...



par quoi doit-on remplacer les ... ?


----------



## PA5CAL (3 Février 2006)

danny a dit:
			
		

> par quoi doit-on remplacer les ... ?


Par du code à exécuter, selon le cas.

Par exemple:


```
$sended = mail($email, $subject, $message, $header);
   if ($sended) {
         print "Votre message est bien parti.";
   } else {
         print "Une erreur s'est produite pendant l'envoi de votre message.";
   }
```


----------



## Pochtroi (3 Février 2006)

PA5CAL a dit:
			
		

> $from = $_POST['from'];


(entre autres, c'est valable pour chaque récupération de variable...)

Désolé de donner des conseils, alors que mon formulaire d'envoi de messages ne fonctionne pas... :rose: 
Mais sur Le site du zéro, ils conseillent (et même ils insistent sur ce problème) de toujours utiliser ce code lorsqu'on récupère une variable postée par un utilisateur...


```
$from=htmlentities($_POST['from'], ENT_QUOTES);
```

En fait, il permet de détruire le code HTML que le "posteur" a éventuellement inséré dans le formulaire. Il évite ainsi de lancer à notre insu un code qui viendrait (par exempe) récupérer toutes nos infos, nos mots de passes et plein d'autres trucs que je ne sais pas de quoi il s'agit, mais enfin bref, il parait que ça évite que des hackers viennent te bousiller ton Mac tout neuf (ou plus vieux) donc moi, je le mets... A bon entendeur

Enfin, j'espère que ce n'est pas à cause de ça que mon formulaire ne marche pas


----------



## PA5CAL (3 Février 2006)

Dans mon cas, en l'occurence, c'est le serveur de l'hébergeur sur lequel tourne le script PHP qui risque de se faire hacker...

Je n'ai pas essayé, mais je pense que l'emploi de "htmlentities()" n'empêche en rien l'envoi du mail.

En revanche, je ne connais pas l'incidence de cette fonction sur la transmission des fichiers mis en pièces jointes, par exemple. Mais là ce n'est plus qu'une question de contenu reçu par le destinataire du mail.


----------



## Pochtroi (3 Février 2006)

PA5CAL a dit:
			
		

> Dans mon cas, en l'occurence, c'est le serveur de l'hébergeur sur lequel tourne le script PHP qui risque de se faire hacker...



Ca c'est pas très gentil pour eux ! :mouais: 

Enfin moi, je ne comprend pas. Je n'ai pas pris exactement ton code, d'une part parce que je ne le comprend pas, d'autre part parce que je veux un truc bien personnalisé (et sans pièces jointes) et que modifier un code dont on ne pige pas tout, c'est pas tellement conseillé. Je fais deux tests différents pour afficher un message en fonction de la situation. Un sur le fait que les champs "email" (j'aime pas les anonymes), "sujet" et "message" soient remplis et un qui est le même que le tien, à savoir : 
	
	



```
$sended=mail($envoi, $sujet, $message);
 if ($sended)
 {
  echo "Votre message a bien &eacute;t&eacute; envoy&eacute;. Merci de votre visite.";
 }
 else
 {
 echo "Echec lors de l'envoi du message";
 }
```

Mais il m'envoie toujours "Votre message a bien été envoyé. Merci de votre visite." alors que si je vais voir sur mon mail, y'a que dalle qui a été envoyé...  (ce n'est pas une question de temps, puisque j'ai déjà essayé d'envoyer des trucs hier soir et... bah aujourd'hui, toujours rien...

Est-ce que tu as une idée ?

Aussi, j'ai vu dans Comment ça marche? qu'on a différentes options sur la fonction mail() 





> Le champ options de la fonction mail permet d'ajouter une en-tête au message que l'on envoie. On peut par exemple y mettre la date, le logiciel utilisé pour envoyer l'email ou encore l'adresse de retour...
> Voilà un exemple d'en-tête à utiliser lors d'un envoi de mail :
> 
> 
> ...



Mais ce n'est pas possible de mettre le mail du gars qui envoie un message dans la rubrique "mail" de mon logiciel "Mail"??? Ou alors comment lui dire que la variable que je lui indique est le mail, la date, ou autre chose?

Merci


----------



## PA5CAL (3 Février 2006)

Si la fonction "mail()" retourne un code correctement, ça ne signifie pas pour autant que tout le système de messagerie du serveur fonctionne bien derrière. Je pense que le problème vient probablement de là (SMTP).

Le principe de fonctionnement de la messagerie via PHP fait que l'expéditeur n'est autre que le serveur HTTP. L'utilisateur qui, par sa requête, fait tourner le script d'envoi, n'est pas identifié autrement que par une adresse IP de connexion, et d'autres paramètres issus de HTTP (HTTP_COOKIE,  HTTP_USER_AGENT, etc.). En aucun cas on n'aura accès à son adresse de messagerie (s'il en a une) autrement qu'en la lui demandant et en mettant sa réponse (vraie ou fausse) dans les champs "From:" et "Reply-To:". L'identification de l'expéditeur ne peut donc pas être fiable.

Dans mon cas, j'ai fait un script PHP sur free.fr que je suis seul à utiliser, dont l'existance est indétectable pour un surfeur non averti, et qui est limité à ma seule boîte de réception (destinataire en dur dans le code, non modifiable). Le script est d'ailleurs agrémenté de verrous (que je n'ai pas reproduits dans le code que je vous ai donné) afin d'interdire son usage par une personne non autorisée, si cela devait arriver. J'évite ainsi le risque de voir spammer ma boîte de réception avec mon propre script.


----------



## Pochtroi (3 Février 2006)

PA5CAL a dit:
			
		

> Dans mon cas, j'ai fait un script PHP sur free.fr que je suis seul à utiliser, dont l'existance est indétectable pour un surfeur non averti, et qui est limité à ma seule boîte de réception (destinataire en dur dans le code, non modifiable). Le script est d'ailleurs agrémenté de verrous (que je n'ai pas reproduits dans le code que je vous ai donné) afin d'interdire son usage par une personne non autorisée, si cela devait arriver. J'évite ainsi le risque de voir spammer ma boîte de réception avec mon propre script.



Waoh !! Tu ne peux pas t'arrêter là, il faut donner la combine !  
Enfin avant ça, faudrait faire plus simple... Tu n'as pas une idée de pourquoi mon formulaire n'envoie pas mes mails?...  Bon d'accord, je reprend ton script et j'essaie de le modifier pour en faire ce que je veux, mais c'est pas gagné :rose:


----------



## Nanoux (3 Février 2006)

Bonsoir à toutes et tous  

Nous avons acheté Rapidweaver pour nous construire un joli website.
Tout va bien, sauf:

Impossible de créer une page contact eet de l'exporter sur .mac

Problème PHP ????

Merci de me donner vos trucs et astuces


----------



## Pochtroi (3 Février 2006)

Bah desole mais ton script ne marche pas mieux que le mien pa5cal... je comprend pas.
Désolé nanoux mais je n'en sais rien...


----------



## Nanoux (3 Février 2006)

Pochtroi a dit:
			
		

> Bah desole mais ton script ne marche pas mieux que le mien pa5cal... je comprend pas.
> Désolé nanoux mais je n'en sais rien...



Bon ben tant pis ...
Merci d'avoir essayé.

Si qqn à une petite idée


----------



## Pochtroi (4 Février 2006)

Yaaaaaaaahouuuuuuuuuuu !! 
Ca marche en fait ! Encore un truc que je ne comprend pas bien. Mon site est http://fratelibenar.free.fr. J'ai un autre site sur lequel je fais des tests avant de mettre une nouveauté sur le vrai site, ça m'évite de faire des conneries irréparables sur mon site... Ca site de tests est hébergé par iFrance qui rajoute un bandeau de pub sur le haut (est-ce dû à ça ). Enfin le fait est que quand quelque chose ne veut pas fonctionner et que je ne parviens pas à en trouver la raison, je fait une sauvegarde de mon site dans un dossier sur mon Mac et je fais un essai de mes modifs sur mon vrai site. Et ben là, en général, ça marche ! 
C'est à n'y rien comprendre mais c'est bien comme ça. C'est décidé, je vais demander une nouvelle page perso à Free pour en faire mon site TEST. Ainsi, je n'aurais plus à m'emmerder avec ces c....... d'iFrance !



			
				Pochtroi a dit:
			
		

> Waoh !! Tu ne peux pas t'arrêter là, il faut donner la combine !



Cela ne retire pas ma requête quant à ta technique de cryptage de mail, Pa5cal !... sauf bien sûr si ça permettrait aux hackers de contourner ta combine !
J'avais pensé à insérer dans le formulaire une rubrique cachée où se trouve mon email, dans ce cas, il est toujours inscrit dans le code source...


----------



## PA5CAL (4 Février 2006)

Pochtroi a dit:
			
		

> Cela ne retire pas ma requête quant à ta technique de cryptage de mail, Pa5cal !... sauf bien sûr si ça permettrait aux hackers de contourner ta combine !


Je pense qu'il y a méprise. Il n'y a pas de cryptage à proprement parler. Mais la force de cette protection, qui est très simpliste, repose sur le secret. C'est la raison pour laquelle je n'en donnerai pas les détails.

Pour détourner le système, il faut connaître  à la fois son existence et son fonctionnement. Seul l'administrateur du serveur serait en mesure de le faire, mais il n'y a justement pas intérêt.


----------



## da capo (4 Février 2006)

Le script que tu as développé fonctionne bien et tout et tout. Tu le protèges en le rendant "invisible" si j'ai bien compris.

Mais j'ai une petite question.
Pour le rendre moins sensible au spam (dans le cadre d'une utilisation "ouverte") serait-il possible de le modifier légèrement en lui demandant par exemple de conserver les dernières IP des utilisateurs et dates/heures d'envoi pour contrôle ?
Du genre, pour pouvoir partir il faut vérifier :
- cas 1 : l'adresse IP de l'utilisateur n'est pas dans la liste => ça part sans souci.
- cas 2 : l'adresse de l'utilisateur est dans la liste  courante est déjà présente dans la liste des derniers envois mais plus de n (réglable) secondes se sont écoulées => ça part.
- cas 3 : les conditions 1 ou 2 ne sont pas respectées => dev/null

Pas trop dur à coder ? Surement, mais ça dépasse mes compétences en php.

Des idées ?


----------



## PA5CAL (4 Février 2006)

Ça nécessite de stocker et de gérer une liste d'adresses IP sur serveur (et donc d'activer la base de données chez Free). Toutefois, comme il est possible à un spammer de changer d'adresse IP à toute vitesse, je pense que cette solution n'est pas fiable à 100%.


----------



## Pochtroi (4 Février 2006)

Sinon je vois bien, déjà pour éviter les mails automatiques, comme font tous les sites maintenant: une image avec des caractères bizarre que tu charges avec une fonction "random" (elle doit bien exister) pour pas que ce soit tout le temps le même et tu demandes à l'utilisateur de recopier les caractères... Mais bon, ça n'empêche pas un boulet de t'envoyer un message toutes les deux minutes, et encore moins qu'il ne récupère ton mail...
Mais déjà, quelqu'un a-t-il une solution pour vérifier que l'email donné est valide? Autrement qu'en cherchant s'il y a bien un '@' dans la chaine de caracteres, ce qui est assez limité? Parce que dans ce cas, il faut aussi vérifier que le "@" n'est pas le premier caractère, qu'ensuite il y a un point, et qu'encore après, il y a encore qqch...


----------

