Lisää SMTP-lähetystuki postilaatikoihin

Aiemmin sähköpostit lähetettiin PHP mail()-funktiolla, mikä
ei toimi kunnolla useimmilla palvelimilla (SPF/DKIM-ongelmat).
Nyt mailboxiin voi konfiguroida SMTP-asetukset (host, port,
user, pass, encryption), ja lähetys tapahtuu suoraan
SMTP-palvelimen kautta socket-yhteydellä. Fallback PHP
mail():iin jos SMTP-asetuksia ei ole asetettu.

- db.php: smtp_host/port/user/password/encryption sarakkeet
- api.php: sendViaSMTP() socket-pohjainen SMTP-client
- index.html: SMTP-kentät mailbox-lomakkeeseen
- script.js: SMTP-kenttien luku/kirjoitus lomakkeessa

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 22:46:28 +02:00
parent a13f3e00a5
commit 78f25d0079
4 changed files with 191 additions and 6 deletions

24
db.php
View File

@@ -309,6 +309,11 @@ function initDatabase(): void {
imap_user VARCHAR(255),
imap_encryption VARCHAR(10) DEFAULT 'ssl',
imap_password VARCHAR(255),
smtp_host VARCHAR(255) DEFAULT '',
smtp_port INT DEFAULT 587,
smtp_user VARCHAR(255) DEFAULT '',
smtp_password VARCHAR(255) DEFAULT '',
smtp_encryption VARCHAR(10) DEFAULT 'tls',
smtp_from_email VARCHAR(255),
smtp_from_name VARCHAR(255),
aktiivinen BOOLEAN DEFAULT TRUE,
@@ -431,6 +436,11 @@ function initDatabase(): void {
"ALTER TABLE customer_connections ADD COLUMN laite VARCHAR(100) DEFAULT '' AFTER vlan",
"ALTER TABLE customer_connections ADD COLUMN portti VARCHAR(100) DEFAULT '' AFTER laite",
"ALTER TABLE customer_connections ADD COLUMN ip VARCHAR(100) DEFAULT '' AFTER portti",
"ALTER TABLE mailboxes ADD COLUMN smtp_host VARCHAR(255) DEFAULT '' AFTER smtp_from_name",
"ALTER TABLE mailboxes ADD COLUMN smtp_port INT DEFAULT 587 AFTER smtp_host",
"ALTER TABLE mailboxes ADD COLUMN smtp_user VARCHAR(255) DEFAULT '' AFTER smtp_port",
"ALTER TABLE mailboxes ADD COLUMN smtp_password VARCHAR(255) DEFAULT '' AFTER smtp_user",
"ALTER TABLE mailboxes ADD COLUMN smtp_encryption VARCHAR(10) DEFAULT 'tls' AFTER smtp_password",
];
foreach ($alters as $sql) {
try { $db->query($sql); } catch (\Throwable $e) { /* sarake on jo olemassa / jo ajettu */ }
@@ -1148,6 +1158,7 @@ function dbLoadMailboxes(string $companyId): array {
foreach ($boxes as &$b) {
$b['aktiivinen'] = (bool)$b['aktiivinen'];
$b['imap_port'] = (int)$b['imap_port'];
$b['smtp_port'] = (int)($b['smtp_port'] ?? 587);
unset($b['company_id']);
}
return $boxes;
@@ -1155,13 +1166,15 @@ function dbLoadMailboxes(string $companyId): array {
function dbSaveMailbox(string $companyId, array $mailbox): void {
_dbExecute("
INSERT INTO mailboxes (id, company_id, nimi, imap_host, imap_port, imap_user, imap_encryption, imap_password, smtp_from_email, smtp_from_name, aktiivinen)
VALUES (:id, :company_id, :nimi, :imap_host, :imap_port, :imap_user, :imap_encryption, :imap_password, :smtp_from_email, :smtp_from_name, :aktiivinen)
INSERT INTO mailboxes (id, company_id, nimi, imap_host, imap_port, imap_user, imap_encryption, imap_password, smtp_from_email, smtp_from_name, smtp_host, smtp_port, smtp_user, smtp_password, smtp_encryption, aktiivinen)
VALUES (:id, :company_id, :nimi, :imap_host, :imap_port, :imap_user, :imap_encryption, :imap_password, :smtp_from_email, :smtp_from_name, :smtp_host, :smtp_port, :smtp_user, :smtp_password, :smtp_encryption, :aktiivinen)
ON DUPLICATE KEY UPDATE
nimi = VALUES(nimi), imap_host = VALUES(imap_host), imap_port = VALUES(imap_port),
imap_user = VALUES(imap_user), imap_encryption = VALUES(imap_encryption),
imap_password = VALUES(imap_password), smtp_from_email = VALUES(smtp_from_email),
smtp_from_name = VALUES(smtp_from_name), aktiivinen = VALUES(aktiivinen)
smtp_from_name = VALUES(smtp_from_name), smtp_host = VALUES(smtp_host), smtp_port = VALUES(smtp_port),
smtp_user = VALUES(smtp_user), smtp_password = VALUES(smtp_password),
smtp_encryption = VALUES(smtp_encryption), aktiivinen = VALUES(aktiivinen)
", [
'id' => $mailbox['id'],
'company_id' => $companyId,
@@ -1173,6 +1186,11 @@ function dbSaveMailbox(string $companyId, array $mailbox): void {
'imap_password' => $mailbox['imap_password'] ?? '',
'smtp_from_email' => $mailbox['smtp_from_email'] ?? '',
'smtp_from_name' => $mailbox['smtp_from_name'] ?? '',
'smtp_host' => $mailbox['smtp_host'] ?? '',
'smtp_port' => $mailbox['smtp_port'] ?? 587,
'smtp_user' => $mailbox['smtp_user'] ?? '',
'smtp_password' => $mailbox['smtp_password'] ?? '',
'smtp_encryption' => $mailbox['smtp_encryption'] ?? 'tls',
'aktiivinen' => $mailbox['aktiivinen'] ?? true,
]);
}