#pArchiveSources
nextxch Archive:将 Microsoft 365、Exchange、Google Workspace 和 IMAP 纳入 GoBD 归档
nextxch Archive 将未在 nextxch 上运行的系统中的邮件纳入 GoBD 归档。管理后台的“合规 > 归档源”下提供四种源类型:SMTP 日记(来自 Microsoft 365 和 Exchange 的日记报告、来自 Google Workspace 的副本规则、来自任意 MTA 的密件抄送副本)、IMAP(任意服务器,只读)、通过 Microsoft Graph 接入的 Microsoft 365,以及通过 Gmail API 接入的 Google Workspace。源中的每个邮箱都会成为已归档邮箱,无需登录,也不产生邮件流量;搜索、法律保留、证据导出和还原对其的作用与对您自己的邮箱相同。
推荐组合:使用 SMTP 日记从截止日期起完整持续采集(用户在邮件被采集前无法删除任何内容),另外使用 API 源一次性或以较长间隔获取现有邮件和文件夹视图。两者写入同一个归档;得益于 SHA-256,被采集两次的邮件只存储一次。许可证:其他系统的已归档邮箱是单独的许可证项,您自己的 nextxch 邮箱不计入其中。每个档位均免费提供 10 个已归档邮箱,更多数量需 Business 或 Enterprise 许可证。
1. 快速入门:为 Microsoft 365 创建日记源
新源创建后处于禁用状态。请先测试连接,然后启用该源。如果只指定了域,服务器会生成带秘密令牌的日记地址;其 MX 必须指向 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. 来自 Exchange 本地部署和 Google Workspace 的日记
Exchange 本地部署:使用相同日记地址的日记规则(高级日记,需要 Exchange Enterprise CAL),或按邮箱数据库向该地址进行标准日记;在混合环境中,还需在本地 Exchange 服务器上创建该规则。Google Workspace:路由规则将日记地址添加为额外收件人;无需 Google Vault。启用 "Comprehensive mail storage" 后,来自 SMTP 中继和 Google 服务的邮件也会进入邮箱。任何其他 MTA 向日记地址发送密件抄送副本。
# 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:任意服务器,只读
文件夹以 EXAMINE 方式打开,内容通过 BODY.PEEK[] 获取,源端的标记永不改变。每个文件夹的游标(UIDVALIDITY、上一个 UID、配合 CONDSTORE 的 HIGHESTMODSEQ)在每封邮件处理后更新,中断后会从该处准确继续。TLS 为必需(隐式或 STARTTLS),可选固定证书 (SHA-256);使用密码或 XOAUTH2 登录,支持单个账户或账户列表。默认跳过已删除和垃圾邮件文件夹。
{
"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 Graph 接入 Microsoft 365:在 Entra ID 中注册应用
该源通过按文件夹的增量查询读取现有邮件和新邮件,不使用 EWS(Microsoft 将在 Exchange Online 中停用 EWS)。Microsoft Graph 中需经管理员同意的应用程序权限:Mail.Read 和 User.Read.All,仅在使用用户筛选器 "group" 时需要 GroupMember.Read.All。使用证书(推荐)或客户端密码登录,云环境支持 global、usgov、usgovdod 和 china。遵守 Graph 限流(429 和 Retry-After),运行会从最后一个完整处理的页面继续。在源端删除的邮件仍保留在归档中。可选地,Exchange Online RBAC for Applications 可将访问权限限制在一个组内。
# 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. 通过 Gmail API 接入 Google Workspace:服务账户和全域委派
在客户自己的 Google Cloud 项目中创建服务账户(Gmail 配额按项目计算),并启用 Gmail API 和 Admin SDK API。在管理控制台中,为其数字客户端 ID 授权全域委派,作用域为 gmail.readonly 和 admin.directory.user.readonly,使用 "group" 筛选器时另需 admin.directory.group.member.readonly。通过 messages.list 和 messages.get (raw) 进行初始导入,然后进行历史同步;如果历史记录已过期,导入会重新开始,已归档的邮件计为重复。每个用户和项目的配额预算可调整。
# 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. 存储、WORM 保留和法律保留
每个已归档邮箱在 GoBD 归档中都有自己的仅归档存储。每封邮件:带跨所有邮箱去重的 SHA-256 内容地址、按邮箱基于 SHA-256 和 Message-ID 的重复检查、作用于 Blob 和邮件的源端 WORM 保留和法律保留、作为防篡改证据的哈希链,以及全文索引。每次运行的历史记录会统计已存储、重复和被拒绝的邮件。
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. 搜索、导出、还原
已归档邮箱可在合规搜索中作为单独的范围选择(支持复合词拆分的德语搜索、附件 OCR、ZUGFeRD 字段),并且在列表中各自带有搜索、证据导出和还原按钮。证据导出提供包含原始 .eml 文件和 Ed25519 签名清单的 ZIP(参见第 17a 章)。还原会复制到 nextxch 邮箱中,归档保持不变。目前尚不支持还原回 Microsoft 365、Google 或 IMAP 服务器,可通过导出实现。搜索在所有档位中提供,证据导出和还原作业自 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:/api/admin/archive-sources
TenantAdmin 在自己的租户内,ServerAdmin 在所有范围内;ComplianceAuditor 可读取(用于选择要搜索和导出的已归档邮箱),但从不更改任何内容。Kind 为 Journal、Imap、Microsoft365 或 Google。超出许可证配额启用邮箱会被拒绝,并显示包含当前许可证项的消息。日记源通过 SMTP 接收,不会为其执行运行(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" }'
设置、默认值与最佳实践
| 设置 / 位置 | 说明 | 默认值 | 生产环境最佳实践 |
|---|---|---|---|
Journal: Domains (domains) |
只有这些域及其子域的信封地址才会成为已归档邮箱(在启用自动发现时首次出现即成为已归档邮箱)。没有匹配地址的邮件会进入该源的 "journal without assignment" 存储,该存储不计入许可证。 | leer · automatische Erkennung an |
请输入旧环境的所有域,否则分配中会缺少邮箱。 |
Journal: Schutz (allowedSenderNetworks, requireTls, allowedEnvelopeSenders) |
发送服务器的允许 IP 地址或 CIDR 范围、仅通过 TLS 接收(STARTTLS 或隐式)以及允许的信封发件人(地址、*@domain 或 domain)。日记地址需要 IP 列表,或在其本地部分包含秘密令牌(至少 16 个字符,由服务器生成)。 | keine IP-Liste · TLS aus · alle Absender |
设置服务商的 IP 范围并要求 TLS;同时保留令牌。 |
Journal: Format (format) |
auto 通过 X-MS-Journal-Report 识别日记报告;envelope 强制按 Exchange 或 Microsoft 365 报告解析,bcc 将每封邮件视为副本(Google 副本规则、其他 MTA)。 | auto |
除非某个 MTA 发送带有自定义标头的密件抄送副本,否则请保持 auto。 |
Aufbewahrung (RetentionDays, LockMode) |
按源设置以天为单位的 WORM 保留期(0 到 36,500,0 = 无 WORM 保留),模式为 Normal、Governance 或 Compliance。适用于每封已归档邮件的 Blob 和邮件本身。 | Compliance |
请选择商业信函和会计凭证的法定期限;Compliance 在到期前无法解除。 |
Legal Hold (LegalHold) |
锁定该源的所有邮件,防止删除,即使超过保留期也同样有效。启用后,保留也会应用到已归档的邮件;每次更改都会记录在审计日志中。 | aus |
因诉讼或审计而启用,仅在法务部门批准后才解除。 |
Zeitplan und Erkennung (ScheduleMinutes, AutoDiscover) |
API 源(IMAP、Microsoft 365、Google)的获取间隔为 5 分钟到 7 天;在集群中只有主节点执行获取。日记源通过 SMTP 接收,没有计划。 | 60 min |
对于大型租户的初始导入,请手动启动运行,并按邮箱查看历史记录。 |
Geheimnisse (Secrets) |
密码、客户端密码、证书和服务账户密钥均加密存储在服务器密钥环中。它们为只写:API 响应只包含其名称,从不包含值,也从不出现在日志中。 | verschlüsselt |
请注意客户端密码和证书的到期时间;连接测试会报告已过期的密码。 |