Laravel Mail

Fast jede moderne Webanwendung besitzt ein Emailversand. Laravel macht es dem Entwickler hier sehr einfach.

In unserem Beispiel werden wir eine Bestellbestätigung an den Kunden senden. Als erstes erstellen wir einen Mail Anwendungsfall. In unserem Beispiel wird das eine Bestellbestätigung sein. Das machen wir über die Konsole:

php artisan make:mail OrderConfirmationMail -m emails.order_confirmation

Mit diesem Artisan Command erzeugt Laravel einen neuen Ordner “Mail” in unser Laravel Root Verzeichnis. Dort finden wird nun die Klasse OrderConfirmationMail und im View Order im Verzeichnis Emails (ressources/views/emails/order_confirmation.blade.php) das blade Template.

Weiter werden ich Euch zeigen, wie man die Mailausgabe erst mal zu Testzwecken im Browser sich anzeigen lässt. Es ginge natürlich hier auch sich die Mails alle an sein Postfach schicken zu lassen. Beides geht aber zum Entwickeln ist es schon besser die Mails vorerst im Browser ausgeben zu lassen. In Laravel ist das sehr simpel. Der Parameter -m beim artisan Command eben, ist der entscheidene Punkt um die Browserausgabe zu erzeugen. M steht für Markdown und erstellt in der OrderConfirmation Class in der Methode build() den Return Wert über die Markdown Funktion. Ansonsten würden wir die Laravel Fehlermeldung: “No hint path defined for [mail].” erhalten.

public function build()
{
      	// Also das wird mit -m generiert
	return $this→markdown('emails.order_confirmation');

	// ...und das ohne Markdown Parameter (-m)
       	return $this->view('emails.order_confirmation');
}

Es gibt hier zwei Varianten der Herangehensweise. Einmal über den Controller und die andere über den Router. Zuerst regeln wir es über den Router.

Erste Variante: Über den Router
Dafür gehen wir in unser Router web.php und fügen folgenden Code ein:

use App\Mail\OrderConfirmationMail;
...
Route::get(“/email”, function() {
	return new OrderConfirmationMail();
});
...

Im Browser können wir nun uns die Mail unter http://localhost:8080/email mal anzeigen lassen:

Aber wir wollen doch eine Email verschicken?

Klar, dass geht genauso leicht. Im Router modifizieren wir unser Route wie folgt:

Route::get(“/email”, function() {
	return new OrderConfirmationMail();
});

…und ergänzen unseren Bibliothekenimport noch mit:

use Illuminate\Support\Facades\Mail;

Die zweite Variante: Über den Controller

Sobald eine Bestellung eingegangen und in der Datenbank hinterlegt worden ist, soll an den Kunden eine Bestätigungsmail verschickt werden.

Im OrderController können wir in der store Methode mit folgende Zeilen den Mailversand antriggern:

return \Mail::to("hallo@meine.mail")        
->send(new OrderConfirmationMail());

Achtet hier bitte drauf das Ihr die OrderConfirmationMail für die OrderController verfügbar macht. Also:

use App\Mail\OrderConfirmationMail;

Theoretisch müsstet Ihr auch die Mail Facade reinholen. Aber wenn Ihr die Schreibweise: “\Mail::to(…“ wählt, ist sie somit auch verfügbar. Ansonsten: use Illuminate\Support\Facades\Mail; . Ist Geschmacksache oder Bequemlichkeit. Allerdings solltet Ihr einen Stil konsequent durchziehen und Sprünge vermeiden. Der Konsistenz halber.

Laravel Mail Kofiguration

Wichtig zu erwähnen ist, dass man bevor man eine Mail versendet, den Mailserver in Laravel richtig konfiguriert. Ich habe es über die .env datei vorgenommen und versende meine Mails über smtp.

MAIL_DRIVER=smtp
MAIL_HOST=mein.server.com
MAIL_PORT=25
MAIL_USERNAME=989123
MAIL_PASSWORD=password
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=hallo@meinemail.de

Man kann nun auch im Controller bzw. Router beim Mail Klassen Aufruf Parameter übergeben und somit beim Aufruf einige Konfigurationen vornehmen. Zum Beispiel: CC, BCC hinzufügen.

Mails mit Daten füttern

Um jetzt personalisierte Mails zu versenden, können wir der Mailklasse einen Parameter mitgeben.

Im Controller

// Daten holen
$data = $this->getOrderDataFromDatabaseByOrderId($id);    

// Mail versenden    
return \Mail::to("hallo@meinemail.de")        
->send(new OrderConfirmationMail($data));

In der OrderMailClass

// in der methode build():
return $this->subject('Shop Bestellbestätigung')
→markdown('emails.order_confirmation');

// im Klassenkonstruktor
__constructor($data) {
	$this→data = $data;

Die neue Membervariable $this→data ist nun auch in der View mit $data ansprechbar. Wenn sie ein Array ist dann mit $data[“key”] oder falls es ein Objekt ist mit $data→key.


Leave a Comment

Your email address will not be published. Required fields are marked *

*

*

Empfholende Artikel


Larvel withCount mit Where Condition

November 18, 2021

Stellt Euch vor ihr habt ein Model Post mit einer Relation Comment. Auf der Übersichtsseite von Post möchtet ihr nur die Anzahl der Kommentare eines jeweiligen Post anzeigen. Dafür gibt es die echt hilfreiche Laravel Funktion withCount(). Post::withCount(‘comments’)->all(); Aber bei Comments kann es ja sein, dass manchen noch approved werden müssen. Diese müssen dann noch […]

Laravel Mailhog Docker

October 20, 2021

Letztens wurde ich gefragt, wie ich Mail bei Laravel teste. Ich meinte ich habe einen SMTP Server den ich nutzen kann. Da meinte er, dass wäre zwar okay aber man könnte sich damit auch eine valide Mailadresse verbrennen. Mit verbrennen meint der Kollege, dass sie global als SPAM Mailadresse angerechnet werden kann. Falls die Tests […]

Meine wichtigsten Artisan Commands

September 6, 2021

Als Laravel Entwickler braucht man sie ständig. Wenn man etwas länger Frontendarbeiten gemacht hat, kommt es schon mal vor, dass man etwas vergessen hat. Daher hier die Liste mit den häufigsten Artisan Commands: php artisan migrate:rollback –step=1 Ihr wollte eine oder x-beliebige Migrationen zurückspulen? Dann rollback und die Anzahl der Migrationssteps eingeben. php artisan migrate:refresh […]

Laravel – Slugs einrichten

September 2, 2021

Slugs machen die URLs Sprechender und damit auch SEO-(Freund)licher. Statt domain.de/posts/1 würde man mit domain.de/posts/mein-erster-blog-eintrag arbeiten. Um das in Laravel zu realisieren, bedient man sich in der Regel externer Bibliotheken. Einmal eine von Spartie und eine cviebrock. Man kann es natürlich aber auch selber machen. Die Bibliotheken sind hier aber vorzuziehen. Weil es ist keine […]

Laravel Blade Components

August 27, 2021

Componets – Aus VueJS kennen wir es und haben es bereits lieben gelernt. In Laravel können wir im Blade auch sehr dynamisch in Componenten arbeiten. Von Hause gibt uns Laravel Componets mit. Am Beispiel erklärt Stellen wir uns vor, wir wollen ein Blog erstellen. In der Übersichtsseite, sollen die Blogartikel untereinander gelistet werden. Wer ohne […]

Laravel Resource – Kurz mal erklärt

August 26, 2021

Nutzen wir zum Beispiel Larvel als Backend und beliefern das Frontend via api Route mit Daten, dann stellt sich manchmal die Frage, welche Daten braucht das Frontend eigentlich? Braucht man wirklich created_at oder updated_at mit auszuliefern? Sobald man sich so eine oder ähnliche Frage stellt wird es Zeit sich mal mit Laravel Resource auseinander zu […]