pdo = $pdo; $this->companyId = $company_id; $this->method = $method; $this->pinkey = $pinkey; $this->iv = $iv; } public function get(): ?array { $sth = $this->pdo->prepare( "SELECT server, port, username, from_name, from_email, encryption FROM company_smtp WHERE company_id = :company_id LIMIT 1" ); $sth->execute([':company_id' => $this->companyId]); $row = $sth->fetch(PDO::FETCH_ASSOC); return $row ?: null; } public function save(array $data): void { $server = trim((string)($data['smtp_host'] ?? '')); $port = trim((string)($data['smtp_port'] ?? '587')); $username = trim((string)($data['smtp_username'] ?? '')); $raw_pass = (string)($data['smtp_password'] ?? ''); $from_name = trim((string)($data['smtp_from_name'] ?? '')); $from_email = trim((string)($data['smtp_from_email'] ?? '')); $encryption = trim((string)($data['smtp_encryption'] ?? 'tls')); if ($server === '' || $username === '') { throw new Exception('SMTP host and username are required.'); } if (!in_array($port, ['25', '465', '587'], true)) $port = '587'; if (!in_array($encryption, ['tls', 'ssl', 'none'], true)) $encryption = 'tls'; $sth = $this->pdo->prepare( "SELECT smtp_id FROM company_smtp WHERE company_id = :company_id LIMIT 1" ); $sth->execute([':company_id' => $this->companyId]); $existing_id = $sth->fetchColumn(); if ($existing_id) { $this->update((int)$existing_id, $server, $port, $username, $raw_pass, $from_name, $from_email, $encryption); return; } if ($raw_pass === '') { throw new Exception('Password is required for a new SMTP configuration.'); } $this->pdo->prepare( "INSERT INTO company_smtp (company_id, server, port, username, password, from_name, from_email, encryption, updated_at) VALUES (:company_id, :server, :port, :username, :password, :from_name, :from_email, :encryption, NOW())" )->execute([ ':company_id' => $this->companyId, ':server' => $server, ':port' => $port, ':username' => $username, ':password' => $this->encryptPassword($raw_pass), ':from_name' => $from_name, ':from_email' => $from_email, ':encryption' => $encryption, ]); } public function sendTest(string $to): void { $to = trim($to); if (!filter_var($to, FILTER_VALIDATE_EMAIL)) { throw new Exception('Invalid recipient email address.'); } $sth = $this->pdo->prepare( "SELECT from_name FROM company_smtp WHERE company_id = :company_id LIMIT 1" ); $sth->execute([':company_id' => $this->companyId]); $row = $sth->fetch(PDO::FETCH_ASSOC); if (!$row) { throw new Exception('No SMTP configuration found. Please save your settings first.'); } $mailer = new mailer(['pdo1' => $this->pdo]); $mailer->send_email([ 'company_id' => $this->companyId, 'smtp' => [], 'to' => $to, 'subject' => 'SMTP Test - WMS', 'message' => "This is a test email from your WMS SMTP configuration.\n\nIf you received this, your SMTP settings are working correctly.", 'channel_name' => $row['from_name'] ?: 'WMS System', 'key' => $this->pinkey, ]); } private function update(int $smtp_id, string $server, string $port, string $username, string $raw_pass, string $from_name, string $from_email, string $encryption): void { if ($raw_pass !== '') { $this->pdo->prepare( "UPDATE company_smtp SET server = :server, port = :port, username = :username, password = :password, from_name = :from_name, from_email = :from_email, encryption = :encryption, updated_at = NOW() WHERE smtp_id = :smtp_id" )->execute([ ':server' => $server, ':port' => $port, ':username' => $username, ':password' => $this->encryptPassword($raw_pass), ':from_name' => $from_name, ':from_email' => $from_email, ':encryption' => $encryption, ':smtp_id' => $smtp_id, ]); return; } $this->pdo->prepare( "UPDATE company_smtp SET server = :server, port = :port, username = :username, from_name = :from_name, from_email = :from_email, encryption = :encryption, updated_at = NOW() WHERE smtp_id = :smtp_id" )->execute([ ':server' => $server, ':port' => $port, ':username' => $username, ':from_name' => $from_name, ':from_email' => $from_email, ':encryption' => $encryption, ':smtp_id' => $smtp_id, ]); } private function encryptPassword(string $plain): string { return secret_encrypt($plain, $this->pinkey); } } ?>