web-dev-qa-db-fra.com

Envoyer un e-mail avec PHP à partir du formulaire HTML lors de l'envoi avec le même script

Je souhaite envoyer un courrier électronique avec PHP lorsqu'un utilisateur a fini de remplir un formulaire HTML, puis de lui envoyer des informations par courrier électronique. 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'envoie pas.

<?php 

if (isset($_POST['submit'])) {
    $to = $_POST['email']; 
    $subject = $_POST['name'];
    $message = getRequestURI();
    $from = "[email protected]";
    $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?

64
fusi0n

EDIT (# 1)

Si je comprends bien, vous souhaitez avoir tout dans une page et l'exécuter à partir de la 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 celle-ci et ma réponse initiale est le <form action="" method="post"> où 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 l'utilisateur vers une autre page.

Copiez tout le code ci-dessous dans un fichier.

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // 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 ne savais pas trop quelle était 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/de travail d’un formulaire HTML et d’un gestionnaire PHP. Ceci utilise la fonction PHP mail().

Le gestionnaire PHP enverra é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’allez pas l’utiliser.

Par exemple: // $subject2 = "Copy of your form submission"; ne sera pas exécuté.

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 le courrier électronique)

<?php 
if(isset($_POST['submit'])){
    $to = "[email protected]"; // 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 au format HTML:

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

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


Notes de bas de page:

  • En ce qui concerne HTML5

Vous devez spécifier l'URL du service qui gérera les données soumises à l'aide de l'attribut d'action.

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

Par conséquent, action="" ne fonctionnera pas en HTML5.

La syntaxe appropriée serait:

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

Notez que xxx sera l'extension du type de fichier utilisé pour gérer le processus. Cela pourrait être une extension de fichier .php, .cgi, .pl, .jsp, etc.


Consultez le Q & R suivant sur Stack en cas d'échec de l'envoi du courrier:

129
Funk Forty Niner

Script PHP pour se connecter à un serveur SMTP et envoyer un courrier électronique sous Windows 7

Envoyer un e-mail de PHP dans Windows est un peu un champ de mines avec des pièges et des maux de tête. Je vais essayer de vous expliquer une situation où je l’ai fait fonctionner sous Windows 7 et PHP 5.2.3 sous (IIS) sur le serveur Web Internet Information Services.

Je suppose que vous ne voulez utiliser aucun framework pré-construit tel que CodeIgniter ou Symfony, qui contient une fonctionnalité d'envoi de courrier électronique. Nous allons envoyer un courrier électronique à partir d'un fichier autonome PHP. J'ai acquis ce code sous le codeigniter (sous system/libraries) et l'ai modifié afin que vous puissiez simplement déposer ce fichier Email.php et qu'il devrait fonctionner.

Cela devrait fonctionner avec les nouvelles versions de PHP. Mais tu ne sais jamais.

Étape 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 n'avez pas cela, vous ne pouvez pas continuer. Vous devriez pouvoir utiliser un client de messagerie comme Thunderbird, evolution, Microsoft Outlook , pour spécifier votre serveur smtp, puis pouvoir envoyer des courriels par là.

Étape 2, créez votre fichier de courrier électronique Hello World:

Je suppose que vous utilisez IIS. Donc créez un fichier nommé index.php sous C:\inetpub\wwwroot et mettez ce code dedans:

<?php

  include("Email.php");

  $c = new CI_Email();

  $c->from("[email protected]");
  $c->to("[email protected]");
  $c->subject("Celestial Temple");
  $c->message("Dominion reinforcements on the way.");
  $c->send();
  echo "done";
?>

Vous devriez pouvoir visiter ce fichier index.php en accédant à localhost/index.php dans un navigateur. Cela produira des erreurs, car Email.php est manquant. Mais assurez-vous que vous pouvez au moins le lancer depuis le navigateur.

Étape 3, créez un fichier nommé Email.php:

Créez un nouveau fichier nommé 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 situés en haut de Email.php. Je l'ai configuré pour qu'il fonctionne automatiquement avec smtp.ihostexchange.net, mais votre serveur smtp peut être différent.

Par exemple:

  1. Définissez le paramètre smtp_port sur le port de votre serveur smtp.
  2. Définissez le paramètre smtp_crypto sur les besoins de votre serveur smtp.
  3. Définissez $ newline et $ crlf pour qu'il soit compatible avec ce que votre serveur smtp utilise. Si vous choisissez mal, le serveur smtp peut ignorer votre demande sans erreur. J'utilise\r\n, vous avez peut-être besoin de \n.

Le code lié est trop long pour coller en tant que réponse stackoverflow. Si vous souhaitez le modifier, laissez un commentaire ici ou via github et je le changerai.

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

Trouvez votre fichier PHP.ini et décommentez le

;extension=php_openssl.dll

Donc, il ressemble à:

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 
<[email protected]> 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 de messagerie pour [email protected] et vous devriez avoir reçu un email. Il devrait arriver dans 5 ou 10 secondes. Si vous ne le faites pas, inspectez les erreurs renvoyées sur la page. Si cela ne fonctionne pas, essayez de masquer votre visage au clavier sur Google tout en scandant: "travailler à l'épicerie n'est pas si mal."

4
Eric Leschinski

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

3
Hareesh

Si ce n'est déjà fait, examinez votre php.ini et assurez-vous que les paramètres définis dans le paramètre [mail function] sont correctement définis pour activer le service de messagerie. Après que vous puissiez utiliser la bibliothèque PHPMailer et suivez les instructions.

3
KB9

Voici les paramètres de messagerie PHP que j'utilise:

//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "[email protected]";

//data
$msg = "Your MSG <br>\n";       

//Headers
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: <".$from. ">" ;

mail($to,$subject,$msg,$headers);
echo "Mail Sent.";
1
user2663434

Vous devez ajouter un action à votre formulaire comme ceci:

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

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

1
Moduo

Vous avez besoin d’un serveur SMPT pour

... mail($to,$subject,$message,$headers);

travailler.

Vous pouvez essayer des serveurs SMTP légers comme xmailer

0
Andrei CACIO