Website Kontaktformular phpmailer?

2 Antworten

Man kann mit JavaScript die Formulardaten auf einem eigenen Kanal an den Server schicken und dessen Antwort darauf einfangen. Die Seite braucht also nicht neu geladen zu werden und die Serverantwort kann nachträglich / dynamisch in der Seite eingesetzt werden.

HTML:

<form id="contact-form">
  <output id="output"></output>
  <!-- input fields, etc. ... -->
</form>

JavaScript:

const form = document.getElementById("contact-form");
form.addEventListener("submit", evt => {
  const data = new FormData(form);
  const querystring = new URLSearchParams(data);
  
  fetch("URL to your PHP script ...", { method: "post", body: querystring })
    .then(response => response.text())
    .then(result => {
      const output = document.getElementById("output");
        output.textContent = result;
    })
    .catch(error => console.error(error));

  evt.preventDefault();
});

Das Skript kann man via script-Tag in das HTML-Dokument einbinden (lies dazu hier). Wichtig ist lediglich, dass es erst ausgeführt wird, nachdem das Formularelement auf der Seite schon geladen wurde. Entweder bindet man den script-Tag also irgendwann nach dem form-Element (aber noch im body) ein oder man nutzt das defer-Attribut.

Der JavaScript-Code unterbricht bei Auslösen des submit-Events den normalen Formularversandweg (preventDefault) und sammelt stattdessen selbst alle Formulardaten (FormData), um sie dann (via fetch) an das PHP-Skript zu schicken.

Die Logik für den Mailversand lagerst du in ein extra PHP-Skript aus. Fehlermeldungen / Erfolgsnachrichten gibst du dort ganz normal mit print / echo / die aus.

Die Ausgaben des PHP-Skripts wiederum werden zurückgeschickt und aufgefangen (Response). Das JavaScript schreibt sie in das output-Element.

regex9  17.01.2022, 16:45

PS.: Was auch geht - man schickt das Formular an dieselbe URL:

<!doctype html>
<head>
  <title>Example</title>
  <meta charset="utf-8">
</head>
<body>
  <?php
    $feedback = "";

    if (isset($_POST['submit'])) {
      // evaluate data, send mail ...
    }
  ?>
  <form method="post">
    <output><?= $feedback ?></output>
    <!-- input fields ... -->
    <button name="submit">Send</button>
  </form>
</body>

Das action-Attribut auf dem form-Tag wird weggelassen, die Daten werden dann an aktuelle URL geschickt. Bei diesem Request gibt es dann den submit-Eintrag in $_POST, der Mailversand kann folglich vorgenommen werden.

Deine Erfolgs-/Fehlernachricht kannst du in eine Variable $feedback schreiben, die im output-Element ausgegeben wird.

Der Nachteil zu der JavaScript-Lösung: Ein Neuladen der Seite ist notwendig.

0

Benutzt Du die Mail-Funktion von php?

mail(......);

Wenn ja, dann funktioniert das so:

Du kannst eine Funktion in eine Variabel packen. Das sieht dann so aus:

$gesendeteMail = mail(......);

So kannst Du mit if/else prüfen, ob die Mail erfolgreich versendet wurde. Also so:

if($gesendeteMail) {
   echo 'Erfolgreich versendet.';
} else {
   echo 'Fehler beim Versenden.';
}

Theoretisch kannst Du auch gleich die mail()-Funktion selbst in die if/else-Abfrage stecken, aber das ist dann unübersichtlich. Würde so aussehen:

if(mail(......)) {
   echo 'Erfolgreich versendet.';
} else {
   echo 'Fehler beim Versenden.';
}
MrMuffin2002 
Fragesteller
 17.01.2022, 16:39

Ich benutze den phpmailer

0
siliciumcarbid2  17.01.2022, 16:48
@MrMuffin2002

Das geht schon, aber diese Applikation ist richtig kompliziert, wenn man sich mit PHP nicht sehr gut auskennt. Darum: Keine Ahnung. Wenn man Deinen Code sehen dürfte, könnte man evtl. weiterhelfen.

0