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.
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:
- Erstellen Sie ein Mailtrap-Konto
- Verifizieren Sie Ihre E-Mail-Versanddomain wie im folgenden Video beschrieben. ⬇️
- 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.
- 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.
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.
- Die dafür zuständige Direktive ist die
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
undemailWarteschlange
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.
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.
Lassen Sie mich Ihnen zeigen, wie es funktioniert.
Um Ihre E-Mails mit einem Fake-SMTP-Server zu testen, gehen Sie zu Email Testing → Inboxes → SMTP Settings (E-Mail-Tests → Posteingänge → SMTP-Einstellungen) und wählen Sie PHPMailer in der Liste der Integrationen aus.
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:
- PHPMailer Gmail: Ein Leitfaden mit Codebeispielen [2024]
- E-Mails in PHP senden [2024 Leitfaden mit Beispielen]
- PHP E-Mail-Kontaktformular | Mailtrap
- Einfache Wege zum Testen von E-Mails in Ihrer PHP-App
Wenn Sie visuell lernen, schauen Sie sich unbedingt unseren YouTube-Kanal an und sehen Sie, wie man E-Mails mit PHP sendet!