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
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.'); |
|
} |
|
} |
|
}
|
|
|