new: usr: add notification email when a user is registered #4
This commit is contained in:
@@ -19,6 +19,7 @@ use DateTime;
|
|||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
|
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\HttpKernel\Attribute\AsController;
|
use Symfony\Component\HttpKernel\Attribute\AsController;
|
||||||
@@ -41,6 +42,12 @@ use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
|||||||
#[AsController]
|
#[AsController]
|
||||||
class SecurityController extends AbstractController
|
class SecurityController extends AbstractController
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
#[Autowire(env: 'APP_CONTACT_MAIL_ADDRESS')]
|
||||||
|
private readonly string $appContactMailAddress,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
#[Route('/login', name: 'MineSeekerBundle_login')]
|
#[Route('/login', name: 'MineSeekerBundle_login')]
|
||||||
public function login(AuthenticationUtils $authenticationUtils): Response
|
public function login(AuthenticationUtils $authenticationUtils): Response
|
||||||
{
|
{
|
||||||
@@ -92,7 +99,7 @@ class SecurityController extends AbstractController
|
|||||||
UrlGeneratorInterface::ABSOLUTE_URL,
|
UrlGeneratorInterface::ABSOLUTE_URL,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Ensure HTTPS scheme in production
|
/** Ensure HTTPS scheme in production */
|
||||||
if ($this->getParameter('kernel.environment') === 'prod') {
|
if ($this->getParameter('kernel.environment') === 'prod') {
|
||||||
$activationUrl = str_replace('http://', 'https://', $activationUrl);
|
$activationUrl = str_replace('http://', 'https://', $activationUrl);
|
||||||
}
|
}
|
||||||
@@ -109,6 +116,19 @@ class SecurityController extends AbstractController
|
|||||||
])
|
])
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/** Send admin notification about new user registration */
|
||||||
|
$mailer->send(
|
||||||
|
new TemplatedEmail()
|
||||||
|
->from('noreply@mineseeker.hu')
|
||||||
|
->to($this->appContactMailAddress)
|
||||||
|
->subject('🎉 New User Registration: ' . $user->getUsername())
|
||||||
|
->htmlTemplate('emails/user_registration_notification.html.twig')
|
||||||
|
->context([
|
||||||
|
'user' => $user,
|
||||||
|
'registeredAt' => new DateTime(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
$this->addFlash('verify_email', $user->getEmail());
|
$this->addFlash('verify_email', $user->getEmail());
|
||||||
|
|
||||||
return $this->redirectToRoute('MineSeekerBundle_register');
|
return $this->redirectToRoute('MineSeekerBundle_register');
|
||||||
@@ -148,7 +168,7 @@ class SecurityController extends AbstractController
|
|||||||
UrlGeneratorInterface::ABSOLUTE_URL,
|
UrlGeneratorInterface::ABSOLUTE_URL,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Ensure HTTPS scheme in production
|
/** Ensure HTTPS scheme in production */
|
||||||
if ($this->getParameter('kernel.environment') === 'prod') {
|
if ($this->getParameter('kernel.environment') === 'prod') {
|
||||||
$resetUrl = str_replace('http://', 'https://', $resetUrl);
|
$resetUrl = str_replace('http://', 'https://', $resetUrl);
|
||||||
}
|
}
|
||||||
|
|||||||
93
templates/emails/user_registration_notification.html.twig
Normal file
93
templates/emails/user_registration_notification.html.twig
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>New User Registration</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: #333;
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
.header {
|
||||||
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 30px;
|
||||||
|
border-radius: 8px 8px 0 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.header h1 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
background: #f9f9f9;
|
||||||
|
padding: 30px;
|
||||||
|
border-radius: 0 0 8px 8px;
|
||||||
|
}
|
||||||
|
.field {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.field-label {
|
||||||
|
font-weight: 600;
|
||||||
|
color: #666;
|
||||||
|
font-size: 12px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
.field-value {
|
||||||
|
background: white;
|
||||||
|
padding: 12px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border-left: 3px solid #667eea;
|
||||||
|
}
|
||||||
|
.footer {
|
||||||
|
margin-top: 20px;
|
||||||
|
padding-top: 20px;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #999;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<h1>👤 New User Registration</h1>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="field">
|
||||||
|
<div class="field-label">Username</div>
|
||||||
|
<div class="field-value">
|
||||||
|
<strong>{{ user.username }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<div class="field-label">Email</div>
|
||||||
|
<div class="field-value">
|
||||||
|
<a href="mailto:{{ user.email }}">{{ user.email }}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="field">
|
||||||
|
<div class="field-label">Details</div>
|
||||||
|
<div class="field-value">
|
||||||
|
<strong>Registered:</strong> {{ registeredAt|date('Y-m-d H:i:s') }}<br>
|
||||||
|
<strong>Status:</strong> {% if user.isVerified %}✓ Verified{% else %}⏳ Awaiting Email Verification{% endif %}<br>
|
||||||
|
<strong>Email Verified:</strong> {% if user.isVerified %}Yes{% else %}No - activation link sent{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="footer">
|
||||||
|
A new user has registered on MineSeeker.<br>
|
||||||
|
User must verify their email before account is fully activated.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
Reference in New Issue
Block a user