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.

GET http://localhost:8080/api/public/api/send

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:

Teil 1 unserer Lumen-Artikel-Serie:

Wie man mit dem Lumen Framework eine REST API erstellt

Teil 2 unserer Lumen-Artikel-Serie:

JWT Auth – Wie man eine REST API mit dem Lumen Framework um eine JWT Authentifizierung erweitert

Ähnliche Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert