#pArchiveSources
nextxch Archive: Microsoft 365, Exchange, Google Workspace e IMAP nell'archivio GoBD
nextxch Archive porta nell'archivio GoBD la posta dei sistemi che non girano su nextxch. Nell'admin sono disponibili quattro tipi di origine in Compliance > Origini di archiviazione: journal SMTP (rapporti di journal da Microsoft 365 ed Exchange, regola di copia da Google Workspace, copie in Ccn da qualsiasi MTA), IMAP (qualsiasi server, sola lettura), Microsoft 365 tramite Microsoft Graph e Google Workspace tramite la Gmail API. Ogni casella di posta dell'origine diventa una casella di posta archiviata, senza accesso e senza traffico di posta; ricerca, Legal Hold, esportazione probatoria e ripristino funzionano su di essa come sulle proprie caselle di posta.
Combinazione consigliata: il journal SMTP per l'acquisizione continua e completa a partire da una data di riferimento (gli utenti non possono eliminare nulla prima che venga acquisito), più l'origine API una tantum o a lunghi intervalli per la posta esistente e la vista per cartelle. Entrambi scrivono nello stesso archivio; un messaggio acquisito due volte viene memorizzato una sola volta grazie a SHA-256. Licenza: le caselle di posta archiviate di altri sistemi sono una voce di licenza separata, le proprie caselle di posta nextxch non vi rientrano. 10 caselle di posta archiviate sono gratuite in ogni livello, ulteriori caselle sono incluse con una licenza Business o Enterprise.
1. Avvio rapido: creare un'origine journal per Microsoft 365
Le nuove origini partono disattivate. Testare la connessione, quindi attivare l'origine. Se viene indicato solo il dominio, il server genera l'indirizzo di journal con un token segreto; il suo MX deve puntare a nextxch.
# 1. Admin > Compliance > Archive sources > New source, kind "SMTP journal"
# Domains of the old environment: company.com · journal domain: archive.company.com
# -> journal address e.g. journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com (copy it)
# 2. Protection: IP ranges of the Exchange Online servers, TLS required, allowed envelope senders
# 3. Microsoft Purview: Solutions > Data lifecycle management > Exchange (legacy) > Journal rules
# or Exchange Online PowerShell:
Set-TransportConfig -JournalingReportNdrTo journal-ndr@archive.company.com
New-JournalRule -Name "nextxch Archive" -JournalEmailAddress journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com -Scope Global -Enabled $true
Get-JournalRule | Format-Table Name,Enabled,JournalEmailAddress,Scope
# 4. Send a test message: the source shows the original with all envelope recipients (including Bcc)
2. Journal da Exchange on-premise e Google Workspace
Exchange on-premise: regola di journal con lo stesso indirizzo di journal (journaling premium, richiede la Exchange Enterprise CAL) oppure journaling standard per database di caselle di posta verso quell'indirizzo; in un ambiente ibrido creare la regola anche sul server Exchange on-premise. Google Workspace: una regola di routing aggiunge l'indirizzo di journal come destinatario aggiuntivo; Google Vault non è necessario. Con "Comprehensive mail storage" anche la posta dall'SMTP relay e dai servizi Google arriva nelle caselle di posta. Qualsiasi altro MTA invia copie in Ccn all'indirizzo di journal.
# Exchange Server (Exchange Management Shell)
New-JournalRule -Name "nextxch Archive" -JournalEmailAddress journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com -Scope Global -Enabled $true
# Google Admin console: Menu > Apps > Google Workspace > Gmail > Routing > Configure
# Messages to affect: inbound, outbound, internal inbound, internal outbound
# Action: Modify message > Add more recipients > Advanced > journal address
# Optional: do not deliver spam to this recipient, suppress bounces from this recipient
# Journal source in nextxch: format bcc or auto, IP ranges of Google's outbound servers, TLS required
3. IMAP: qualsiasi server, sola lettura
Le cartelle vengono aperte con EXAMINE e il contenuto viene recuperato con BODY.PEEK[], i flag sull'origine non cambiano mai. Un cursore per cartella (UIDVALIDITY, ultimo UID, HIGHESTMODSEQ con CONDSTORE) viene aggiornato dopo ogni messaggio, un'interruzione riprende esattamente da lì. TLS è obbligatorio (implicito o STARTTLS), facoltativamente con certificato fissato (SHA-256); accesso con password o XOAUTH2, un account o un elenco di account. Cestino e spam vengono saltati per impostazione predefinita.
{
"host": "imap.oldhoster.com",
"tls": "implicit",
"auth": "password",
"mode": "single",
"username": "accounting@company.com",
"address": "accounting@company.com",
"excludeFolders": ["Drafts"],
"since": "2016-01-01",
"maxConnections": 2
}
# Secret: password (or oauthToken with xoauth2), in list mode accounts/<id>/password
4. Microsoft 365 tramite Microsoft Graph: registrazione dell'app in Entra ID
L'origine legge la posta esistente e nuova con query delta per cartella, senza EWS (Microsoft dismette EWS in Exchange Online). Autorizzazioni dell'applicazione in Microsoft Graph con consenso dell'amministratore: Mail.Read e User.Read.All, GroupMember.Read.All solo con il filtro utenti "group". Accesso con certificato (consigliato) o client secret, cloud global, usgov, usgovdod e china. Il throttling di Graph (429 con Retry-After) viene rispettato, un'esecuzione riprende dall'ultima pagina elaborata completamente. I messaggi eliminati sull'origine restano nell'archivio. Facoltativamente, Exchange Online RBAC for Applications limita l'accesso a un gruppo.
# Entra admin center > App registrations > New registration "nextxch Archive" (single tenant)
# API permissions > Microsoft Graph > Application permissions:
# Mail.Read, User.Read.All (+ GroupMember.Read.All with group filter) > Grant admin consent
# Certificates & secrets: upload a certificate (.cer) or create a client secret
{
"tenantId": "company.onmicrosoft.com",
"clientId": "11111111-2222-3333-4444-555555555555",
"credentialType": "certificate",
"cloud": "global",
"userFilter": { "mode": "group", "groupId": "99999999-0000-0000-0000-000000000009" },
"sinceUtc": "2019-01-01T00:00:00Z"
}
# Secrets: certificatePfx (Base64) + certificatePassword or clientSecret (the value, not the ID)
5. Google Workspace tramite la Gmail API: account di servizio e delega a livello di dominio
Un account di servizio nel progetto Google Cloud del cliente (le quote Gmail si contano per progetto) con la Gmail API e la Admin SDK API attivate. Nella Admin console il suo ID client numerico viene autorizzato alla delega a livello di dominio con gli ambiti gmail.readonly e admin.directory.user.readonly, più admin.directory.group.member.readonly per il filtro "group". Importazione iniziale tramite messages.list e messages.get (raw), poi sincronizzazione della cronologia; se la cronologia è scaduta, l'importazione riparte e i messaggi già archiviati contano come duplicati. Il budget di quota per utente e per progetto è regolabile.
# Admin console: Security > Access and data control > API controls > Domain-wide delegation
# client ID (numeric) + scopes:
# https://www.googleapis.com/auth/gmail.readonly,
# https://www.googleapis.com/auth/admin.directory.user.readonly
{
"adminSubject": "admin@company.com",
"domain": "company.com",
"userFilter": "orgUnit",
"orgUnitPath": "/Sales",
"sinceUtc": "2018-01-01T00:00:00Z",
"quotaUnitsPerUserMinute": 4800
}
# Secret: serviceAccountKey (JSON key file of the service account)
6. Archiviazione, conservazione WORM e Legal Hold
Ogni casella di posta archiviata ha un proprio store di sola archiviazione nell'archivio GoBD. Per ogni messaggio: indirizzo di contenuto SHA-256 con deduplicazione su tutte le caselle di posta, controllo dei duplicati per casella di posta tramite SHA-256 e Message-ID, conservazione WORM e Legal Hold dell'origine su blob e messaggio, una catena di hash come prova di manomissione e un indice full-text. La cronologia per esecuzione conta i messaggi memorizzati, duplicati e rifiutati.
Retention RetentionDays 0..36500 (0 = no WORM retention)
Mode Normal | Governance | Compliance (default)
Legal hold per source, also applies to already archived messages
Storage local or S3 with Object Lock (like the rest of the GoBD archive)
Status per mailbox: last run, next run, stored, duplicates, rejected, errors
7. Ricerca, esportazione, ripristino
Le caselle di posta archiviate possono essere selezionate come ambito separato nella ricerca di compliance (ricerca in tedesco con scomposizione delle parole composte, OCR negli allegati, campi ZUGFeRD) e ciascuna ha nell'elenco i pulsanti per ricerca, esportazione probatoria e ripristino. L'esportazione probatoria fornisce uno ZIP con i file .eml originali e un manifesto firmato Ed25519 (vedere il capitolo 17a). Il ripristino copia in una casella di posta nextxch, l'archivio resta invariato. Il ripristino in Microsoft 365, Google o nel server IMAP non è ancora disponibile; l'esportazione copre questo caso. Ricerca in ogni livello, job di esportazione probatoria e ripristino da Business.
# Search in an archived mailbox
curl -s "https://mail.company.com/api/compliance/search?archivedMailboxId=<id>&q=invoice&limit=100" -H "X-Api-Key: $KEY"
# Evidence export of an archived mailbox (202, status under GET /api/compliance/exports/{id})
curl -X POST https://mail.company.com/api/compliance/exports -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
-d '{"scope":"mailbox","archivedMailboxId":"<id>","caseReference":"case 4711"}'
# Restore into a nextxch mailbox
curl -X POST https://mail.company.com/api/compliance/restore/jobs -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
-d '{"source":"archive","account":"archived:<id>","target":"account","targetAccount":"successor@company.com"}'
8. API di amministrazione: /api/admin/archive-sources
TenantAdmin all'interno del proprio tenant, ServerAdmin ovunque; il ComplianceAuditor legge (per scegliere le caselle di posta archiviate per ricerca ed esportazione) ma non modifica mai nulla. Kind è Journal, Imap, Microsoft365 o Google. L'attivazione di una casella di posta oltre la quota della licenza viene rifiutata con un messaggio che riporta la voce di licenza attuale. Le origini journal ricevono via SMTP, per esse non esiste un'esecuzione (409 JOURNAL_IS_PUSHED).
GET /api/admin/archive-sources sources, licence line, available kinds with fields
GET /api/admin/archive-sources/license used, allowed, free, remaining
POST /api/admin/archive-sources create a source
GET /api/admin/archive-sources/{id} source, mailboxes, names of the secrets
PUT /api/admin/archive-sources/{id} change (settings, retention, legal hold, schedule)
DELETE /api/admin/archive-sources/{id} delete
POST /api/admin/archive-sources/{id}/test connection test
POST /api/admin/archive-sources/{id}/discover discover mailboxes
GET /api/admin/archive-sources/{id}/mailboxes archived mailboxes
PUT /api/admin/archive-sources/{id}/mailboxes/{mbxId} {"enabled": true} within the licence line
POST /api/admin/archive-sources/{id}/run fetch now, optionally {"mailboxId": "..."}
GET /api/admin/archive-sources/{id}/runs history (mailboxId, limit)
curl -X POST https://mail.company.com/api/admin/archive-sources -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d '{
"kind": "Journal", "name": "Microsoft 365 journal", "journalDomain": "archive.company.com",
"settings": { "domains": ["company.com"], "allowedSenderNetworks": ["203.0.113.0/24"], "requireTls": true },
"retentionDays": 3650, "lockMode": "Compliance" }'
Impostazioni, valori predefiniti e best practice
| Impostazione / posizione | Descrizione | Valore predefinito | Best practice per la produzione |
|---|---|---|---|
Journal: Domains (domains) |
Solo gli indirizzi envelope di questi domini e dei relativi sottodomini diventano caselle di posta archiviate (alla prima occorrenza, finché il rilevamento automatico è attivo). I messaggi senza un indirizzo corrispondente finiscono nello store "journal senza assegnazione" dell'origine, che non viene conteggiato nella licenza. | leer · automatische Erkennung an |
Inserire tutti i domini del vecchio ambiente, altrimenti mancheranno caselle di posta nell'assegnazione. |
Journal: Schutz (allowedSenderNetworks, requireTls, allowedEnvelopeSenders) |
Indirizzi IP o intervalli CIDR consentiti dei server mittenti, accettazione solo tramite TLS (STARTTLS o implicito) e mittenti envelope consentiti (indirizzo, *@dominio o dominio). Un indirizzo di journal richiede un elenco IP oppure un token segreto nella parte locale (almeno 16 caratteri, generato dal server). | keine IP-Liste · TLS aus · alle Absender |
Impostare gli intervalli IP del provider e richiedere TLS; mantenere anche il token. |
Journal: Format (format) |
auto riconosce un rapporto di journal da X-MS-Journal-Report; envelope forza l'analisi come rapporto di Exchange o Microsoft 365, bcc tratta ogni messaggio come copia (regola di copia di Google, altri MTA). | auto |
Lasciare auto, a meno che un MTA non invii copie in Ccn con intestazioni proprie. |
Aufbewahrung (RetentionDays, LockMode) |
Conservazione WORM in giorni per origine (da 0 a 36.500, 0 = nessuna conservazione WORM) con modalità Normal, Governance o Compliance. Si applica al blob e al messaggio di ogni e-mail archiviata. | Compliance |
Scegliere il periodo di legge per la corrispondenza commerciale e le scritture contabili; Compliance non può essere revocata prima della scadenza. |
Legal Hold (LegalHold) |
Blocca tutti i messaggi dell'origine contro l'eliminazione, anche oltre il periodo di conservazione. Quando viene attivato, il blocco si applica anche ai messaggi già archiviati; ogni modifica viene registrata nel registro di audit. | aus |
Attivarlo in caso di contenzioso o audit e revocarlo solo dopo il nulla osta dell'ufficio legale. |
Zeitplan und Erkennung (ScheduleMinutes, AutoDiscover) |
Intervallo di recupero delle origini API (IMAP, Microsoft 365, Google) da 5 minuti a 7 giorni; in un cluster recupera solo il leader. Le origini journal ricevono via SMTP e non hanno pianificazione. | 60 min |
Per l'importazione iniziale di tenant di grandi dimensioni avviare l'esecuzione manualmente e seguire la cronologia per casella di posta. |
Geheimnisse (Secrets) |
Password, client secret, certificati e chiavi degli account di servizio vengono memorizzati cifrati nel keyring del server. Sono di sola scrittura: le risposte dell'API riportano solo i loro nomi, mai i valori, e non compaiono mai nei log. | verschlüsselt |
Tenere presente la scadenza del client secret e del certificato; il test di connessione segnala un secret scaduto. |