Senden Sie eine E-Mail mit PHP aus dem HTML-Formular beim Senden mit demselben Skript


73

Ich möchte eine E-Mail mit PHP senden, wenn ein Benutzer ein HTML-Formular ausgefüllt und anschließend Informationen aus dem Formular per E-Mail gesendet hat. Ich möchte dies mit demselben Skript tun, das die Webseite mit dem Formular anzeigt.

Ich habe diesen Code gefunden, aber die Mail wird nicht gesendet.

<?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";
    }
}

?>

Wie lautet der Code zum Senden einer E-Mail in PHP?


Können Sie den vollständigen Code einschließlich Ihres HTML-Codes anzeigen?
Amal Murali

Ich verstehe nicht, was du tun willst. Möchten Sie eine Kopie der Nachricht an die Person senden, die das Formular ausgefüllt hat?
Funk Forty Niner

Antworten:


153

BEARBEITEN (# 1)

Wenn ich das richtig verstehe, möchten Sie alles auf einer Seite haben und es von derselben Seite ausführen.

Mit dem folgenden Code können Sie beispielsweise E-Mails von einer einzelnen Seite senden index.phpodercontact.php

Der einzige Unterschied zwischen dieser und meiner ursprünglichen Antwort besteht darin, <form action="" method="post">wo die Aktion leer gelassen wurde.

Es ist besser, header('Location: thank_you.php');anstelle des echoPHP-Handlers den Benutzer anschließend auf eine andere Seite umzuleiten.

Kopieren Sie den gesamten folgenden Code in eine Datei.

<?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> 

Ursprüngliche Antwort


Ich war mir nicht ganz sicher, was die Frage war, habe aber den Eindruck, dass eine Kopie der Nachricht an die Person gesendet werden soll, die das Formular ausgefüllt hat.

Hier ist eine getestete / funktionierende Kopie eines HTML-Formulars und eines PHP-Handlers. Dies nutzt die PHP- mail()Funktion.

Der PHP-Handler sendet auch eine Kopie der Nachricht an die Person, die das Formular ausgefüllt hat.

Sie können zwei Schrägstriche //vor einer Codezeile verwenden, wenn Sie sie nicht verwenden möchten.

Zum Beispiel: // $subject2 = "Copy of your form submission"; wird nicht ausgeführt.

HTML-FORMULAR:

<!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>

PHP-Handler (mail_handler.php)

(Verwendet Informationen aus dem HTML-Formular und sendet die 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.
    }
?>

So senden Sie als HTML:

Wenn Sie E-Mails als HTML und für beide Instanzen senden möchten, müssen Sie zwei separate Sätze von HTML-Headern mit unterschiedlichen Variablennamen erstellen.

Lesen Sie das Handbuch weiter mail(), um zu erfahren, wie Sie E-Mails als HTML senden:


Fußnoten:

  • In Bezug auf HTML5

Sie müssen die URL des Dienstes, der die übermittelten Daten verarbeitet, mithilfe des Aktionsattributs angeben.

Wie unter https://www.w3.org/TR/html5/forms.html unter 4.10.1.3 beschrieben. Konfigurieren eines Formulars für die Kommunikation mit einem Server . Vollständige Informationen finden Sie auf der Seite.

Funktioniert daher action=""nicht in HTML5.

Die richtige Syntax wäre:

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

Beachten Sie, dass xxxdies die Erweiterung des Dateityps ist, mit dem der Prozess ausgeführt wird. Dies könnte eine sein .php, .cgi, .pl, .jspDateierweiterung usw.


Lesen Sie die folgenden Fragen und Antworten zu Stack, wenn das Senden von E-Mails fehlschlägt:


Gibt es eine Möglichkeit, diesen Code mail_handler.php im HTML-Formular zu verwenden, wenn ich ein PHP-Skript hätte, das diese Seite generiert (wie index.php)?
Fusi0n

1
@ fusi0n Meinst du, dass sich das Formular und der Handler auf derselben Seite befinden, anstatt 2 Dateien zu verwenden?
Funk Forty Niner

1
@CalculatingMachine Ich vermute, dass es sich um ein JS-Problem handelt und dass ich in JS nicht besonders gut bin, insbesondere wenn es um das Auslösen von Ereignissen geht. Das Beste, was ich vorschlagen kann, ist, auf Ihre Konsole zu schauen und / oder eine Frage zu stellen. Ich bin sicher, Sie werden jemanden finden, der helfen kann, Prost
Funk Forty Niner

1
@ MilchePatern Danke dafür. Ich werde meine Antwort ändern, wenn ich zurück bin. Ich muss wie jetzt gehen - lol Cheers
Funk Forty Niner

1
@MilchePatern Ich habe die Antwort bearbeitet. Um die ursprünglich gegebene Antwort zu erhalten, wurde sie unter Fußnoten aufgenommen : .
Funk Forty Niner

4

Wenn Sie dies noch nicht getan haben, überprüfen Sie Ihre php.iniund stellen Sie sicher, dass die Parameter unter der [mail function]Einstellung richtig eingestellt sind, um den E-Mail-Dienst zu aktivieren. Nachdem Sie die PHPMailer- Bibliothek verwenden können, befolgen Sie die Anweisungen.


4

PHP-Skript zum Herstellen einer Verbindung zu einem SMTP-Server und zum Senden von E-Mails unter Windows 7

Das Senden einer E-Mail von PHP in Windows ist ein Minenfeld mit Fallstricken und Kopfkratzen. Ich werde versuchen, Sie durch eine Instanz zu führen, in der ich sie unter Windows 7 und PHP 5.2.3 unter (IIS) Internet Information Services-Webserver zum Laufen gebracht habe.

Ich gehe davon aus, dass Sie kein vorgefertigtes Framework wie CodeIgniter oder Symfony verwenden möchten, das E-Mail-Sendefunktionen enthält. Wir senden eine E-Mail von einer eigenständigen PHP-Datei. Ich habe diesen Code unter der Codeigniter-Haube (unter System / Bibliotheken) erworben und ihn so geändert, dass Sie ihn einfach in diese Email.php-Datei einfügen können und er sollte einfach funktionieren.

Dies sollte mit neueren Versionen von PHP funktionieren. Aber du weißt nie.

Schritt 1: Sie benötigen einen Benutzernamen / ein Passwort für einen SMTP-Server:

Ich verwende den SMTP-Server, smtp.ihostexchange.netder bereits für mich erstellt und eingerichtet wurde. Wenn Sie dies nicht haben, können Sie nicht fortfahren. Sie sollten in der Lage sein, einen E-Mail-Client wie Thunderbird, Evolution und Microsoft Outlook zu verwenden , um Ihren SMTP-Server anzugeben, und dann E-Mails über diesen Server senden zu können.

Schritt 2: Erstellen Sie Ihre Hello World-E-Mail-Datei:

Ich gehe davon aus, dass Sie IIS verwenden. Erstellen Sie also eine Datei mit dem Namen index.php unter C:\inetpub\wwwrootund fügen Sie diesen Code dort ein:

<?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";
?>

Sie sollten in der Lage sein, diese index.php zu besuchen, indem Sie in einem Browser zu localhost / index.php navigieren. Es werden Fehler ausgegeben, da Email.php fehlt. Stellen Sie jedoch sicher, dass Sie es zumindest über den Browser ausführen können.

Schritt 3: Erstellen Sie eine Datei mit dem Namen Email.php:

Erstellen Sie eine neue Datei mit dem Namen Email.php unter C:\inetpub\wwwroot.

Kopieren Sie diesen PHP-Code in Email.php:

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

Da es viele Arten von SMTP-Servern gibt, müssen Sie manuell an den Einstellungen oben auf herumspielen Email.php. Ich habe es so eingerichtet, dass es automatisch funktioniert smtp.ihostexchange.net, aber Ihr SMTP-Server ist möglicherweise anders.

Zum Beispiel:

  1. Setzen Sie die Einstellung smtp_port auf den Port Ihres SMTP-Servers.
  2. Stellen Sie die Einstellung smtp_crypto auf die Anforderungen Ihres SMTP-Servers ein.
  3. Stellen Sie $ newline und $ crlf so ein, dass sie mit dem kompatibel sind, was Ihr SMTP-Server verwendet. Wenn Sie eine falsche Auswahl treffen, ignoriert der SMTP-Server Ihre Anfrage möglicherweise ohne Fehler. Ich benutze \ r \ n, für Sie ist vielleicht \nerforderlich.

Der verknüpfte Code ist zu lang, um als Stackoverflow-Antwort eingefügt zu werden. Wenn Sie ihn bearbeiten möchten, hinterlassen Sie hier oder über github einen Kommentar, und ich werde ihn ändern.

Schritt 4, stellen Sie sicher, dass auf Ihrer php.ini die SSL-Erweiterung aktiviert ist:

Suchen Sie Ihre PHP.ini-Datei und kommentieren Sie die aus

;extension=php_openssl.dll

So sieht es aus:

extension=php_openssl.dll

Schritt 5: Führen Sie die gerade erstellte Datei index.php in einem Browser aus:

Sie sollten die folgende Ausgabe erhalten:

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

Schritt 6: Überprüfen Sie Ihre E-Mails und Ihren Spam-Ordner:

Besuchen Sie das E-Mail-Konto für user_to_receive_email@gmail.com und Sie sollten eine E-Mail erhalten haben. Es sollte innerhalb von 5 oder 10 Sekunden eintreffen. Wenn Sie dies nicht tun, überprüfen Sie die auf der Seite zurückgegebenen Fehler. Wenn das nicht funktioniert, versuchen Sie, Ihr Gesicht auf der Tastatur von Google zu zerdrücken, während Sie singen: "Die Arbeit im Lebensmittelgeschäft ist nicht so schlecht."



1

Sie benötigen einen SMPT-Server, um

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

arbeiten.

Sie könnten leichte SMTP-Server wie xmailer ausprobieren


1

Sie müssen ein wie folgt actionin Ihr Formular einfügen:

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

Fügen Sie dann Ihr Snippet oben in das Dokument ein und senden Sie die E-Mail. Das echo($_SERVER['PHP_SELF']);bedeutet, dass Ihre Informationen oben in Ihrem Skript gesendet werden, damit Sie sie verwenden können.


1
Nicht wahr - Wenn actionein Formular kein Attribut enthält, wird dieselbe Seite angenommen.
Blazemonger

1

Hier sind die PHP-Mail-Einstellungen, die ich verwende:

//Mail sending function
$subject = $_POST['name'];
$to = $_POST['email'];
$from = "zenphoto@example.com";

//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.";

-2

Ich denke, ein Fehler im ursprünglichen Code könnte gewesen sein, dass es hatte:

$message = echo getRequestURI();

anstatt:

$message = getRequestURI();

(Der Code wurde inzwischen jedoch bearbeitet.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.