* @category Class * @license https://www.gnu.org/licenses/lgpl-3.0.en.html GNU Lesser General Public License * @link www.splendidbear.org * @since 2026. 04. 20. */ readonly final class SendPasswordResetEmailService { public function __construct( private LoggerInterface $logger, private MailerInterface $mailer, ) { } public function send(string $email, string $username, string $resetUrl): void { try { $this->mailer->send( new TemplatedEmail() ->from('noreply@mineseeker.hu') ->to($email) ->subject('Reset your MineSeeker password') ->htmlTemplate('emails/reset_password.html.twig') ->context([ 'username' => $username, 'reset_url' => $resetUrl, ]) ); } catch (TransportExceptionInterface|Exception $e) { $this->logger->error("Failed to send password reset email: {$e->getMessage()}", [ 'exception' => $e, 'email' => $email, ]); throw new RuntimeException("Failed to send password reset email: {$e->getMessage()}"); } } }