I have Laravel 10 as my API backend with Fortify. When resetting the password, I want to send HTML content (retrieved from the database) to an email. The email should be queued, possibly via the jobs table.
In FortifyServiceProvider
, I have tried the toMailUsing
method.
ResetPassword::toMailUsing(function (User $user, string $token) {
return (new ResetEmail($user, $token))->onQueue('send-email');
});
But this email needs to be queued and sent directly.
FYI: I am already running send-email
queue to send other emails, and it is working perfectly fine (via Jobs). And yes, I do have set this in .env QUEUE_CONNECTION=database
In laravel source i have found this:
if ($message instanceof Mailable) {
return $message->send($this->mailer);
}
This is supposed to handle the queued Mailable
as well, right? Or am I heading in the wrong direction?
Source:10.x/src/Illuminate/Notifications/Channels/MailChannel.php#L63
Fixed with these changes.
php artisan notifications:table
php artisan migrate
<?php
namespace App\Notifications;
use App\Models\User;
use App\Mail\ResetEmail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class ResetEmailNotificationQueued extends Notification implements ShouldQueue
{
use Queueable;
/**
* Create a new notification instance.
*/
public function __construct(private string $token)
{
$this->onQueue('send-email');
}
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return ['mail'];
}
/**
*
* @param User $notifiable
*
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): Mailable
{
return new ResetEmail($notifiable, $this->token);
}
}
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetEmailNotificationQueued($token));
}
php artisan queue:listen --queue=default,send-email
Cheers :).