Schlagwort-Archive: Notifications

Laravel Notifications per Mail versenden

Mit Laravel kann man Benutzern direkt Notifications per E-Mail senden. Wie das funktioniert, erfahren Sie in diesem Artikel.

Zum Thema Laravel Notifications haben wir auch einen Artikel zu Notifications in Rocket.Chat versenden veröffentlicht, diesen können Sie hier finden.

Mailtrap & SMTP Konfiguration

Zum Testen verwenden wir mailtrap.io. Wie der Name es schon suggeriert werden alle Mails direkt abgefangen. Diese werden dann in einem Postfach gebündelt angezeigt.

Innerhalb des Postfaches gehen wir auf SMTP Settings und wählen im Dropdown direkt Laravel aus. Die richtigen Einstellungen werden angezeigt und können in die .env eingetragen werden.

Erstellung Notification & Controller

php artisan make:notification AlarmNotification
php artisan make:controller NotificationController

Im NotificationController erstellen wir eine Test Funktion und inkludieren die AlarmNotification, damit wir diese auch ansprechen können.

<?php

namespace App\Http\Controllers;

use App\Notifications\AlarmNotification;

class NotificationController extends Controller
{
    public function test()
    {
        // testing notification
    }
}

In der Test Funktion erstellen wir uns die NotificationData, die wir versenden möchten.

$notificationData = [
    'message' => 'Test Notification',
    'actionLink' => 'https://admin-code.de'
    'actionText' => 'Click here'
];

Damit wir die Notification versenden können, benötigen wir noch einen Zielbenutzer. Über „notify“ können wir ihm dann die Notification mit notificationData schicken.

$user = User::first();

$user->notify(new AlarmNotification($notificationData));

Damit das auch funktioniert, müssen innerhalb des User Models Notifications erlaubt sein.
Dies sollte standartmäßig bereits der Fall sein – trotzdem sollte folgendes kontrolliert werden:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
use Illuminate\Database\Eloquent\SoftDeletes;



class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

An diesem Punkt können wir die Notification bereits testen.

// api.php

use App\Http\Controllers\NotificationController;

Route::get('notification-test', [NotificationController::class, 'test']);

Über Postman können wir nun die API aufrufen und etwaige Fehler analysieren.

Möglicher Fehler beim Versenden der Mail:

stream_socket_client(): php_network_getaddresses: getaddrinfo for mailhog failed: No such host is known.

Lösung:

php artisan cache:clear
php artisan config:clear

Konfiguration der Notification

Am Anfang der Notification Class deklarieren wir die notificationData als private.

class AlarmNotification extends Notification
{
    use Queueable;
    private $notificationData;

Und schreiben diese mit in den Constructor

public function __construct($notificationData)
    {
        $this->notificationData = $notificationData;
    }

Nun können wir die Informationen, die wir im Controller an die Notification weitergegeben haben hier auch verwenden. In der toMail Funktion wird der Text der Mail definiert.

public function toMail($notifiable)
    {
        return (new MailMessage)
	    ->line($this->notificationData['message'])
	    ->action(
	        $this->notificationData['actionText'],
	        $this->notificationData['actionLink']
	    )
    }

Aussehen der Laravel Notification ändern

Die Templates, die von Laravel verwendet werden, um Notifications zu versenden, können mit diesen beiden Commands in den resources Ordner verschoben und anschließen bearbeitet werden:

php artisan vendor:publish --tag=laravel-mail
php artisan vendor:publish --tag=laravel-notifications

Nun können wir zum Beispiel das Logo im Header der Notification verändern:

Dazu einfach in der resources/views/vendor/mail/html/header.blade.php den Link austauschen. Dabei nicht vergessen, in der CSS Datei die Breiten- und Höhenangaben zu bearbeiten.

Weitere Informationen und Meta Daten in Laravel Notification

Neben Linien und einem Action Button kann man noch weitere Infos and die Notification weitergeben.

->level()

Verändert Farben des Action Buttons und Anrede wenn keine gesetzt ist

->subject()

Betreff der E-Mail

->from()

Absender der E-Mail

->replyTo()

E-Mail Adresse für Antworten

->priority()

Priorität der E-Mail, 1-5, 1 ist das höchste

->greeting()

Anrede

->line()

Text in der Mail, kann auch mehrmals per For-Loop verwendet werden

->salutation()

Gruß zum Abschied

Mehr Methoden können Sie in der offiziellen Dokumentation nachschlagen.

Sollten Sie noch Fragen haben oder eine Beratung wünschen, können Sie gerne mit uns Kontakt aufnehmen oder unsere Webseite besuchen.

Gerne können Sie hier auch andere Artikel zum Thema Laravel anschauen.

Laravel Notifications an Rocket.Chat versenden

Laravel Notifications können standardmäßig per E-Mail, SMS (über Drittanbieter) und Slack versendet werden. Mit Hilfe des Community Projektes Laravel Notification Channels lassen sich Notifications auch an andere Dienste schicken.

In diesem Artikel zeigen wir Ihnen, wie Rocket.Chat angesprochen werden kann.

Setup

Der Rocket.Chat Notification Channel wird mit Composer installiert:

composer require laravel-notification-channels/rocket-chat

Vorab müssen wir innerhalb von Rocket.Chat einen neuen Channel und eine Integration erstellen:

Wichtig: Der Rocket.Chat Token wird erst nach dem ersten Speichern generiert.

In die .env werden die URL des Rocket.Chat Servers, das Token aus dem letzten Screenshot, und der Name des Zielchannels hinterlegt:

ROCKETCHAT_URL="https://chat.admin-box.de/"
ROCKETCHAT_TOKEN="*******"
ROCKETCHAT_CHANNEL="insight"

In der Datei config/services.php wird der neue Rocket.Chat Service hinterlegt:

'rocketchat' => [
    'url' => env('ROCKETCHAT_URL'),
    'token' => env('ROCKETCHAT_TOKEN'),
    'channel' => env('ROCKETCHAT_CHANNEL'),
],

Eine neue Notification wird erstellt:

php artisan make:notification TestNotification

Zum Steuern der Notification wird ein neuer Controller erstellt (optional):

php artisan make:controller NotificationController

Controller Konfiguration

Im Controller, den wir verwenden möchten, um die Notification auszuführen, fügen wir die Notification hinzu

use App\Notifications\TestNotification;

und können sie danach auch schon in einer Beispielfunktion verwenden

public function testNotification()
{
    $user = Auth::user();
    $notificationData = [
        'body' => 'Testbenachrichtigung von ' . $user->name,
        'url' => 'https://portal.admin-insight.de'
    ];>

    Notification::route('', '')
        ->notify(newTestNotification($notificationData));
}

Da wir hier keine Nachrichten direkt an einzelne Benutzer versenden, die in unserer Laravel Installation hinterlegt sind, sondern hart auf einen Rocket.Chat Server und einen Channel gehen, können wir mit Notification::route(“, “) die Notification triggern. Bei anderen Formen der Notification, wie E-Mail, wird die Notification mit Hilfe des User Models aufgerufen, und die verknüpfte E-Mail-Adresse wird automatisch zur Zieladresse.

$user->notify(new TestNotification($notificationData)));

Notification Konfiguration

Innerhalb der Notification werden die folgenden Klassen hinzugefügt

use NotificationChannels\RocketChat\RocketChatMessage;
use NotificationChannels\RocketChat\RocketChatAttachment;
use NotificationChannels\RocketChat\RocketChatWebhookChannel;

Auf RocketChatAttachment kann verzichtet werden, sollte man grundsätzlich keine Anhänge versenden.

class TestNotification extends Notification
{
    use Queueable;
    private $notificationData; // 

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct($notificationData)
    {
        $this->notificationData = $notificationData;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return [ 
            RocketChatWebhookChannel::class
        ];
    }

Die Variable $notificationData wird im Constructor bespielt und kann dann später in der Nachricht verwendet werden

    public function toRocketChat($notifiable): RocketChatMessage
    {

        return RocketChatMessage::create()
          ->content($this->notificationData['body'] . ' [Hier klicken](' . $this->notificationData['url'] . ')' );
    }

In der toRocketChat Funktion wird nun die Nachricht erstellt und losgeschickt

Neben content() gibt es noch weitere nützliche Methoden:

->alias('')

Ändert den Namen des Absenders (der originale Name wird dahinter noch gezeigt)

->emoji('')

Tauscht das Profilbild des Absenders mit einem der Rocket.Chat Emojis (Bspw. :radioactive:)

->avatar('')

Tauscht das Profilbild des Absenders mit einem im Internet gespeichertem Bild

->attachment() und attachments()

Hier können Bilder/Videos/Sounds als Anhang der Nachricht hinzugefügt werden

Beispielhaftes Attachment:

->attachment(
    RocketChatAttachment::create()
        ->imageUrl('https://domain.tld/image.jpg')
        ->color('blue') 
        ->text('attachmentText'
);

Anhänge haben ebenfalls eine Vielzahl von möglichen Methoden. Zeitstempel, Farben, Thumbnails, und vieles mehr. Mehr Methoden können Sie in der offiziellen Dokumentation nachschlagen.

Sollten Sie noch Fragen haben oder eine Beratung wünschen, können Sie gerne mit uns Kontakt aufnehmen oder unsere Webseite besuchen.

Gerne können Sie hier auch andere Artikel zum Thema Laravel anschauen.