Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

PHPMailer: E-Mails mit PHP per SMTP sicher versenden

Sie befinden sich: Home > Php Tutorial > PHPMailer: E-Mails mit PHP ...

PHPMailer: E-Mails mit PHP per SMTP sicher versenden


Eintrag am:  26.04.2026
Hits / Besucher:  24
Sprache:  Deutsch
Kategorie:  Fortgeschrittene Tut...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung
Die in PHP eingebaute Funktion mail() bereitet in der Praxis häufig Probleme. Auf vielen Shared-Hosting-Servern ist sie eingeschränkt oder gar nicht verfügbar, E-Mails landen im Spam-Ordner und eine zuverlässige Fehlerbehandlung fehlt komplett. PHPMailer löst diese Schwierigkeiten als bewährte Open-Source-Bibliothek, die E-Mails über authentifizierte SMTP-Verbindungen versendet. Dieses Tutorial zeigt die Installation per Composer und manuell, die vollständige SMTP-Konfiguration, den Versand von HTML-Mails mit Anhängen sowie die richtige Fehlerbehandlung mit Exceptions.

Illustration zum Tutorial: PHPMailer: E-Mails mit PHP per SMTP sicher versenden

Bevor es an Installation und Code geht, lohnt sich ein kurzer Überblick über die Bibliothek und ihre Vorteile gegenüber der nativen mail()-Funktion.

Was ist PHPMailer?

PHPMailer ist eine weit verbreitete PHP-Bibliothek für den E-Mail-Versand, die auf GitHub als Open-Source-Projekt gepflegt wird. Im Gegensatz zur nativen mail() Funktion unterstützt PHPMailer SMTP-Authentifizierung, TLS- und SSL-Verschlüsselung, HTML-Mails, Anhänge, eingebettete Bilder sowie CC und BCC. Die Bibliothek validiert E-Mail-Adressen automatisch und bietet eine strukturierte Fehlerbehandlung über Exceptions. Da PHPMailer direkt mit einem SMTP-Server kommuniziert, ist kein lokal konfigurierter Mailserver wie Sendmail nötig. Das macht den Versand deutlich zuverlässiger und reduziert die Wahrscheinlichkeit, dass E-Mails als Spam eingestuft werden.

PHPMailer installieren

Die Installation von PHPMailer kann auf zwei Wegen erfolgen. Die empfohlene Methode ist Composer, alternativ steht eine manuelle Installation zur Verfügung.

Installation mit Composer

Composer ist der Paketmanager für PHP und ermöglicht die Installation mit einem einzigen Befehl.

<?php

/* Composer-Befehl im Terminal ausführen: */
/* composer require phpmailer/phpmailer */

/* Danach im PHP-Skript einbinden: */
require_once 'vendor/autoload.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

Der Befehl composer require phpmailer/phpmailer lädt die Bibliothek herunter und erzeugt die Datei vendor/autoload.php. Durch das Einbinden dieser Datei stehen alle PHPMailer-Klassen automatisch zur Verfügung. Der Parameter true im Konstruktor aktiviert den Exception-Modus, sodass Fehler nicht still verschluckt werden.

Manuelle Installation ohne Composer

Auf Shared-Hosting-Systemen ohne Composer-Zugang lässt sich PHPMailer auch manuell installieren. Dazu werden die Quelldateien von GitHub heruntergeladen und direkt eingebunden.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

/* Alle drei Dateien müssen eingebunden werden */
require_once 'PHPMailer/src/PHPMailer.php';
require_once 'PHPMailer/src/SMTP.php';
require_once 'PHPMailer/src/Exception.php';

$mail = new PHPMailer(true);

Wichtig ist, dass alle drei Dateien PHPMailer.php, SMTP.php und Exception.php eingebunden werden. Fehlt eine dieser Dateien, wirft PHP einen fatalen Fehler. Die Pfade müssen an die tatsächliche Verzeichnisstruktur angepasst werden.

SMTP-Konfiguration

Bevor eine E-Mail gesendet werden kann, muss PHPMailer mit den Zugangsdaten des SMTP-Servers konfiguriert werden. Die Verschlüsselung spielt dabei eine zentrale Rolle für die Sicherheit.

Das folgende Diagramm zeigt den Ablauf vom PHP-Skript bis zur Zustellung der E-Mail.

flowchart TD
    A["PHP-Skript"] --> B["PHPMailer-Instanz erstellen"]
    B --> C["SMTP konfigurieren"]
    C --> D["Absender und Empfänger setzen"]
    D --> E["Betreff und Inhalt setzen"]
    E --> F{"Anhänge vorhanden?"}
    F -->|Ja| G["addAttachment()"]
    F -->|Nein| H["send()"]
    G --> H
    H --> I{"Erfolgreich?"}
    I -->|Ja| J["E-Mail zugestellt"]
    I -->|Nein| K["Exception: ErrorInfo auslesen"]

Für die Verschlüsselung stehen zwei Optionen zur Verfügung: TLS über Port 587 ist der empfohlene Standard und wird von den meisten Anbietern bevorzugt. SSL über Port 465 ist eine ältere Variante, die jedoch weiterhin von einigen Mailservern vorausgesetzt wird. Die Einstellung SMTPSecure muss immer zum gewählten Port passen, da die Verbindung sonst fehlschlägt.

Eine einfache E-Mail versenden

Mit einer konfigurierten PHPMailer-Instanz lässt sich eine einfache Klartext-E-Mail in wenigen Zeilen versenden. Das folgende Beispiel zeigt die vollständige SMTP-Konfiguration mit Fehlerbehandlung.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
/* SMTP-Konfiguration */
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'mein_passwort';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';

/* Absender und Empfänger */
$mail->setFrom('user@example.com', 'Max Mustermann');
$mail->addAddress('empfaenger@example.com', 'Empfänger');

/* Inhalt */
$mail->Subject = 'Testmail';
$mail->Body = 'Hallo, das ist eine Testnachricht per PHPMailer.';

$mail->send();
echo 'E-Mail wurde erfolgreich gesendet.';
} catch (Exception $e) {
echo 'Fehler beim Versand: ' . $mail->ErrorInfo;
}

Die Methode isSMTP() aktiviert den SMTP-Transport. Die Eigenschaft SMTPAuth sorgt dafür, dass sich PHPMailer mit Benutzername und Passwort am Server anmeldet. Ohne CharSet = 'UTF-8' werden Umlaute in der E-Mail falsch dargestellt. Der try-catch Block fängt alle Fehler ab und gibt über ErrorInfo eine detaillierte Fehlerbeschreibung aus.

HTML-E-Mails versenden

PHPMailer unterstützt den Versand von HTML-E-Mails mit formatiertem Inhalt. Zusätzlich sollte immer ein AltBody als Klartext-Fallback definiert werden.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
/* SMTP-Konfiguration (wie oben) */
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'mein_passwort';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';

$mail->setFrom('user@example.com', 'Mein Shop');
$mail->addAddress('kunde@example.com', 'Kunde');

/* HTML-Modus aktivieren */
$mail->isHTML(true);
$mail->Subject = 'Willkommen bei Mein Shop!';
$mail->Body = '<h1>Willkommen!</h1>'
. '<p>Danke für Ihre Anmeldung.</p>'
. '<p>Ihr Team von <strong>Mein Shop</strong></p>';
$mail->AltBody = 'Willkommen! Danke fuer Ihre Anmeldung. Ihr Team von Mein Shop';

$mail->send();
echo 'HTML-Mail wurde gesendet.';
} catch (Exception $e) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
}

Die Methode isHTML(true) schaltet den HTML-Modus ein. Die Eigenschaft Body enthält den HTML-Inhalt, während AltBody die Klartext-Version für E-Mail-Clients bereitstellt, die kein HTML darstellen können. Ohne AltBody zeigen manche Clients gar keinen Inhalt an, weshalb diese Eigenschaft nie ausgelassen werden sollte.

E-Mails mit Anhängen versenden

Mit der Methode addAttachment() lassen sich beliebig viele Dateien an eine E-Mail anhängen. PHPMailer unterstützt sowohl Dateiverweise als auch eingebettete Bilder.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
/* SMTP-Konfiguration */
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'mein_passwort';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';

$mail->setFrom('user@example.com', 'Rechnungsabteilung');
$mail->addAddress('kunde@example.com');

/* Anhänge hinzufügen */
$mail->addAttachment('/pfad/zur/rechnung.pdf', 'Rechnung_2025.pdf');
$mail->addAttachment('/pfad/zum/logo.png');

/* Eingebettetes Bild für HTML-Body */
$mail->addEmbeddedImage('/pfad/zum/header.jpg', 'header_bild');

$mail->isHTML(true);
$mail->Subject = 'Ihre Rechnung';
$mail->Body = '<img src="cid:header_bild" alt="Header">'
. '<p>Im Anhang finden Sie Ihre Rechnung.</p>';
$mail->AltBody = 'Im Anhang finden Sie Ihre Rechnung.';

$mail->send();
echo 'E-Mail mit Anhang wurde gesendet.';
} catch (Exception $e) {
echo 'Fehler: ' . $mail->ErrorInfo;
}

Der erste Parameter von addAttachment() ist der Dateipfad, der optionale zweite Parameter legt den Dateinamen fest, unter dem der Empfänger die Datei sieht. Die Methode addEmbeddedImage() bindet ein Bild direkt in den HTML-Body ein. Im HTML wird es über cid: und die vergebene ID referenziert. So erscheint das Bild direkt im Text statt als separater Anhang.

Mehrere Empfänger, CC und BCC

PHPMailer ermöglicht den Versand an mehrere Empfänger gleichzeitig, wobei sich CC- und BCC-Adressen getrennt hinzufügen lassen.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'mein_passwort';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->CharSet = 'UTF-8';

$mail->setFrom('user@example.com', 'Team');

/* Mehrere Empfänger */
$mail->addAddress('anna@example.com', 'Anna');
$mail->addAddress('ben@example.com', 'Ben');

/* CC und BCC */
$mail->addCC('chef@example.com', 'Chef');
$mail->addBCC('archiv@example.com');

/* Reply-To-Adresse */
$mail->addReplyTo('support@example.com', 'Support');

$mail->Subject = 'Teambesprechung';
$mail->Body = 'Die nächste Besprechung findet am Freitag statt.';

$mail->send();
echo 'E-Mail an alle Empfänger gesendet.';
} catch (Exception $e) {
echo 'Fehler: ' . $mail->ErrorInfo;
}

Die Methode addAddress() kann mehrfach aufgerufen werden, um weitere Empfänger hinzuzufügen. Mit addCC() erhalten Personen eine sichtbare Kopie, während addBCC() eine unsichtbare Blindkopie versendet. Die Methode addReplyTo() legt fest, an welche Adresse Antworten gerichtet werden sollen.

Fehlerbehandlung und Debugging

Eine solide Fehlerbehandlung ist beim E-Mail-Versand unverzichtbar. PHPMailer bietet dafür den Exception-Modus und verschiedene Debug-Stufen für die SMTP-Kommunikation.

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once 'vendor/autoload.php';

$mail = new PHPMailer(true);

try {
/* Debug-Level setzen */
/* SMTP::DEBUG_OFF = 0 (keine Ausgabe) */
/* SMTP::DEBUG_CLIENT = 1 (nur Client-Befehle) */
/* SMTP::DEBUG_SERVER = 2 (Client und Server, empfohlen) */
$mail->SMTPDebug = SMTP::DEBUG_SERVER;

$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'user@example.com';
$mail->Password = 'mein_passwort';
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

$mail->setFrom('user@example.com');
$mail->addAddress('empfaenger@example.com');
$mail->Subject = 'Debug-Test';
$mail->Body = 'Diese E-Mail dient zum Testen der SMTP-Verbindung.';

$mail->send();
echo 'Versand erfolgreich.';
} catch (Exception $e) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
}

Der Debug-Level SMTP::DEBUG_SERVER gibt die gesamte Kommunikation zwischen PHPMailer und dem SMTP-Server aus. So lassen sich Probleme wie falsche Zugangsdaten, abgelehnte Verbindungen oder Zertifikatsfehler schnell identifizieren. Im Produktivbetrieb sollte SMTPDebug immer auf SMTP::DEBUG_OFF stehen, damit keine sensiblen Daten im Frontend ausgegeben werden. Die Eigenschaft ErrorInfo enthält nach einem fehlgeschlagenen Versand die Fehlermeldung des SMTP-Servers und ist auch ohne aktiviertes Debugging verfügbar.

PHPMailer mit Gmail, GMX und anderen Anbietern

PHPMailer funktioniert mit allen gängigen E-Mail-Anbietern. Die Konfiguration unterscheidet sich jeweils nur in den SMTP-Zugangsdaten und Ports.

Für Gmail ist zu beachten, dass ein App-Passwort benötigt wird und nicht das normale Kontopasswort. Die Zwei-Faktor-Authentifizierung muss dafür aktiviert sein. Der SMTP-Host lautet smtp.gmail.com mit Port 587 und TLS-Verschlüsselung. Bei GMX lautet der Host mail.gmx.net und der Login erfolgt mit der vollständigen E-Mail-Adresse. Auch dort wird Port 587 mit STARTTLS empfohlen. Für andere Anbieter wie Outlook (smtp-mail.outlook.com) oder eigene Mailserver gelten die jeweiligen SMTP-Daten, die im Konto des Anbieters oder bei der Serveradministration zu finden sind.

Fazit

PHPMailer ist die zuverlässige Alternative zur nativen mail() Funktion in PHP. Die Bibliothek lässt sich per Composer oder manuell installieren und bietet mit SMTP-Authentifizierung, TLS-Verschlüsselung und strukturierter Fehlerbehandlung alles, was für professionellen E-Mail-Versand nötig ist. HTML-Mails mit isHTML(true) und einem AltBody als Klartext-Fallback erreichen alle Empfänger zuverlässig. Anhänge und eingebettete Bilder lassen sich mit addAttachment() und addEmbeddedImage() hinzufügen. Die Kombination aus Exception-Modus durch new PHPMailer(true) und der Eigenschaft SMTPDebug erleichtert die Fehlersuche erheblich. Für den Produktivbetrieb sollte TLS über Port 587 gewählt und das Debugging deaktiviert werden. Bei Gmail und anderen Anbietern mit Zwei-Faktor-Authentifizierung ist ein App-Passwort zwingend erforderlich.

 


Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.