Files
OpenArchiver/docs/enterprise/retention-policy/index.md
Wei S. e5e119528f V0.5.0 release (#335)
* adding exports to backend package, page icons update

* Integrity report PDF generation

* Fixed inline attachment images not displaying in the email preview by modifying `EmailPreview.svelte`.
The email HTML references embedded images via `cid:` URIs (e.g., `src="cid:ii_19c6d5f8d5eee7bd6d91"`), but the component never resolved those `cid:` references to actual image data, even though `postal-mime` already parses inline attachments with their `contentId` and binary `content`.
The `emailHtml` derived value now calls `resolveContentIdReferences()` before rendering, so inline/embedded images display correctly in the iframe preview.

* feat: strip non-inline attachments from EML before storage

Add nodemailer dependency and emlUtils helper to remove non-inline
attachments from .eml buffers during ingestion. This avoids
double-storing attachment data since attachments are already stored
separately.

* upload error handing for file based ingestion

* Use Postgres for sync session management

* Google workspace / MS 365 duplicate check, avoid extra API call when previous ingestion fails

* OpenAPI specs for API docs

* code formatting

* ran duplicate check for IMAP import, optimize message listing

* Version update
2026-03-20 13:14:41 +01:00

4.6 KiB

Retention Policy

The Retention Policy Engine is an enterprise-grade feature that automates the lifecycle management of archived emails. It enables organizations to define time-based retention rules that determine how long archived emails are kept before they are permanently deleted, ensuring compliance with data protection regulations and internal data governance policies.

Core Principles

1. Policy-Based Automation

Email deletion is never arbitrary. Every deletion is governed by one or more explicitly configured retention policies that define the retention period in days, the conditions under which the policy applies, and the action to take when an email expires. The lifecycle worker processes emails in batches on a recurring schedule, ensuring continuous enforcement without manual intervention.

2. Condition-Based Targeting

Policies can target specific subsets of archived emails using a flexible condition builder. Conditions are evaluated against email metadata fields (sender, recipient, subject, attachment type) using a variety of string-matching operators. Conditions within a policy are grouped using AND/OR logic, allowing precise control over which emails a policy applies to.

3. Ingestion Scope

Each policy can optionally be scoped to one or more ingestion sources. When an ingestion scope is set, the policy only applies to emails that were archived from those specific sources. Policies with no ingestion scope (null) apply to all emails regardless of their source.

4. Priority and Max-Duration-Wins

When multiple policies match a single email, the system applies max-duration-wins logic: the longest matching retention period is used. This ensures that if any policy requires an email to be kept longer, that requirement is honored. The priority field on each policy provides an ordering mechanism for administrative purposes and future conflict-resolution enhancements.

5. Full Audit Trail

Every policy lifecycle event — creation, modification, deletion, and every automated email deletion — is recorded in the immutable Audit Log. Automated deletions include the IDs of the governing policies in the audit log entry, ensuring full traceability from deletion back to the rule that triggered it.

6. Fail-Safe Behavior

The system is designed to err on the side of caution:

  • If no policy matches an email, the email is not deleted.
  • If the lifecycle worker encounters an error processing a specific email, it logs the error and continues with the remaining emails in the batch.
  • Invalid regex patterns in regex_match rules are treated as non-matching rather than causing failures.

Feature Requirements

The Retention Policy Engine requires:

  • An active Enterprise license with the RETENTION_POLICY feature enabled.
  • The manage:all permission for the authenticated user to access the policy management API and UI.

Architecture Overview

The feature is composed of the following components:

Component Location Description
Types packages/types/src/retention.types.ts Shared TypeScript types for policies, rules, and evaluation.
Database Schema packages/backend/src/database/schema/compliance.ts Drizzle ORM table definition for retention_policies.
Retention Service packages/enterprise/src/modules/retention-policy/RetentionService.ts CRUD operations and the evaluation engine.
API Controller packages/enterprise/src/modules/retention-policy/retention-policy.controller.ts Express request handlers with Zod validation.
API Routes packages/enterprise/src/modules/retention-policy/retention-policy.routes.ts Route registration with auth and feature guards.
Module packages/enterprise/src/modules/retention-policy/retention-policy.module.ts Enterprise module bootstrap.
Lifecycle Worker packages/enterprise/src/workers/lifecycle.worker.ts BullMQ worker for automated retention enforcement.
Frontend Page packages/frontend/src/routes/dashboard/compliance/retention-policies/ SvelteKit page for policy management and simulation.