PHPMailer-Guide: Konfiguration, SMTP-Einrichtung und E-Mail-Versand

On Juli 30, 2025
13min read
Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Ivan Djuric Technical Content Writer @Mailtrap

Wenn es darum geht, Ihrer PHP-App E-Mail-Funktionalität hinzuzufügen, ist die PHPMailer-Klasse die erste Wahl.

In diesem Artikel beschreibe ich Schritt für Schritt den Prozess der Installation von PHPMailer, der Konfiguration von SMTP-Einstellungen und dem Hinzufügen von E-Mail-Versandfunktionen zu Ihrer App.

Um direkt zur Sache zu kommen, klicken Sie hier.

Die Code-Snippets, die ich in diesem Artikel bereitstelle, sind für PHPMailer 6.9, das mit PHP 5.5 und höher kompatibel ist.

Sind Sie bereit, Ihre E-Mails zuzustellen?
Mailtrap kostenlos testen

Was ist PHPMailer?

PHPMailer ist die klassische Open-Source-Bibliothek zum Senden von E-Mails für PHP. Sie ist mit den meisten PHP-Frameworks kompatibel, wie Laravel und Symfony, und wird von vielen Open-Source-Projekten wie WordPress verwendet. Sie unterstützt auch mehrere Methoden zum Senden von E-Mail-Nachrichten, einschließlich der zuverlässigsten, dem direkten Versand an SMTP-Server, sowie der PHP mail()-Funktion, Sendmail und qmail.

Einige der wichtigsten PHPMailer-Funktionen umfassen:

  • SMTP-Authentifizierung
  • Automatische E-Mail-Adressvalidierung
  • Schutz vor Header-Injection-Angriffen
  • Unterstützung der Protokolle TLS und SSL
  • Unterstützung für DKIM- und S/MIME-Signierung
  • Unterstützung für eingebettete Bilder
  • Unterstützung für das Hinzufügen von Anhängen, einschließlich Inline
  • Mehrere Formate, Zeichenketten- und Binäranhänge
  • Multipart/alternative E-Mails für Clients, die keine HTML-E-Mails lesen
  • Unterstützung für das Senden von E-Mails mit mehreren An-, CC-, BCC– und Antwort-an-Adressen

So installieren Sie PHPMailer

Um PHPMailer zu installieren, benötigen Sie Composer, einen Abhängigkeitsmanager für PHP, der von den PHPMailer-Entwicklern auf GitHub empfohlen wird.

Nach der Installation fügen Sie diese Zeile zu Ihrer Datei composer.json hinzu:

"phpmailer/phpmailer": "^6.9"

Oder führen Sie den folgenden Befehl aus:

composer require phpmailer/phpmailer

Hinweis:

  • Der Ordner vendor und das Skript vendor/autoload.php sind nicht Teil von PHPMailer. Sie werden stattdessen von Composer generiert.

Wenn Sie kein Fan von Composer sind, können Sie PHPMailer-Dateien mit Quellcode manuell herunterladen und den Inhalt des Ordners in ein in Ihrer PHP-Konfiguration angegebenes include_path-Verzeichnis kopieren und jede Klassendatei manuell laden, wie folgt:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

Das Hinzufügen einer Exception-Klasse hilft Ihnen, Fehler zu behandeln und zu debuggen. In PHP funktioniert dies ähnlich wie in anderen Programmiersprachen. Ohne sie sehen Sie bei einem Fehler in Ihrem E-Mail-Versandcode nur eine Meldung, dass die Exception-Klasse nicht gefunden wurde, erhalten aber keine Details zur Fehlerbehebung.

Sie können PHPMailer auch nur mit den wichtigsten Dateien installieren. Die wichtigsten PHP-Dateien sind src/PHPmailer.php und src/SMTP.php, wenn Sie SMTP verwenden. Sie benötigen auch src/OAuth.php, wenn Sie XOAUTH2 verwenden, sowie die Abhängigkeiten für die Dienste, mit denen Sie sich authentifizieren möchten. Und Sie können den language-Ordner überspringen, wenn Sie mit Fehlermeldungen nur auf Englisch einverstanden sind.

Weitere Informationen zur Installation von PHPMailer finden Sie im offiziellen Installationshandbuch.

PHPMailer SMTP-Einstellungen

Das Senden von E-Mails mit PHPMailer ist am optimalsten, wenn es mit einem externen SMTP-Server gekoppelt wird. Dies macht es zuverlässig und sicher, da es verschlüsselt werden kann (TLS/SSL), was es zu einer idealen Wahl für Ihre PHP-Anwendung macht.

Sehen Sie sich die grundlegende SMTP-Konfiguration im folgenden Beispiel an:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Passen Sie den Pfad bei Bedarf an, wenn Sie Composer nicht verwenden

$mail = new PHPMailer(true);

try {
    //Servereinstellungen
    $mail->isSMTP();                                      // Senden über SMTP
    $mail->Host       = 'smtp.beispiel.com';              // Den zu sendenden SMTP-Server festlegen
    $mail->SMTPAuth   = true;                             // SMTP-Authentifizierung aktivieren
    $mail->Username   = 'ihre_email@beispiel.com';        // SMTP-Benutzername
    $mail->Password   = 'ihr_passwort';                   // SMTP-Passwort
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;    // TLS-Verschlüsselung aktivieren; `PHPMailer::ENCRYPTION_SMTPS` ebenfalls akzeptiert
    $mail->Port       = 587;                              // TCP-Port, zu dem eine Verbindung hergestellt werden soll

Sobald Sie Ihre SMTP-Details und Anmeldeinformationen haben, müssen Sie nur noch die Platzhalter in diesem Code durch diese ersetzen, was ich Ihnen im folgenden Kapitel zeigen werde.

So senden Sie E-Mails mit PHPMailer und SMTP

Für das Senden von E-Mails mit PHPMailer habe ich mich für den E-Mail-Versand SMTP von Mailtrap entschieden, da dieser von Haus aus hohe Zustellraten bietet. Außerdem ermöglicht Mailtrap es mir, meine E-Mails zu testen, bevor ich sie versende (ich werde dies später im Artikel beschreiben), und es ist super einfach zu konfigurieren.

So funktioniert es:

  • Navigieren Sie zum Fenster SMTP/API Settings (SMTP/API-Einstellungen) unter Sending Domains (Sendedomänen), wo Sie die SMTP-Anmeldeinformationen finden. Bitte beachten Sie, dass das Senden über API mit PHPMailer nicht funktioniert.
Screenshot of Mailtrap SMTPI/API Settings.
  • Kopieren Sie die Anmeldeinformationen des Transactional Streams und fügen Sie sie in Ihr PHP-Skript ein.

Und so können Sie reine Text-E-Mails mit Ihren Mailtrap-SMTP-Anmeldeinformationen senden:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Anpassen je nach Installationsmethode

$mail = new PHPMailer(true); // Ausnahmen aktivieren

// SMTP-Konfiguration
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io'; // Ihr SMTP-Server
$mail->SMTPAuth = true;
$mail->Username = 'IhrMailtrapBenutzername'; // Ihr Mailtrap-Benutzername
$mail->Password = 'IhrMailtrapPasswort'; // Ihr Mailtrap-Passwort
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

// Absender- und Empfängereinstellungen
$mail->setFrom('von@beispiel.com', 'Absendername');
$mail->addAddress('empfaenger@beispiel.com', 'Empfängername');

// Senden einer reinen Text-E-Mail
$mail->isHTML(false); // E-Mail-Format auf reinen Text setzen
$mail->Subject = 'Ihr Betreff hier';
$mail->Body    = 'Dies ist der reine Textkörper der Nachricht';

// Die E-Mail senden
if(!$mail->send()){
    echo 'Nachricht konnte nicht gesendet werden. Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Nachricht wurde gesendet';
}

Stellen Sie sicher, dass Ihre isHTML-Methode für das Senden von reinen Text-E-Mails auf „false“ gesetzt ist.

HTML-E-Mails senden

Tauchen Sie tiefer in die Anpassung von HTML-E-Mails in PHP ein, indem Sie unseren speziellen Artikel lesen.

Um eine HTML-E-Mail zu senden, setzen Sie einfach die Eigenschaft isHTML auf (true), wie im folgenden Beispiel:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/composer/vendor/autoload.php'; // Stellen Sie sicher, dass der Pfad korrekt ist

$mail = new PHPMailer(true); // Das Übergeben von „true“` aktiviert Ausnahmen

try {
    $mail->isSMTP();
    $mail->Host = 'live.smtp.mailtrap.io'; // Ihr SMTP-Server
    $mail->SMTPAuth = true;
    $mail->Username = 'IhrMailtrapBenutzername'; // Ihr Mailtrap-Benutzername
    $mail->Password = 'IhrMailtrapPasswort'; // Ihr Mailtrap-Passwort
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;

    // Absender- und Empfängereinstellungen
    $mail->setFrom('info@mailtrap.io', 'Mailtrap');
    $mail->addReplyTo('info@mailtrap.io', 'Mailtrap');
    $mail->addAddress('empfaenger1@mailtrap.io', 'Tim'); // Hauptempfänger
    // CC und BCC
    $mail->addCC('cc1@beispiel.com', 'Elena');
    $mail->addBCC('bcc1@beispiel.com', 'Alex');
    // Weitere BCC-Empfänger hinzufügen
    $mail->addBCC('bcc2@beispiel.com', 'Anna');
    $mail->addBCC('bcc3@beispiel.com', 'Mark');

    // E-Mail-Inhalt
    $mail->isHTML(true); // E-Mail-Format auf HTML setzen
    $mail->Subject = "PHPMailer SMTP-Test";
    $mail->Body = '<h1>HTML-E-Mail mit SMTP in PHP senden</h1><p>Dies ist eine Test-E-Mail, die ich mit PHPMailer über einen SMTP-Mailserver sende.</p>'; // Beispiel HTML-Textkörper
    $mail->AltBody = 'Dies ist die reine Textversion des E-Mail-Inhalts';

    if(!$mail->send()) {
        echo 'Nachricht konnte nicht gesendet werden.';
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        echo 'Nachricht wurde gesendet';
    }
} catch (Exception $e) {
    echo "Nachricht konnte nicht gesendet werden. Mailer Error: {$mail->ErrorInfo}";
}
?>

So senden Sie E-Mails an mehrere Empfänger

Um E-Mails an mehrere Empfänger zu senden, können Sie das folgende Code-Snippet verwenden:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = '1a2b3c4d5e6f7g'; //von Mailtrap generiert
$mail->Password = '1a2b3c4d5e6f7g'; //von Mailtrap generiert
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->SMTPKeepAlive = true; // hinzufügen, um die SMTP-Verbindung nach jeder gesendeten E-Mail offen zu halten
$mail->setFrom('liste@beispiel.com', 'Listenmanager');
$mail->Subject = "Neue Mailtrap Mailingliste";
$users = [
  ['email' => 'max@gmail.com', 'name' => 'Max'],
  ['email' => 'box@beispiel.com', 'name' => 'Bob']
];
foreach ($users as $user) {
  $mail->addAddress($user['email'], $user['name']);
  $mail->Body = "<h2>Hallo, {$user['name']}!</h2> <p>Wie geht es Ihnen?</p>";
    $mail->AltBody = "Hallo, {$user['name']}! \n Wie geht es Ihnen?";
  try {
      $mail->send();
      echo "Nachricht gesendet an: ({$user['email']}) {$mail->ErrorInfo}\n";
  } catch (Exception $e) {
      echo "Mailer Error ({$user['email']}) {$mail->ErrorInfo}\n";
  }
  $mail->clearAddresses();
}
$mail->smtpClose();

E-Mails mit Anhängen senden

Für das Senden von E-Mails mit Anhängen können Sie:

  • Eine Datei von Ihrem Dateisystem anhängen

Wenn Sie sich für diese Option entscheiden, stellen Sie sicher, dass Ihre Dateien im selben Verzeichnis wie das Skript gespeichert sind.

Um eine Datei anzuhängen, geben Sie einfach ihren Dateipfad an. Sie können auch einen Dateinamen hinzufügen, aber das liegt bei Ihnen, da das Skript den tatsächlichen Namen Ihrer Datei verwenden wird:

$mail->addAttachment('pfad/zu/rechnung1.pdf', 'rechnung1.pdf');

Wenn Sie dieses Skript aufrufen, hängt PHPMailer die Datei unter pfad/zu/rechnung1.pdf an die E-Mail an. Der zweite Parameter, rechnung1.pdf, ist optional und gibt den Dateinamen an. Für dieses Beispiel habe ich .pdf verwendet, aber denken Sie daran, dass Sie auch andere Dateitypen hinzufügen können, wie zum Beispiel Bilder (.jpg oder .png).

Um eine weitere Datei hinzuzufügen, wiederholen Sie einfach den Befehl:

$mail->addAttachment('pfad/zu/kalkulation1.xlsx', 'kalkulation1.xlsx');
  • Einen Zeichenkettenanhang hinzufügen

Indem Sie einen Zeichenkettenanhang hinzufügen, hängen Sie Daten an, ohne sie zuerst als physische Datei auf Ihrem System speichern zu müssen. Das bedeutet, die angehängten Daten werden in einer Variablen gespeichert. Dies ermöglicht es Ihnen beispielsweise, eine Datei aus einer Datenbank zu extrahieren, wie z. B. ein BLOB (Binary Large Object), ohne sie als Datei speichern zu müssen.

Dafür können Sie den folgenden Befehl verwenden:

$mysql_data = $mysql_row['blob_data'];
$mail->addStringAttachment($mysql_data, 'db_data.db');

Dieses Beispiel fügt Daten an, die als BLOB aus einer MySQL-Datenbank gespeichert sind.

Sie können auch eine Remote-URL verwenden, wie folgt:

$mail->addStringAttachment(file_get_contents($url), 'meinedatei.pdf');

Senden von E-Mails mit eingebetteten Bildern

Um E-Mails mit eingebetteten Bildern zu senden, können Sie CID-Anhänge verwenden:

$mail->addEmbeddedImage('pfad/zu/bilddatei.jpg', 'image_cid');
$mail->isHTML(true);
$mail->Body = '<img src="cid:image_cid">';

Und so sieht es in einem vollständigen Code-Snippet aus:

<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'path/to/composer/vendor/autoload.php';

$mail = new PHPMailer(true); // Exception hinzugefügt

$mail->isSMTP();
$mail->Host = 'live.smtp.mailtrap.io';
$mail->SMTPAuth = true;
$mail->Username = 'IhrMailtrapBenutzername';
$mail->Password = 'IhrMailtrapPasswort';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;

$mail->setFrom('von@beispiel.com', 'Vorname Nachname');
$mail->addReplyTo('antwortan@beispiel.com', 'Max Mustermann');
$mail->addAddress('empfaenger@beispiel.com', 'Empfängername'); // Den Empfänger angeben

$mail->isHTML(true);
$mail->Subject = "PHPMailer SMTP test";
$mail->addEmbeddedImage('pfad/zu/bilddatei.jpg', 'image_cid'); // Den Pfad zu Ihrem Bild und eine CID angeben
$mail->Body = '<img src="cid:image_cid"> E-Mail-Textkörper in HTML'; // Verwenden Sie die CID als src-Attribut in Ihrem img-Tag
$mail->AltBody = 'Dies ist die reine Textversion des E-Mail-Inhalts';

if(!$mail->send()){
    echo 'Nachricht konnte nicht gesendet werden.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}else{
    echo 'Nachricht wurde gesendet';
}

Das Ergebnis „Nachricht wurde gesendet“ informiert Sie darüber, dass Ihr Code korrekt ausgeführt wird. Um das Zustellungsergebnis und Details zu überprüfen, gehen Sie zu Ihrem Mailtrap-Posteingang: Ihre Nachrichten sollten dort in Sekundenschnelle ankommen.

PHPMailer SMTP test

Asynchroner E-Mail-Versand

Im Gegensatz zu Node.js, das asynchrone Operationen unterstützt, ist PHPMailer von Haus aus synchron. Dennoch können Sie die Funktion exec() verwenden, um ein PHP-Skript zum Senden von E-Mails im Hintergrund aufzurufen.

Installieren Sie zuerst das PHP CLI (Command Line Interface) und verwenden Sie dann das folgende Skript sendEmail.php:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'pfad/zu/vendor/autoload.php'; // Passen Sie den Pfad bei Bedarf an

$mail = new PHPMailer(true);

// SMTP-Konfiguration
$mail->isSMTP();
$mail->Host = 'smtp.beispiel.com'; // Haupt- und Backup-SMTP-Server angeben
$mail->SMTPAuth = true; // SMTP-Authentifizierung aktivieren
$mail->Username = 'benutzer@beispiel.com'; // SMTP-Benutzername
$mail->Password = 'geheim'; // SMTP-Passwort
$mail->SMTPSecure = 'tls'; // TLS-Verschlüsselung aktivieren; `ssl` wird ebenfalls akzeptiert
$mail->Port = 587; // TCP-Port für die Verbindung

// E-Mail-Einstellungen
$mail->setFrom('von@beispiel.com', 'Mailer');
$mail->addAddress('empfaenger@beispiel.com', 'Empfängername'); // Einen Empfänger hinzufügen
$mail->isHTML(true); // E-Mail-Format auf HTML setzen
$mail->Subject = 'Hier ist der Betreff';
$mail->Body    = 'Dies ist der HTML-Nachrichtentext <b>fett gedruckt!</b>';
$mail->AltBody = 'Dies ist der Textkörper in reinem Text für Nicht-HTML-Mail-Clients';

try {
    $mail->send();
    echo 'Nachricht wurde gesendet';
} catch (Exception $e) {
    echo "Nachricht konnte nicht gesendet werden. Mailer Error: {$mail->ErrorInfo}";
}

Um das Skript auszuführen, verwenden Sie den folgenden Befehl:

exec("php /pfad/zu/sendEmail.php > /dev/null &");

Hinweise:

  • Stellen Sie sicher, dass der Pfad zur PHP CLI-Ausführungsdatei (php) korrekt angegeben ist.
    • In einigen Fällen und Umgebungen müssen Sie möglicherweise den vollständigen Pfad zur CLI-Binärdatei verwenden (z. B. /usr/bin/php).
  • Überprüfen Sie die PHP-Konfiguration Ihres Servers, um sicherzustellen, dass Funktionen wie exec() nicht deaktiviert sind, da dies aus Sicherheitsgründen häufig in Shared-Hosting-Umgebungen der Fall ist.
    • Die dafür zuständige Direktive ist die disable_functions-Direktive in php.ini.

So senden Sie Massen-E-Mails

Um E-Mails gleichzeitig an viele Empfänger in PHPMailer zu senden, verwende ich die Anmeldeinformationen des Massenversand-Streams von Mailtrap.

Sie finden diese, nachdem Sie sich in Ihr Mailtrap-Konto eingeloggt und zu Sending Domains → Tab SMTP/API Settings navigiert haben. Rechts sollten Sie die Anmeldeinformationen des Transactional Stream sehen.

Fügen Sie dann einfach die Anmeldeinformationen in das folgende Skript zum Senden von Massen-E-Mails ein:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Pfad zur Composer-Autoload-Datei

$mail = new PHPMailer(true);

try {
    //Servereinstellungen
    $mail->isSMTP();
    $mail->Host       = 'bulk.smtp.mailtrap.io'; // Den zu sendenden SMTP-Server festlegen
    $mail->SMTPAuth   = true; // SMTP-Authentifizierung aktivieren
    $mail->Username   = 'ihr_smtp_benutzername'; // SMTP-Benutzername
    $mail->Password   = 'ihr_smtp_passwort'; // SMTP-Passwort
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // TLS-Verschlüsselung aktivieren; 
    $mail->Port       = 587; // TCP-Port, zu dem eine Verbindung hergestellt werden soll

    // Absender- und Antwortadresse
    $mail->setFrom('von@beispiel.com', 'Mailer');
    $mail->addReplyTo('antwortan@beispiel.com', 'Mailer');

    // Inhalt
    $mail->isHTML(true); // E-Mail-Format auf HTML setzen
    
    // Empfängerliste
    $recipients = [
        ['email' => 'person1@beispiel.com', 'name' => 'Person Eins'],
        ['email' => 'person2@beispiel.com', 'name' => 'Person Zwei'],
        // Fügen Sie bei Bedarf weitere Empfänger hinzu
    ];

    foreach ($recipients as $recipient) {
        $mail->addAddress($recipient['email'], $recipient['name']); // Einen Empfänger hinzufügen

        // Die Nachricht personalisieren
        $mail->Subject = 'Hier ist der Betreff';
        $mail->Body    = 'Dies ist der HTML-Nachrichtentext <b>fett gedruckt!</b>';
        $mail->AltBody = 'Dies ist der Textkörper in reinem Text für Nicht-HTML-Mail-Clients';

        $mail->send();
        $mail->clearAddresses(); // Adressen für die nächste Iteration löschen
    }

    echo 'Nachrichten wurden gesendet';
} catch (Exception $e) {
    echo "Nachricht konnte nicht gesendet werden. Mailer Error: {$mail->ErrorInfo}";
}

Dieses Skript ermöglicht es Ihnen, E-Mails an mehrere Empfänger zu senden, ohne die SMTP-Verbindung für jede Mail öffnen und schließen zu müssen, was weitaus effizienter ist, als beispielsweise für jede Mail eine neue PHPMailer-Instanz zu erstellen.

Wenn Sie jedoch vorhaben, ein großes Volumen an E-Mails zu versenden, sollten Sie ein Job-Queue-System wie RabbitMQ, Beanstalkd, Redis oder andere verwenden.

Zu Erklärungszwecken zeige ich Ihnen, wie Sie dies mit RabbitMQ tun können.

Aber zuerst installieren wir eine PHP-Bibliothek dafür über Composer:

composer require php-amqplib/php-amqplib

Dann veröffentlicht das Job-Producer-Skript E-Mails in eine RabbitMQ-Warteschlange:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

$emailData = [
    'email' => 'empfaenger@beispiel.com',
    'subject' => 'Test E-Mail',
    'body' => 'Dies ist ein Test-E-Mail-Textkörper.'
];

$msg = new AMQPMessage(json_encode($emailData), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'emailQueue');

echo " [x] E-Mail-Job' gesendet\n";

$channel->close();
$connection->close();

Und schließlich konsumiert das Worker-Skript die Nachrichten aus der Warteschlange und sendet E-Mails:

require 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTPException;

$connection = new AMQPStreamConnection('localhost', 5672, 'user', 'password');
$channel = $connection->channel();

$channel->queue_declare('emailQueue', false, true, false, false);

echo " [*] Auf Nachrichten warten. Zum Beenden STRG+C drücken\n";

$logFile = 'email_protokoll.txt'; // Pfad zu Ihrer Protokolldatei

$callback = function ($msg) use ($logFile) {
    echo " [x] Empfangen ", $msg->body, "\n";
    $emailData = json_decode($msg->body, true);

    $mail = new PHPMailer(true);
    try {
        // SMTP-Einstellungen konfigurieren
        $mail->isSMTP();
        // Ihre SMTP-Konfiguration hier 

        $mail->setFrom('von@beispiel.com', 'Mailer');
        $mail->addAddress($emailData['email']); // Empfänger-E-Mail aus den Job-Daten

        $mail->isHTML(true); // E-Mail-Format auf HTML
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        echo "E-Mail gesendet an {$emailData['email']}\n";
        
        // Erfolgreichen E-Mail-Versand protokollieren
        file_put_contents($logFile, "E-Mail erfolgreich gesendet an {$emailData['email']} um {$emailData['email']} at " . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    } catch (Exception $e) {
        echo "E-Mail konnte nicht gesendet werden. Mailer Error: {$mail->ErrorInfo}\n";
        // Allgemeine Fehler protokollieren
        file_put_contents($logFile, "Fehler beim Senden der E-Mail an {$emailData['email']} um " . date('Y-m-d H:i:s') . ". Fehler: {$mail->ErrorInfo}\n", FILE_APPEND);
    } catch (SMTPException $e) {
        echo "SMTP-Fehler: {$mail->ErrorInfo}\n";
        // SMTP-spezifische Fehler protokollieren
        file_put_contents($logFile, "SMTP-Fehler beim Senden der E-Mail an {$emailData['email']} um " . date('Y-m-d H:i:s') . ". Fehler: {$mail->ErrorInfo}\n", FILE_APPEND);
    }

    $msg->ack();
};

$channel->basic_qos(null, 1, null);
$channel->basic_consume('emailQueue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Tipps:

  • Ersetzen Sie Platzhalterwerte wie localhost, 5672, benutzer, passwort und emailWarteschlange durch Ihre tatsächlichen RabbitMQ-Details und den Warteschlangennamen.
  • Ziehen Sie auch einen Prozessmanager wie zum Beispiel Supervisor in Betracht, um sicherzustellen, dass Ihr Worker-Skript immer läuft und bei Abstürzen automatisch neu gestartet wird.
  • Das Worker-Skript benötigt Ihre spezifischen SMTP-Konfigurationsdetails; in diesem Fall sind es Ihre Anmeldeinformationen für den Massenversand-Stream.

PHPMailer-Debugging

Wenn beim Senden von E-Mails über einen SMTP-Server Probleme auftreten, hilft Ihnen der Befehl SMTPDebug, diese Fehler zu untersuchen und herauszufinden, was behoben werden muss.

Aktivieren Sie das SMTP-Debugging und legen Sie den Debug-Level in Ihrem Skript wie folgt fest:

$mail->SMTPDebug = 2;
  • Level 1 (SMTP::DEBUG_CLIENT) = Client; zeigt Ihnen Nachrichten, die vom Client gesendet wurden
  • Level 2 (SMTP::DEBUG_SERVER) = Client und Server; fügt Servernachrichten hinzu, dies ist die empfohlene Einstellung.
  • Level 3 (SMTP::DEBUG_CONNECTION) = Client, Server und Verbindung; fügt Details zu den anfänglichen Informationen hinzu, was nützlich sein kann, um STARTTLS-Fehler aufzudecken
  • Level 4 (SMTP::DEBUG_LOWLEVEL) = Low-Level-Informationen.

Beispiel 1. Ungültiger SMTP-Hostname

2018-12-12 14:51:32	Connection: opening to mailtrap.io:587, timeout=10, options=array()
2018-12-12 14:51:42	Connection failed. Error #2: stream_socket_client(): unable to connect to mailtrap.io:587 (Operation timed out) [/Users/xxxx/Downloads/PHPMailer/src/SMTP.php line 326]
2018-12-12 14:51:42	SMTP ERROR: Failed to connect to server: Operation timed out (60)
2018-12-12 14:51:42	SMTP connect() failed.

Für dieses Beispiel habe ich einen ungültigen Hostnamen eingegeben: mailtrap.io anstelle von live.smtp.mailtrap.io. Und sofort erhielt ich eine Meldung, dass ein Fehler in der allerersten Phase der Kommunikation mit dem Server aufgetreten ist.

Beispiel 2. Ungültige Anmeldeinformationen

2018-12-12 14:49:26	Connection: opening to live.smtp.mailtrap.io:587, timeout=300, options=array()
2018-12-12 14:49:26	Connection: opened
2018-12-12 14:49:26	SMTP INBOUND: "220 mailtrap.io ESMTP ready"
2018-12-12 14:49:26	SERVER -> CLIENT: 220 mailtrap.io ESMTP ready
...
2018-12-12 14:49:30	SMTP INBOUND: "535 5.7.0 Invalid login or password"
2018-12-12 14:49:30	SERVER -> CLIENT: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP ERROR: Username command failed: 535 5.7.0 Invalid login or password
2018-12-12 14:49:30	SMTP Error: Could not authenticate.
2018-12-12 14:49:30	CLIENT -> SERVER: QUIT
2018-12-12 14:49:30	SMTP INBOUND: "221 2.0.0 Bye"
2018-12-12 14:49:30	SERVER -> CLIENT: 221 2.0.0 Bye
2018-12-12 14:49:30	Connection: closed
2018-12-12 14:49:30	SMTP connect() failed.
Mailer Error: SMTP connect() failed.

Hier zeige ich, wo der Fehler auftritt: Jetzt sind SMTP, Hostname und Port gültig, aber eine Kombination aus Login und Passwort wurde nicht gefunden, daher sollten Sie Ihre Anmeldeinformationen überprüfen und ändern.

Es gibt ein paar detaillierte Artikel auf GitHub über Debugging und Troubleshooting. Lesen Sie diese, wenn Sie tiefer in diese Themen eintauchen müssen. Und wenn Sie den berüchtigten Fehler SMTP Error: Could not connect to SMTP host sehen, gibt es einen speziellen Abschnitt zur Lösung dieses Problems.

Testen Sie Ihre E-Mails und den E-Mail-Versand in einer Staging-Umgebung

Das Versenden Ihrer E-Mails ohne vorheriges Testen wäre wie eine Reise anzutreten, ohne zu überprüfen, ob Sie alles eingepackt haben. Stellen Sie sich vor, Sie stehen am Flughafenterminal und bemerken erst beim Check-in, dass Sie Ihren Pass vergessen haben. 🛂

Etwas Ähnliches kann tatsächlich mit Ihren E-Mails passieren, wenn Sie sie nicht vor dem Versand testen. Zum Beispiel könnten sie Posteingänge überspringen oder als Spam markiert werden, Ihr HTML wird möglicherweise nicht von allen E-Mail-Clients korrekt gerendert, Ihre Personalisierungsvariablen könnten falsch sein usw.

Glücklicherweise haben wir Sie mit der ganzheitlichen Lösung E-Mail-Sandbox von Mailtrap abgedeckt.

Die E-Mail-Sandbox von Mailtrap ermöglichen es Ihnen, den Verkehr von Staging- und Entwicklungsumgebungen abzufangen und dann Ihre E-Mails vor dem Versand in der Vorschau anzuzeigen und deren HTML/CSS zu analysieren.

Mailtrap Email Testing HTML Check feature

Es gibt auch den Spam-Bericht, der Ihnen helfen kann, potenzielle Probleme mit der E-Mail-Zustellbarkeit zu lösen, wenn Sie Ihren Spam-Score unter 5 halten.

Mailtrap Email Testing Spam Analysis feature

Lassen Sie mich Ihnen zeigen, wie es funktioniert.

Um Ihre E-Mails mit einem Fake-SMTP-Server zu testen, gehen Sie zu Email TestingInboxesSMTP Settings (E-Mail-Tests → Posteingänge → SMTP-Einstellungen) und wählen Sie PHPMailer in der Liste der Integrationen aus.

Mailtrap Email Testing SMTP credentials

Fügen Sie dann einfach die Einstellungen in Ihr PHPMailer-Skript ein, das etwa so aussehen sollte:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$phpmailer = new PHPMailer(true); // Eine neue PHPMailer-Instanz erstellen

try {
    // SMTP-Einstellungen für Mailtrap
    $phpmailer->isSMTP(); // Mailer für die Verwendung von SMTP einstellen
    $phpmailer->Host = 'sandbox.smtp.mailtrap.io'; // Haupt- und Backup-SMTP-Server angeben
    $phpmailer->SMTPAuth = true; // SMTP-Authentifizierung aktivieren
    $phpmailer->Username = '1234567891234'; // SMTP-Benutzername (Beispiel von Mailtrap)
    $phpmailer->Password = '1234567891234'; // SMTP-Passwort (Beispiel von Mailtrap)
    $phpmailer->Port = 587; // TCP-Port für die Verbindung

    // E-Mail-Inhaltseinstellungen
    $phpmailer->setFrom('ihre_email@beispiel.com', 'Mailer');
    $phpmailer->addAddress('empfaenger@beispiel.com', 'Max Mustermann'); // Einen Empfänger hinzufügen
    $phpmailer->isHTML(true); // E-Mail-Format auf HTML setzen
    $phpmailer->Subject = 'Hier ist der Betreff';
    $phpmailer->Body    = 'Dies ist der HTML-Nachrichtentext <b>fett gedruckt!</b>';
    $phpmailer->AltBody = 'Dies ist der Textkörper in reinem Text für Nicht-HTML-Mail-Clients';

    $phpmailer->send(); // Die E-Mail senden
    echo 'Nachricht wurde gesendet';
} catch (Exception $e) {
    echo "Nachricht konnte nicht gesendet werden. Mailer Error: {$phpmailer->ErrorInfo}";
}
?>

Profi-Tipp:

  • Sie können auch Mailtrap SMTP-Anmeldeinformationen zum Testen von E-Mails mit PHPMailer auf localhost verwenden und zusätzliche Funktionen erhalten.

Zusammenfassung

In diesem Tutorial habe ich die häufigsten Anwendungsfälle von PHPMailer behandelt, von der Erstellung von HTML-E-Mails mit Bildern und Anhängen bis zum Senden mit oder ohne SMTP und mehr!

Hoffentlich können Sie diesen Artikel als Ihren Leitfaden für das Hinzufügen von E-Mail-Funktionalität zu Ihrer App verwenden.

Wenn Sie jedoch nach anderen Anwendungsfällen suchen, werfen Sie einen Blick in den Ordner „examples“ in der PHPMailer-Dokumentation auf Github oder besuchen Sie unseren Blog, wo Sie Artikel finden wie:

Wenn Sie visuell lernen, schauen Sie sich unbedingt unseren YouTube-Kanal an und sehen Sie, wie man E-Mails mit PHP sendet!

Article by Dmitriy Shcherbakan Full Stack Developer @Railsware
Ivan Djuric, an author at Mailtrap
Article by Ivan Djuric Technical Content Writer @Mailtrap

I’m a Technical Content Writer with 5 years of background covering email-related topics in tight collaboration with software engineers and email marketers. I just love to research and share actionable insights with you about email sending, testing, deliverability improvements, and more. Happy to be your guide in the world of emails!