middleware('can:testMails,' . User::class); } public function listMails(): View { return view('bo.mail-testing'); } public function sendMail(SendTestMailRequest $request): RedirectResponse { $recipient = $request->getToAddress(); $notifiable = $this->generateDummyNotifiable($recipient); $mailableOrNotification = $this->getMailToSend( $request->getMailToTest(), $recipient, ); if ($this->sendMailToRecipient($mailableOrNotification, $notifiable)) { return back()->with('success', __("Le mail à été envoyé à l'adresse {$recipient->address}")); } return back()->with('error', 'Échec lors de l\'envoi du mail'); } private function sendMailToRecipient(Mailable | BaseNotification $mail, mixed $dummyNotifiable): bool { /** @mixin \Illuminate\Notifications\Notifiable $dummyNotifiable */ if ($mail instanceof Mailable) { return Mail::to($dummyNotifiable->address)->send($mail) !== null; } $dummyNotifiable->notifyNow($mail); return true; } private function getMailToSend(MailToTest $mailToTest, Address $sendTo): Mailable | BaseNotification { return match ($mailToTest) { MailToTest::ValidateAccount => $this->fromValidateAccountNotification(), MailToTest::ForgottenPassword => null, MailToTest::UpdatePassword => null, MailToTest::OrderRecap => null, }; } private function generateDummyNotifiable(Address $sendTo): mixed { return new readonly class($sendTo, 'Nom et Prénom customer') { use Notifiable; public function __construct( public Address $address, public string $username, ) {} public function getKey(): int { return 1; } public function getEmailForVerification(): string { return $this->address->address; } public function routeNotificationForMail(): string { return $this->address->address; } }; } private function fromValidateAccountNotification(): BaseNotification { return new VerifyEmail(); } }