'SSL (Secure Sockets Layer)', self::SMTP_ENCRYPTION_TLS => 'TLS (Transport Layer Security)', self::SMTP_ENCRYPTION_NONE => 'Sin encriptación (No recomendado)', ]; public $rules = [ [ 'host' => 'nullable|string|max:255', 'port' => 'nullable|integer', 'encryption' => 'nullable|string', 'username' => 'nullable|string|max:255', 'password' => 'nullable|string|max:255', ], [ 'host.string' => 'El servidor SMTP debe ser una cadena de texto.', 'host.max' => 'El servidor SMTP no puede exceder los 255 caracteres.', 'port.integer' => 'El puerto SMTP debe ser un número entero.', 'encryption.string' => 'El tipo de encriptación SMTP debe ser una cadena de texto.', 'username.string' => 'El nombre de usuario SMTP debe ser una cadena de texto.', 'username.max' => 'El nombre de usuario SMTP no puede exceder los 255 caracteres.', 'password.string' => 'La contraseña SMTP debe ser una cadena de texto.', 'password.max' => 'La contraseña SMTP no puede exceder los 255 caracteres.', ] ]; public function mount() { $this->loadSettings(); } public function loadSettings() { $globalSettingsService = app(GlobalSettingsService::class); // Obtener los valores de las configuraciones de la base de datos $settings = $globalSettingsService->getMailSystemConfig(); $this->change_smtp_settings = false; $this->save_button_disabled = true; $this->host = $settings['mailers']['smtp']['host']; $this->port = $settings['mailers']['smtp']['port']; $this->encryption = $settings['mailers']['smtp']['encryption']; $this->username = $settings['mailers']['smtp']['username']; $this->password = null; } public function save() { $this->validate($this->rules[0]); $globalSettingsService = app(GlobalSettingsService::class); // Guardar título del App en configuraciones $globalSettingsService->updateSetting('mail.mailers.smtp.host', $this->host); $globalSettingsService->updateSetting('mail.mailers.smtp.port', $this->port); $globalSettingsService->updateSetting('mail.mailers.smtp.encryption', $this->encryption); $globalSettingsService->updateSetting('mail.mailers.smtp.username', $this->username); $globalSettingsService->updateSetting('mail.mailers.smtp.password', Crypt::encryptString($this->password)); $globalSettingsService->clearMailSystemConfigCache(); $this->loadSettings(); $this->dispatch( 'notification', target: $this->targetNotify, type: 'success', message: 'Se han guardado los cambios en las configuraciones.' ); } public function testSmtpConnection() { // Validar los datos del formulario $this->validate($this->rules[0]); try { // Verificar la conexión SMTP if ($this->validateSMTPConnection()) { $this->save_button_disabled = false; $this->dispatch( 'notification', target: $this->targetNotify, type: 'success', message: 'Conexión SMTP exitosa, se guardó los cambios exitosamente.', ); } } catch (\Exception $e) { // Captura y maneja errores de conexión SMTP $this->dispatch( 'notification', target: $this->targetNotify, type: 'danger', message: 'Error en la conexión SMTP: ' . $e->getMessage(), notificationTimeout: 15000 // Timeout personalizado ); } } private function validateSMTPConnection() { $dsn = sprintf( 'smtp://%s:%s@%s:%s?encryption=%s', urlencode($this->username), // Codificar nombre de usuario urlencode($this->password), // Codificar contraseña $this->host, // Host SMTP $this->port, // Puerto SMTP $this->encryption // Encriptación (tls o ssl) ); // Crear el transportador usando el DSN $transport = Transport::fromDsn($dsn); // Crear el mailer con el transportador personalizado $mailer = new Mailer($transport); // Enviar un correo de prueba $email = (new Email()) ->from($this->username) // Dirección de correo del remitente ->to(env('MAIL_SANDBOX')) // Dirección de correo de destino ->subject(Config::get('app.name') . ' - Correo de prueba') ->text('Este es un correo de prueba para verificar la conexión SMTP.'); // Enviar el correo $mailer->send($email); return true; } public function render() { return view('admin::livewire.admin-settings.mail-smtp-settings'); } }