Das Versenden von E-Mails in Laravel erfordert die Zusammenarbeit zwischen drei Komponenten: Laravel-Mailer, Laravel-Mailable-Klassen und die Mail-Fassade. Jeder der drei befasst sich mit einem anderen Aspekt des Lebenszyklus des E-Mail-Versands.
Mailer sind die Treiber zur Verbindung von E-Mail-Versanddiensten (wie AWS SES, Sendgrid, Mailgun usw.), die die Anwendung zum Weiterleiten von E-Mails an die Empfänger verwenden kann.
Laravel Mailable sind spezielle Klassen, die eine Vorlage für zu versendende E-Mails darstellen. Es enthält alle typischen Informationen einer E-Mail-Nachricht wie den Inhalt, das „An“-Feld, Anhänge usw.
Schließlich ist die Mail-Fassade der Zugangspunkt, um den tatsächlichen Versand eines Mailings über einen Mailer-Treiber anzufordern.
Ich hatte die Gelegenheit, dieses System im Detail zu erkunden, und jetzt versendet Inspector zu Spitzenzeiten mehr als 6000 E-Mails pro Stunde.
Ich hoffe, meine Erfahrung könnte Ihnen dabei helfen, diese Komponente des Frameworks besser zu verstehen, da Laravel Mailable eine der Schlüsselkomponenten jeder modernen Anwendung ist.
Für weitere technische Artikel können Sie mir auf Linkedin oder X folgen.
Die Konfiguration der Mailer-Treiber in Laravel befindet sich in der Datei config/mail.php. Es ist möglich, mehrere Mailer zu definieren, die jeweils durch einen Namen und einen Transporttreiber gekennzeichnet sind.
'mailgun' => [ 'transport' => 'mailgun', // 'client' => [ // 'timeout' => 5, // ]
Laravel wird versuchen, sie zu verwenden, falls der primäre E-Mail-Dienst ausgefallen ist.
Ein Mailable ist eine PHP-Klasse, die eine von Ihrer Anwendung gesendete E-Mail darstellt. Sie können mit dem Artisan-Befehl „make“ eine neue mailbare Klasse erstellen.
php artisan make:mail OrderConfirmation
Die Konfiguration eines Mailings erfolgt über drei Hauptmethoden: Umschlag, Inhalt und Anhänge, die sich jeweils mit der Definition der Kopfzeilen, des Nachrichtentexts und etwaiger Anhänge befassen.
use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailables\Address; use Illuminate\Mail\Mailables\Attachment; use Illuminate\Mail\Mailables\Content; use Illuminate\Mail\Mailables\Envelope; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class OrderConfirmation extends Mailable { use Queueable; use SerializesModels; public function __construct(public Order $order) {} /** * Configure the email message */ public function envelope() { return new Envelope( from: new Address('[email protected]', 'E-commerce'), subject: 'Order Confirmation', ); } /** * Generate the body */ public function content() { return new Content( markdown: 'emails.orders.confirm', ); } /** * Configure the email attachements */ public function attachments() { $code = $this->order->code; return [ Attachment::fromPath("/path/to/order-{$code}.pdf"), ]; } }
Die Darstellung des E-Mail-Inhalts wird selbstverständlich der entsprechenden Blade-Vorlage anvertraut. Innerhalb der Blade-Ansicht ist es möglich, die Daten abzurufen, die zum Rendern der E-Mail verwendet werden sollen, indem die öffentlichen Eigenschaften verwendet werden, die in der Mailable-Klasse definiert sind ($order im obigen Beispiel).
Code: {{ $order->code }} Address: {{ $order->address }} ...
Der eigentliche Versand einer E-Mail erfolgt über die Mail-Fassade und ihre to- und send-Methoden.
class OrderController extends Controller { public function ship(Order $order) { // do stuff with the order // Send the confirmation email Mail::to($order->user)->send(new OrderConfirmation($order)); } }
Der E-Mail-Empfänger kann als E-Mail-Adresszeichenfolge oder über ein Benutzerobjekt oder eine Sammlung von Objekten mit den Eigenschaften „Name“ und „E-Mail“ übergeben werden.
Die tatsächlich zu versendende E-Mail wird durch das mailbare Objekt dargestellt, das die notwendigen Eigenschaften erhält, um die mit dem Inhalt verknüpfte Blade-Vorlage darzustellen.
Die Mail-Fassade bietet verschiedene verkettbare Methoden, mit denen Sie die Sendekonfiguration detaillierter definieren können, sowohl hinsichtlich der Empfänger (mit den Methoden cc und bcc) als auch der Sendezeiten und -methoden (Warteschlange oder später).
Wenn Sie erfahren möchten, wie Sie Ihre eigenen Fassaden erstellen, können Sie den folgenden Artikel lesen:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
Da das Senden einer E-Mail die Verwendung externer Dienste (der Mailer-Treiber) erfordert, kann es sich um einen langsamen Vorgang handeln, der sich negativ auf die Benutzererfahrung auswirkt.
Laravel ermöglicht es Ihnen, E-Mail-Nachrichten für den Hintergrundversand in die Warteschlange zu stellen. Wenn Sie an einer Anleitung zur maßstabsgetreuen Verwendung des Laravel-Warteschlangensystems interessiert sind, können Sie den folgenden Artikel lesen:
https://inspector.dev/what-worked-for-me-using-laravel-queues-from-the-basics-to-horizon/
Um den Versand einer E-Mail im Hintergrund zu verzögern, haben Sie zwei Möglichkeiten: die ShouldQueue-Schnittstelle oder die Queue-Methode der Mail-Fassade.
Wie in einem vorherigen Snippet gezeigt, wird die Mailable-Klasse standardmäßig mit einigen angehängten Merkmalen wie Queueable generiert.
Es ermöglicht die programmgesteuerte Verwendung der Warteschlangenmethoden auf der Mail-Fassade, ohne Ihre Implementierung zu berühren:
Mail::to($user)->queue(new OrderConfirmation($order));
Alternativ können Sie die Implementierung der ShouldQueue-Schnittstelle in der Mailable-Klasse deklarieren:
use Illuminate\Contracts\Queue\ShouldQueue; class OrderConfirmation extends Mailable implements ShouldQueue { ... }
Wenn Sie diese Schnittstelle verwenden, wird das Senden der E-Mail immer in die Warteschlange gestellt, auch wenn Sie die Standard-Sendemethode auf der Mail-Fassade aufrufen.
// If the mailable class implements ShouldQueue these methods has the same behaviour. Mail::to($user)->send(new OrderConfirmation($order)); Mail::to($user)->queue(new OrderConfirmation($order));
Wenn Sie eine Ansicht implementieren, die sich auf eine E-Mail-Nachricht bezieht, ist es sehr hilfreich, visuelles Feedback darüber zu erhalten, welches Endergebnis die Blade-Ansicht rendern wird. Sie können dies mithilfe der Datei „routes/mailable.php“ in Ihren Laravel-Projekten tun.
/* * Render email in the browser. * * Visit https://homestead.test/mailable */ Route::get('/', function () { return new \App\Domains\Organization\Mails\IngestionLimitMail( \App\Domains\Organization\Models\Organization::firstOrFail() ); });
Sie können eine gültige Mailable-Instanz von der Route zurückgeben und Laravel rendert die Ansicht im Browser. Es ist wie die Entwicklung einer normalen Webseite.
Denken Sie abschließend daran, die Verfügbarkeit dieser Route im
einzuschränken.
RouteServiceProvider:
class RouteServiceProvider extends ServiceProvider { /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { if (app()->environment('local')) { $this->mapMailableRoutes(); } } /** * Render mailables in the browser. * * @return void */ protected function mapMailableRoutes() { Route::prefix('mailable') ->group(base_path('routes/mailable.php')); } }
Für weitere technische Artikel können Sie mir auf Linkedin oder X folgen.
Inspector ist ein Tool zur Codeausführungsüberwachung, das speziell für Softwareentwickler entwickelt wurde. Sie müssen nichts auf Serverebene installieren, installieren Sie einfach das Laravel-Paket und schon kann es losgehen.
Wenn Sie nach HTTP-Überwachung, Einblicken in Datenbankabfragen und der Möglichkeit suchen, Warnungen und Benachrichtigungen an Ihre bevorzugte Messaging-Umgebung weiterzuleiten, testen Sie Inspector kostenlos. Registrieren Sie Ihr Konto.
Oder erfahren Sie mehr auf der Website: https://inspector.dev
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3