Wie man Mails versendet mit dem Lumen Framework
Dritter Teil unserer Artikel-Serie über das Lumen-Framework. In dem vorerst letzten Teil geht es darum, wie man mittels Lumen Framework E-Mails erstellt und per Request über die REST-API versendet.
Lumen bietet eine einfache API für die SwiftMailer-Bibliothek mit Treibern für SMTP, Mailgun, SparkPost, Amazon SES, die PHP-Mailfunktion und Sendmail, so dass man schnell mit dem Senden von E-Mails über einen lokalen oder Cloud-basierten Dienst beginnen kann.
In diesem Beispiel wollen wir zeigen, wie man ein Mail-Template erstellt, Daten über die REST-API an die Mail durchreicht und diese per SMTP versendet.
Dieses Beispiel bezieht sich auf folgende Versionen:
PHP: 7.3
Laravel / Lumen: 5.8
illuminate/mail: 5.8
Vorbereitung
Zunächst benötigen wir das Illuminate-Mail-Paket. Das installieren wir mittels Composer.
composer require illuminate/mail „5.8.*“
Achtung: Die Version des Mail-Paketes sollte die gleiche sein, wie die des verwendeten Lumen Frameworks.
Als nächstes registrieren wir den MailServiceProvider in der bootstrap.php.
$app->register(Illuminate\Mail\MailServiceProvider::class);
Da wir die Mail-Settings aus der .env lesen wollen, kopieren wir uns die mail.php aus dem Laravel-Framework in unseren config-Ordner. Da ist das Mapping der Settings konfiguriert.
Jetzt können wir die Settings in der .env konfigurieren.
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=25
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME=“Example app“
Und als letzten Schritt der Vorbereitung registrieren wir die Mail-Config in der bootstrapp/app.php.
$app->configure('mail');
Mailables
In Laravel wird für jede E-Mail, die gesendet werden soll, eine Klasse benötigt, die von der „Mailable“-Klasse abgeleitet ist. Diese Klassen werden im App/Mail-Verzeichnis gespeichert. Der dazugehörige View unter resources/views.
Seit Version 5.2 wurden viele Funktionen des Lumen-PHP-Mikro-Frameworks eingeschränkt, um die Performance zu verbessern und eine Umstellung auf einen zustandslosen API-Service-Builder zu ermöglichen. Daher können wir nicht auf die artisan-Funktion make:mail zurückgreifen, welche die Mailable-Klassen und Views automatisch anlegt. Also legen wir diese von Hand an.
Daher legen wir zunächst eine Datei ExampleMail.php unter app/Mail an. Diese Klasse erweitert die Mailable-Klasse.
namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Queue\ShouldQueue; class ExampleMail extends Mailable { use Queueable, SerializesModels; //build the message. public function build() { return $this->view('example-mail'); } }
In der build-Methode wird der View angegeben.
Für den View legen wir unter resources/views eine neue Datei example-mail.blade.php an.
Dort können wir den View der Mail in HTML aufbauen.
<p>Hallo,</p> <p>Das ist eine Beispiel-Mail.</p> <p>Mit freundlichen Grüßen<br />Ihr Team von computerhalbwissen.de</p>
Jetzt haben wir alles vorbereitet, um die Mail versenden zu können.
Mail versenden
Da wir in den vorherigen Artikeln dieser kleinen Lumen-Serie bereits das Gerüst für eine API gebaut haben, wollen wir die Mail nun per Request versenden.
Dazu legen wir unter app/Http/Controllers einen neuen Controller „MailController.php“ an.
In dieser Klasse implementieren wir das Absenden der Mail.
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use App\Mail\ExampleMail; class MailController extends Controller { public function __construct() { $this->middleware('auth:api'); } public function send(Request $request) { try { Mail::to("recipent@example.com") ->send(new ExampleMail()); return response()->json("sending succsessfull"); } catch(Exception $e) { return response()->json("sending failed"); } } }
In der routes/web.php können wir nun die neue Route hinzufügen.
Route::get('send', 'MailController@send');
Folgender Aufruf sendet nun eine Mail und gibt eine Nachricht als JSON zurück, sofern man autorisiert ist.
Daten in die Mail geben
Meist wollen wir nicht nur festen Text versenden, sondern Daten an die Mail übergeben.
Als Beispiel wollen wir die To-Adresse übergeben und einen Code.
Wir ändern unsere Route also zu POST und schicken die Daten als JSON.
Route::post('send', 'MailController@send');
{ "to": "recipent@example.com", "code": "12345" }
In unserer Mailable-Klasse legen wir nun für die zu übergebenden Parameter Properties an. Die Parameter geben wir in den Konstruktor herein und setzen die Properties.
public $toAddress; public $code; public function __construct($to, $code) { $this->toAddress = $to; $this->code = $code; }
Sind die Properties public, so sind sie automatisch im View verfügbar.
<p>Bitte geben Sie folgenden Code ein: {{ $code }}</p>
In der build-Methode setzen wir noch die dynamische to-Adresse.
return $this->to($this->toAddress) ->subject('Example!') ->view('example-mail');
Zu guter Letzt übergeben wir im MailController die Daten aus dem Request an den Mailer.
Mail::send(new ExampleMail($request->input('to'), $request->input('code')));
Und schon wird die Mail an die übergebene To-Adresse gesendet.
Fazit
Wie bereits festgestellt, bietet Lumen elegante Möglichkeiten für die Implementierung einer REST API und der dahinterliegenden Backend-Funktionen mit PHP.
So ist das auch beim Erstellen und Senden von Mails.
Das war der vorerst letzte Teil unserer kleinen Lumen-Artikel-Serie.
Wie immer hoffe ich, dass diese erstbeste Anleitung hilfreich war.
<< Zum vorherigen Teil der Lumen-Artikel-Serie
Quellen:
- Lumen Mail Doku
- Laravel Mail Doku
- Enable Mail on Lumen Framework
- Blade – Template Engine Doku
- Laravel – Retrieving Request Inputs
Teil 1 unserer Lumen-Artikel-Serie:
Teil 2 unserer Lumen-Artikel-Serie:
JWT Auth – Wie man eine REST API mit dem Lumen Framework um eine JWT Authentifizierung erweitert
Sie sehen gerade einen Platzhalterinhalt von X. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen