83 votes

Envoyer un email avec PHP à partir d'un formulaire html en le soumettant avec le même script.

Je souhaite envoyer un email avec PHP lorsqu'un utilisateur a fini de remplir un formulaire HTML et d'envoyer par email les informations contenues dans le formulaire. Je veux le faire à partir du même script qui affiche la page web contenant le formulaire.

J'ai trouvé ce code, mais le courrier n'est pas envoyé.

<?php 

if (isset($_POST['submit'])) {
    $to = $_POST['email']; 
    $subject = $_POST['name'];
    $message = getRequestURI();
    $from = "zenphoto@example.com";
    $headers = "From:" . $from;

    if (mail($to, $subject, $message, $headers)) {
        echo "Mail Sent.";
    }
    else {
        echo "failed";
    }
}

?>

Quel est le code pour envoyer un email en PHP ?

173voto

Fred -ii- Points 23477

EDIT (#1)

Si je comprends bien, vous souhaitez tout regrouper sur une seule page et l'exécuter à partir de cette même page.

Vous pouvez utiliser le code suivant pour envoyer un courrier à partir d'une seule page, par exemple index.php ou contact.php

La seule différence entre cette réponse et ma réponse initiale est la suivante <form action="" method="post"> lorsque l'action a été laissée en blanc.

Il est préférable d'utiliser header('Location: thank_you.php'); au lieu de echo dans le gestionnaire PHP pour rediriger ensuite l'utilisateur vers une autre page.

Copiez l'ensemble du code ci-dessous dans un seul fichier.

<?php 
if(isset($_POST['submit'])){
    $to = "email@example.com"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    }
?>

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html> 

Réponse originale


Je n'ai pas bien compris la question, mais j'ai l'impression qu'une copie du message doit être envoyée à la personne qui a rempli le formulaire.

Voici une copie testée/fonctionnelle d'un formulaire HTML et d'un gestionnaire PHP. Ce formulaire utilise le gestionnaire PHP mail() función.

Le gestionnaire PHP envoie également une copie du message à la personne qui a rempli le formulaire.

Vous pouvez utiliser deux barres obliques // devant une ligne de code si vous n'avez pas l'intention de l'utiliser.

Par exemple : // $subject2 = "Copy of your form submission"; ne s'exécutera pas.

FORMULAIRE HTML :

<!DOCTYPE html>
<head>
<title>Form submission</title>
</head>
<body>

<form action="mail_handler.php" method="post">
First Name: <input type="text" name="first_name"><br>
Last Name: <input type="text" name="last_name"><br>
Email: <input type="text" name="email"><br>
Message:<br><textarea rows="5" name="message" cols="30"></textarea><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html>

Gestionnaire PHP (mail_handler.php)

(Utilise les informations du formulaire HTML et envoie l'e-mail)

<?php 
if(isset($_POST['submit'])){
    $to = "email@example.com"; // this is your Email address
    $from = $_POST['email']; // this is the sender's Email address
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $subject = "Form submission";
    $subject2 = "Copy of your form submission";
    $message = $first_name . " " . $last_name . " wrote the following:" . "\n\n" . $_POST['message'];
    $message2 = "Here is a copy of your message " . $first_name . "\n\n" . $_POST['message'];

    $headers = "From:" . $from;
    $headers2 = "From:" . $to;
    mail($to,$subject,$message,$headers);
    mail($from,$subject2,$message2,$headers2); // sends a copy of the message to the sender
    echo "Mail Sent. Thank you " . $first_name . ", we will contact you shortly.";
    // You can also use header('Location: thank_you.php'); to redirect to another page.
    // You cannot use header and echo together. It's one or the other.
    }
?>

Pour envoyer en HTML :

Si vous souhaitez envoyer du courrier en HTML et pour les deux instances, vous devrez créer deux ensembles distincts d'en-têtes HTML avec des noms de variables différents.

Lisez le manuel sur mail() pour apprendre à envoyer des courriels au format HTML :


Notes de bas de page :

  • En ce qui concerne HTML5

Vous devez spécifier l'URL du service qui traitera les données soumises, en utilisant l'attribut action.

Comme indiqué à l'adresse suivante https://www.w3.org/TR/html5/forms.html sous 4.10.1.3 Configurer un formulaire pour communiquer avec un serveur . Pour des informations complètes, consultez la page.

C'est pourquoi, action="" ne fonctionnera pas en HTML5.

La syntaxe correcte serait la suivante :

  • action="handler.xxx" ou
  • action="http://www.example.com/handler.xxx" .

Il convient de noter que xxx sera l'extension du type de fichier utilisé pour gérer le processus. Il peut s'agir d'un .php , .cgi , .pl , .jsp l'extension du fichier, etc.


Consultez les questions et réponses suivantes sur la pile en cas d'échec de l'envoi de courrier :

5voto

Eric Leschinski Points 14289

PHP script pour se connecter à un serveur SMTP et envoyer des emails sous Windows 7

L'envoi d'un courrier électronique à partir de PHP sous Windows est un peu un champ de mines avec des gotchas et des grattages de tête. Je vais essayer de vous guider à travers un exemple où j'ai réussi à le faire fonctionner sous Windows 7 et PHP 5.2.3 sous (IIS) Internet Information Services webserver.

Je suppose que vous ne voulez pas utiliser un framework pré-construit comme CodeIgniter ou Symfony qui contient une capacité d'envoi d'email. Nous allons envoyer un email à partir d'un fichier PHP autonome. J'ai récupéré ce code sous le capot de Codeigniter (sous system/libraries) et je l'ai modifié pour que vous puissiez simplement insérer ce fichier Email.php et qu'il fonctionne.

Cela devrait fonctionner avec les versions plus récentes de PHP. Mais on ne sait jamais.

Etape 1, Vous avez besoin d'un nom d'utilisateur/mot de passe avec un serveur SMTP :

J'utilise le serveur smtp de smtp.ihostexchange.net qui est déjà créé et configuré pour moi. Si vous ne l'avez pas, vous ne pouvez pas continuer. Vous devriez pouvoir utiliser un client de messagerie comme thunderbird, evolution, Microsoft Outlook pour spécifier votre serveur smtp et pouvoir ainsi envoyer des courriels par ce biais.

Étape 2 : Créez votre fichier Hello World Email :

Je suppose que vous utilisez IIS. Créez donc un fichier appelé index.php sous C:\inetpub\wwwroot et d'y insérer ce code :

<?php

  include("Email.php");

  $c = new CI_Email();

  $c->from("FromUserName@foobar.com");
  $c->to("user_to_receive_email@gmail.com");
  $c->subject("Celestial Temple");
  $c->message("Dominion reinforcements on the way.");
  $c->send();
  echo "done";
?>

Vous devriez pouvoir visiter cet index.php en naviguant vers localhost/index.php dans un navigateur, il crachera des erreurs parce que Email.php est manquant. Mais assurez-vous que vous pouvez au moins l'exécuter à partir du navigateur.

Étape 3, créer un fichier appelé Email.php :

Créez un nouveau fichier appelé Email.php sous C:\inetpub\wwwroot .

Copiez/collez ce code PHP dans Email.php :

https://github.com/sentientmachine/standalone_php_script_send_email/blob/master/Email.php

Comme il existe de nombreux types de serveurs smtp, vous devrez modifier manuellement les paramètres en haut de la page Email.php . Je l'ai configuré de manière à ce qu'il fonctionne automatiquement avec smtp.ihostexchange.net mais votre serveur smtp peut être différent.

Par exemple :

  1. Réglez le paramètre smtp_port sur le port de votre serveur smtp.
  2. Définissez le paramètre smtp_crypto en fonction des besoins de votre serveur smtp.
  3. Définissez $newline et $crlf de manière à ce qu'ils soient compatibles avec ce que votre serveur smtp utilise. Si vous faites un mauvais choix, le serveur smtp peut ignorer votre demande sans erreur. J'utilise \r\n pour vous peut-être \n est nécessaire.

Le code lié est trop long pour être collé comme une réponse stackoverflow, si vous voulez l'éditer, laissez un commentaire ici ou via github et je le changerai.

Étape 4, assurez-vous que l'extension ssl est activée dans votre php.ini :

Trouvez votre fichier PHP.ini et décompressez le champ

;extension=php_openssl.dll

On dirait donc que.. :

extension=php_openssl.dll

Étape 5 : Exécutez le fichier index.php que vous venez de créer dans un navigateur :

Vous devriez obtenir le résultat suivant :

220 smtp.ihostexchange.net Microsoft ESMTP MAIL Service ready at 
Wed, 16 Apr 2014 15:43:58 -0400 250 2.6.0 
<534edd7c92761@summitbroadband.com> Queued mail for delivery 
lang:email_sent

done

Étape 6, vérifiez votre courrier électronique et votre dossier de courrier indésirable :

Visitez le compte e-mail de user_to_receive_email@gmail.com et vous devriez avoir reçu un e-mail. Il devrait arriver dans les 5 ou 10 secondes. Si ce n'est pas le cas, vérifiez les erreurs renvoyées sur la page. Si cela ne fonctionne pas, essayez d'écraser votre visage sur le clavier de Google en chantant : "Travailler à l'épicerie n'est pas si mal".

4voto

KB9 Points 250

Si vous ne l'avez pas encore fait, regardez votre php.ini et assurez-vous que les paramètres sous la rubrique [mail function] sont correctement réglés pour activer le service de courrier électronique. Une fois que vous pouvez utiliser PHPMailer et suivez les instructions.

3voto

Hareesh Points 541

Vous pouvez également utiliser l'application mandrill pour envoyer le courrier en php. Vous obtiendrez l'API à partir de https://mandrillapp.com/api/docs/index.php.html où vous trouverez tous les détails concernant les courriels envoyés et d'autres détails.

2voto

Moduo Points 613

Vous devez ajouter un action dans votre formulaire :

<form name='form1' method='post' action='<?php echo($_SERVER['PHP_SELF']);'>
    <!-- All your input for the form here -->
</form>

Placez ensuite votre extrait en tête du document et envoyez le courrier. Ce que echo($_SERVER['PHP_SELF']); est qu'il envoie vos informations en haut de votre script pour que vous puissiez les utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X