GeoNetAgent, LDAPWeb, server-audit, server-connection
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.8 KiB

<?php
namespace App\Http\Controllers;
use App\Services\EmailTemplateService;
use App\Services\MailDeliveryService;
use App\Services\MailSettingsService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Throwable;
class MailSettingsController extends Controller
{
public function __construct(
private readonly MailSettingsService $mailSettings,
private readonly EmailTemplateService $emailTemplates,
private readonly MailDeliveryService $mailDelivery
) {
}
public function index(): View
{
return view('mail-settings.index', [
'settings' => $this->mailSettings->get(),
'templates' => $this->emailTemplates->all(),
]);
}
public function updateSmtp(Request $request): RedirectResponse
{
$data = $request->validate([
'mail_mailer' => ['required', 'in:smtp,log,array'],
'mail_host' => ['required', 'string', 'max:255'],
'mail_port' => ['required', 'integer', 'min:1', 'max:65535'],
'mail_username' => ['nullable', 'string', 'max:255'],
'mail_password' => ['nullable', 'string', 'max:255'],
'mail_encryption' => ['nullable', 'in:ssl,tls,null,'],
'mail_from_address' => ['required', 'email', 'max:255'],
'mail_from_name' => ['required', 'string', 'max:255'],
]);
if (($data['mail_encryption'] ?? '') === 'null' || ($data['mail_encryption'] ?? '') === '') {
$data['mail_encryption'] = '';
}
$this->mailSettings->update($data);
$request->attributes->set('audit_metadata', [
'host' => $data['mail_host'],
'from' => $data['mail_from_address'],
]);
return back()->with('success', 'SMTP settings saved.');
}
public function testEmail(Request $request): RedirectResponse
{
$data = $request->validate([
'test_email' => ['required', 'email', 'max:255'],
]);
try {
$this->mailDelivery->sendTest($data['test_email']);
$request->attributes->set('audit_metadata', ['recipient' => $data['test_email']]);
return back()->with('success', 'Test email sent to ' . $data['test_email'] . '.');
} catch (Throwable) {
return back()->with('error', 'Failed to send test email. Check SMTP settings.');
}
}
public function updateTemplate(Request $request, string $slug): RedirectResponse
{
$data = $request->validate([
'subject' => ['required', 'string', 'max:255'],
'body_html' => ['required', 'string', 'max:50000'],
]);
$this->emailTemplates->update($slug, $data['subject'], $data['body_html']);
$request->attributes->set('audit_metadata', ['template' => $slug]);
return back()->with('success', 'Email template updated.');
}
public function testTemplate(Request $request, string $slug): RedirectResponse
{
$allowed = ['password_reset', 'password_changed'];
if (! in_array($slug, $allowed, true)) {
return back()->with('error', 'Template preview is not available for this slug.');
}
$data = $request->validate([
'test_email' => ['required', 'email', 'max:255'],
]);
try {
$this->emailTemplates->get($slug);
$this->mailDelivery->sendTemplatePreview($data['test_email'], $slug);
$request->attributes->set('audit_metadata', [
'template' => $slug,
'recipient' => $data['test_email'],
]);
return back()->with('success', "Preview [{$slug}] sent to {$data['test_email']}.");
} catch (Throwable) {
return back()->with('error', 'Failed to send template preview. Check SMTP settings.');
}
}
}