Externalize data: URL inline images into managed files
Sanitize illegal filename characters when saving mail attachments to Drive
The "Save to Drive" action (PUT /mail?action=attachment) only replaced "/" with "_" in the attachment file name, leaving other characters that are illegal in file-storage names (":", "", "?", "*", """, "<", ">", "|") to flow down into the storage layer which then rejected the request with FILE_NAME contains illegal characters.
Reuse FilenameValidationUtils.sanitizeName to replace every illegal character with "_", trim trailing dots/whitespace and fall back to a generated default name for reserved names; use MailMessageParser.generateFilename as the fallback so the original sequence id and MIME type drive the substitute name.
Adds FilenameValidationUtilsTest covering the colon scenario from the support ticket plus the existing replacement, trim, reserved-name and Unicode cases.
Send failure notification for scheduled mails even when transport setup fails
Surface legacy single-schema pools in listdatabaseschema and runallupdate
Orphaned mail accounts with oauth=0 disappear from account list
Reject 0 as a valid OAuth account identifier across all mail account read/write paths (DB layer, cache codec, user-copy provisioning) and add an update task that migrates pre-existing 0 values to NULL.
Added possibility to log all connection-using thread on "too many connections" error
Changed: Added possibility to log all connection-using thread on "too many connections" error - /appsuite/support#1363
Changed: Add jitter/offset to periodic (general) clean-up jobs to avoid start burst - /appsuite/support#1363
Fixed: Reduce configdb pressure of nightly cleanup runs - appsuite/support#1363
Mitigates the synchronized configdb-connection burst at the beginning of the nightly cleanup window that surfaces as DBP-0001 / "too many connections" against the cluster:
Mix a per-node salt (hostname + random component) into the deterministic per-job offset so that the same job is started in a different slot on every pod, preventing the cluster-wide synchronized burst that pure jobId.hashCode()-based offsets produced.
Make the per-job schema concurrency configurable via com.openexchange.database.cleanup.schemaConcurrencyLevel (default 4 instead of the previously hard-coded 10), which is the main multiplier for parallel configdb access per pod.
Add a global hard cap on concurrent configdb schema look-ups via com.openexchange.database.cleanup.maxConcurrentSchemaLookups (default 8), independent of concurrencylevel/schemaConcurrencyLevel.
Pre-resolve representativeContextId -> PoolAndSchema in a single batch lookup per cleanup run and pass it through to CleanUpJobRunnable, so per-schema cleanup no longer issues an additional configdb roundtrip per schema.
Add a soft submission ramp-up at the start of the schedule window via com.openexchange.database.cleanup.rampUpMillis (default 60s) on top of the existing jitter, eliminating the exact window-boundary spike independent of hash collisions.
Treat Category.CATEGORY_SERVICE_DOWN (e.g. DBP-0001 "Cannot get connection to config DB" / "Cannot create pooled object") as retry-able with exponential back-off and jitter both for per-schema execution and for uncached configdb schema look-ups, so the pool can recover instead of being hammered while saturated.