feat: IMAP-Posteingang fürs Ticketsystem (Mail-Antworten -> Tickets)
Neues Postfach lässt sich unter Einstellungen > E-Mail > IMAP-Posteingang einrichten (Host/Port/Verschlüsselung/Zugangsdaten/Ordner, An/Aus, Verbindungstest). Der Worker ruft es alle 2 Minuten ab (mailbox.ts) und ordnet eingehende Mails zu: 1. Betreff enthält eine Ticketnummer (T-123) UND Absender gehört nachweislich zum Kunden dieses Tickets -> wird als Kundennachricht angehängt (Status pending_staff, Discord-Benachrichtigung). 2. Sonst, wenn der Absender ein bekannter aktiver Kunde ist -> neues Ticket wird automatisch unter seinem Kundenkonto angelegt. 3. Sonst (unbekannter/nicht verifizierbarer Absender) -> landet im neuen Posteingang (/admin/inbox, UI unter /admin/posteingang) zur manuellen Zuordnung: Personal wählt einen Kunden (legt Ticket an), hängt die Mail an ein bestehendes Ticket, oder ignoriert sie. Beim ersten Aktivieren wird kein Mailbox-Bestand verarbeitet, nur ab dann neu Eingehendes (last_uid wird auf den aktuellen Stand gesetzt). Migration 024: imap_settings (Verbindung, verschlüsseltes Passwort, last_uid/last_error), inbox_messages (Warteschlange). Rechte: email.read/write für die IMAP-Verbindung (wie SMTP), tickets.read/write für den Posteingang (Zuordnung ist eine Ticket-Aktion, daher im Tickets-Modul statt eines eigenen Moduls, um keine Modulgrenzen zu verletzen). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
7d2b2947f4
commit
fe18bf0bce
11 changed files with 651 additions and 3 deletions
37
migrations/024_imap_inbox.sql
Normal file
37
migrations/024_imap_inbox.sql
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
-- IMAP-Postfach für das Ticketsystem: eingehende Mails werden abgerufen, bekannten Tickets/Kunden
|
||||
-- zugeordnet oder als neues Ticket angelegt; unbekannte Absender landen zur manuellen Zuordnung
|
||||
-- im Posteingang (siehe inbox_messages).
|
||||
CREATE TABLE imap_settings (
|
||||
id TINYINT PRIMARY KEY DEFAULT 1,
|
||||
host VARCHAR(253) NULL,
|
||||
port SMALLINT UNSIGNED NOT NULL DEFAULT 993,
|
||||
secure_mode ENUM('tls','starttls') NOT NULL DEFAULT 'tls',
|
||||
username VARCHAR(200) NULL,
|
||||
secrets_enc TEXT NULL,
|
||||
folder VARCHAR(200) NOT NULL DEFAULT 'INBOX',
|
||||
enabled TINYINT(1) NOT NULL DEFAULT 0,
|
||||
last_uid BIGINT UNSIGNED NULL,
|
||||
last_checked_at DATETIME(3) NULL,
|
||||
last_error VARCHAR(500) NULL,
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
updated_by CHAR(36) NULL REFERENCES users(id),
|
||||
CONSTRAINT chk_imap_singleton CHECK (id = 1)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
INSERT INTO imap_settings (id) VALUES (1);
|
||||
|
||||
CREATE TABLE inbox_messages (
|
||||
id CHAR(36) PRIMARY KEY,
|
||||
uid BIGINT UNSIGNED NOT NULL,
|
||||
message_id VARCHAR(998) NULL,
|
||||
from_email VARCHAR(254) NOT NULL,
|
||||
from_name VARCHAR(200) NULL,
|
||||
subject VARCHAR(500) NULL,
|
||||
body_text MEDIUMTEXT NULL,
|
||||
received_at DATETIME(3) NOT NULL,
|
||||
status ENUM('matched','created','unmatched','ignored') NOT NULL DEFAULT 'unmatched',
|
||||
ticket_id CHAR(36) NULL REFERENCES tickets(id),
|
||||
matched_user_id CHAR(36) NULL REFERENCES users(id),
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
UNIQUE KEY uk_inbox_uid (uid),
|
||||
KEY idx_inbox_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
Loading…
Add table
Add a link
Reference in a new issue