Transactionele e-mail met Laravel
Laravel heeft een volwassen mail-stack: Mailable-klassen, Blade-templates, queues en ingebouwde foutafhandeling. In deze tutorial configureer je SMTP via Wesender en verstuur je je eerste transactionele mail.
Wat je nodig hebt
- Laravel 10 of nieuwer
- Een Wesender-account en een API-key
- Een geverifieerd verzenddomein
.env configureren
Voeg de SMTP-instellingen toe aan je .env-bestand:
MAIL_MAILER=smtp
MAIL_HOST=smtp.wesender.nl
MAIL_PORT=587
MAIL_USERNAME=jouw-api-key
MAIL_PASSWORD=jouw-api-key
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="noreply@joudomein.nl"
MAIL_FROM_NAME="${APP_NAME}" Een Mailable aanmaken
php artisan make:mail WelkomstMail Laravel genereert app/Mail/WelkomstMail.php. De moderne opzet gebruikt envelope(), content() en attachments():
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
use App\Models\User;
class WelkomstMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public User $user) {}
public function envelope(): Envelope
{
return new Envelope(subject: 'Welkom bij ' . config('app.name'));
}
public function content(): Content
{
return new Content(view: 'emails.welkomst');
}
public function attachments(): array
{
return [];
}
} De Blade-template
Maak resources/views/emails/welkomst.blade.php aan:
<!DOCTYPE html>
<html lang="nl">
<head><meta charset="UTF-8"><title>Welkom</title></head>
<body style="font-family: sans-serif; color: #1a1a1a; padding: 2rem;">
<h1>Hoi {{ $user->name }},</h1>
<p>Welkom. Je account is klaar om te gebruiken.</p>
<a href="{{ url('/dashboard') }}" style="color: #10b981;">Naar het dashboard</a>
</body>
</html> $user in de template. Versturen vanuit je applicatie
use App\Mail\WelkomstMail;
use Illuminate\Support\Facades\Mail;
Mail::to($user->email)->send(new WelkomstMail($user)); Gebruik render() of geef de Mailable terug vanuit een route om de mail in de browser te bekijken:
Route::get('/preview/welkomst', function () {
return new WelkomstMail(auth()->user());
}); In de wachtrij zetten
Laat de Mailable ShouldQueue implementeren voor asynchrone verzending:
use Illuminate\Contracts\Queue\ShouldQueue;
class WelkomstMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
// ...
} Zet QUEUE_CONNECTION niet op sync in productie. Start daarna de worker:
php artisan queue:work afterCommit() zodat de job pas na de commit vertrekt: Mail::to($user->email)->afterCommit()->send(new WelkomstMail($user)); Foutafhandeling
Definieer een failed()-methode op de Mailable voor queued mail:
public function failed(Throwable $e): void
{
Log::error('Mail versturen mislukt', [
'to' => $this->user->email,
'error' => $e->getMessage(),
]);
} Testen
Start Tinker en verstuur een testmail:
php artisan tinker
Mail::to('test@voorbeeld.nl')->send(new \App\Mail\WelkomstMail(App\Models\User::first())); Verder bouwen
Klaar om te beginnen?
3.000 e-mails per maand gratis. Data in Europese datacenters.