phpMailer ist eine Code-Bibliothek und wird verwendet, um E-Mails sicher und einfach über PHP-Code von einem Webserver zu senden.
Das direkte Senden von E-Mails über PHP-Code erfordert eine hohe Vertrautheit mit dem SMTP-Standardprotokoll und den damit verbundenen
Problemen und Schwachstellen. phpMailer vereinfacht den Prozess des Sendens von E-Mails und ist sehr einfach zu bedienen.
Manchmal möchte man die Nachricht vom Kontaktformular über dem phpMailer und SMTP
(Simple Mail Transfer Protocol) versenden.
Oder der Provider bietet den Versandt der E-Mails nur über
SMTP an. Weil das aber nicht so einfach ist und bestimmte Einstellungen beachtet werden müssen, stelle ich hier
beispielhaft ein solches PHP-Skript vor.
// phpMailer-Klassen in den globalen Namespace importieren
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$dankeSeite = "danke.php"; // Danke - Seite, die Mail wurde erfolgreich Versandt.
$fehlerSeite = "fehler.php"; // Fehler - Seite, falls die Mail nicht Versandt werden konnte.
// Instanz und Zeichenkodierung setzen
$mail = new PHPMailer(true);
$mail->CharSet = "UTF-8";
// Absender
// Hier muss beim Provider eine bekannte E-Mail-Adresse eingetragen sein, weil "externe"
// E-Mail-Adressen vom Provider gesperrt werden (SPF) und dies zu einer Ablehnung führt.
$mail->setFrom("mail@example.com", "John Doe");
// Inhalt der E-Mail setzen
$mail->Body = $Inhalt;
// Senden
if ($mail->send()) {
// Weiterleitung an die Seite: danke.php
header("Location: " . $dankeSeite);
exit;
} else {
// Wenn die E-Mail nicht versendet werden konnte.
// Weiterleitung an die Seite: fehler.php
header("Location: " . $fehlerSeite);
exit;
}
}
?> <!DOCTYPE html> <html lang="de">
<!-- Name --> <p><label>Name:<br> <input type="text" name="name" minlength="5" required></label> <span class="hilfetext">Geben Sie hier Ihre Vor- und Nachnamen ein.</span> </p>
<!-- E-Mail --> <p><label>E-Mail:<br> <input type="email" name="mail" required></label> <span class="hilfetext">Geben Sie hier Ihre E-Mail-Adresse ein.</span> </p>
<!-- Betreff --> <p><label>Betreff:<br> <input type="text" name="betreff" minlength="10" required></label> <span class="hilfetext">Aus welchem Grund möchten Sie mit uns in Kontakt treten?</span> </p>
<!-- Nachricht --> <p><label>Nachricht:<br> <textarea name="nachricht" minlength="25" required></textarea></label> <span class="hilfetext">Hier haben Sie Platz für die Nachricht.</span> </p>
✔ Sollte der Versandt mal nicht über SMTP funktionieren, so können die Zeilen
31 bis 39 gelöscht werden, der Mail versant läuft dann trotzdem über dem PHPMailer.
Voraussetzungen
Webserver mit PHP 8.0 (oder höher) und Kenntnisse in HTML, CSS und PHP um die Scripte
den eigenen Wünschen (siehe: Code-Snippets) anpassen zu können.
Die E-Mail-Adressen, "SMTP Host", "SMTP Benutzername", "SMTP Passwort" und ,
"SMTP Port", müssen angepasst werden. Außerdem die Dateien: "danke.php" und "fehler.php".
Einige Code-Snippets, zum individuellen einfügen in das Kontaktformular.
Die Snippets müssen an der "richtigen Stelle" eingefügt werden. Teilweise sind Zeilennumern hervorgehoben
1 was da besonders wichtig ist.
// Kopie der Nachricht an den Benutzer senden
$mail->ClearAllRecipients(); // Empfänger löschen
//$mail->ClearAttachments(); // Dateianhänge löschen
// Absender
// Hier muss beim Provider eine bekannte E-Mail-Adresse eingetragen sein, weil "externe"
// E-Mail-Adressen vom Provider gesperrt werden (SPF) und dies zu einer Ablehnung führt.
// Bei automatischen Antworten wird oft eine: noreply@...-Adresse verwendet.
$mail->setFrom("noreply@example.com", "John Doe");
// Absender
// Hier muss beim Provider eine bekannte E-Mail-Adresse eingetragen sein, weil "externe" E-Mail-Adressen vom
// Provider gesperrt werden und dies zur Ablehnung der Versendung der E-Mail durch den Provider führt.
$mail->setFrom("noreply@example.com", "John Doe");
// Empfänger
// Namen über ein Formular holen oder aus einer Datenbank
$mail->addAddress($_POST["mail"], $_POST["name"]);
// Betreff
$mail->Subject = "Example.com - E-Mail mit Anlagen";
In der Anlage zu dieser E-Mail befinden sich Ihre Rechnungen (PDF-Format).
Mit freundlichen Grüßen
John Doe
";
// Inhalt der E-Mail setzen
$mail->Body = $Antwort;
// Anlagen hinzufügen mit optionalem Namen
// Die Namen der Dateien können z.B. aus einer Datenbank geholt werden.
$mail->addAttachment("rechnung1.pdf", "neue_rechnung.pdf");
$mail->addAttachment("rechnung2.pdf");
// In der Datei: "html_vorlage.html" befinden sich Platzhalter wie:
// {:DATUM:}, {:NAME:}, {:BETREFF:}, {:EMAIL:}
$Inhalt = file_get_contents("html_vorlage.html");
Vielen Dank,
wir werden Ihre Anfrage umgehend beantworten.
Mit freundlichen Grüßen
John Doe
";
// Inhalt der E-Mail setzen
$mail->Body = $Antwort;
// Senden
$mail->send();
// Weiterleitung an die Seite: danke.php
// Der Name des Empfängers wird über GET mitgegeben
header("Location: " . $dankeSeite . '?' .
http_build_query(['absenderName' =>$_POST["name"]]));
exit;
// ...
?>
<!-- Datei: danke.php -->
<p>Vielen Dank
<?php
if (isset($_GET["absenderName"])) {
echo htmlspecialchars($_GET["absenderName"]);
}
?>
// Nutzungsbedingungen (Checkbox / reqired)
echo $_POST["nutzungsbedingungen"]; // z.B.: ja
// Persönliche Beratung (Checkbox / optional)
if (isset($_POST["beratung"])) {
echo "Ich wünsche eine Persönliche Beratung";
}
// ...
}
?> <!DOCTYPE html> <html lang="de">
<!-- ... -->
<!-- Datum --> <p><label>Datum:<br> <input type="date" name="datum" required></label> <span class="hilfetext">Wählen Sie ein Datum aus.</span> </p>
<!-- Uhrzeit --> <p><label>Uhrzeit:<br> <input type="time" name="uhr" required></label> <span class="hilfetext">Wählen Sie eine Uhrzeit aus.</span> </p>
<!-- Datum und Uhrzeit --> <p><label>Datum und Uhrzeit:<br> <input type="datetime-local" name="datum_uhr" required></label> <span class="hilfetext">Wählen Sie ein Datum und eine Uhrzeit aus.</span> </p>
<!-- Woche --> <p><label>Woche:<br> <input type="week" name="woche" required></label> <span class="hilfetext">Wählen Sie eine Woche und ein Jahr aus.</span> </p>
<!-- Internetadresse --> <p><label>Internetadresse:<br> <input type="url" name="internetadresse" required placeholder="https://"></label> <span class="hilfetext">Geben Sie Ihre Internetadresse ein.</span> </p>
<!-- Telefonnummer --> <p><label>Telefonnummer:<br> <input type="tel" name="telefon" required></label> <span class="hilfetext">Geben Sie Ihre Telefonnummer ein.</span> </p>
<!-- Betrag in Euro --> <p><label>Betrag in Euro:<br> <input type="number" name="betrag" min="10" max="100" step="10" required></label> <span class="hilfetext">Geben Sie Ihren Betrag in Euro ein.</span> </p>
$mail->addAddress($user['email'], $user['name']);
$mail->Body = "<h2>Hallo, {$user['name']}!</h2><p>Wie geht es dir?</p>";
$mail->AltBody = "Hallo, {$user['name']}! \n Wie geht es dir?";
// Setzt Zeilenumbruch auf 50 Zeichen (teilt keine Wörter)
$mail->WordWrap = 50;
// HTML
$mail->IsHTML(true);
$mail->Body = '<h1>Test 1 von phpMailer HTML</h1><p>Das ist ein Test</p>';
// Altbody enthält die alternative Textform
$mail->AltBody = 'Dies ist eine alternative Textform.';
$mail->AltBody = strip_tags($mail->Body); // Mit strip_tags() werden HTML-Tags entfernt
// HTML - Eingebettete Bilder
$mail->Body = '<h1>Test 2</h1><img src="cid:TBP" alt="Wortbergen"> ';
$mail->AddEmbeddedImage('top.jpg', 'TBP', 'oben.jpg'); // TBP = Platzhalter mit optionalem Namen
// Separate HTML-Datei hinzufügen, __DIR__ ist Optional
$mail->msgHTML(file_get_contents("contents.html"), __DIR__);
// Anlagen
// Text aus einer Variable als Anlage (Attachment) hinzufügen
$mail->addStringAttachment("Hallo Welt", "attachment.txt", "UTF-8", "text/plain");
// Um eine Anlage aus der Zeichenfolge hinzuzufügen, verwenden Sie den Befehl
// addStringAttachment(). Sie sollten den Inhalt und den Dateinamen übergeben:
$mysql_data = $mysql_row["blob_data"];
$mail->addStringAttachment($mysql_data, "db_data.db");
// Anlagen hinzufügen mit optionalem Namen
$mail->addAttachment("rechnung.pdf", "neue_rechnung.pdf");
// Anlagen (Attachments) entfernen - Falls über eine Instanz von phpMailer Mails
// mit unterschiedlichen Anlagen verschickt werden sollen.
$mail->ClearAttachments();
// Löscht alle Empfänger, die im TO-Array zugewiesen sind
$mail->ClearAddresses();
// Löscht alle Empfänger, die im TO-, CC- und BCC-Array zugewiesen sind
$mail->ClearAllRecipients();
// Löscht alle Empfänger, die im BCC-Array zugewiesen sind
$mail->ClearBCCs();
// Löscht alle Empfänger, die im CC-Array zugewiesen sind
$mail->ClearCCs();
// Löscht alle Rücksendungen, die im Array zugewiesen sind
$mail->ClearReplyTos();
// Port - Postausgangsserver (SMTP)
$mail->Port = 465; // Port - Postausgangsserver (SMTP)
// Lokalisierung von Fehlermeldungen
// Legen Sie die Sprache mithilfe einer Standardübersetzung auf Deutsch fest.
$mail->setLanguage("de");
// Wenn beim Senden von E-Mails über einen SMTP-Server Probleme auftreten,
// hilft der Befehl SMTPDebug, herauszufinden was behoben werden sollte.
$mail->SMTPDebug = 2; // 2 = Standard-Einstellung
// Wenn die E-Mail nicht gesendet werden konnte
$mail->ErrorInfo;