# Research: Ferramentas de Migração de E-mail (013)

**Data:** 2026-06-10  
**Autor:** Cursor Agent (para Roger)  
**Objetivo:** Seleccionar stack open-source com precisão, suporte a múltiplos formatos e operação **antes** do cutover DNS.

---

## Critérios de avaliação

| Critério | Peso | Descrição |
|----------|------|-----------|
| **Integridade** | P0 | Sem perda de mensagens; sem duplicatas; preservar pastas |
| **Retomável** | P0 | Sync incremental; reinício após falha |
| **Formatos** | P0 | IMAP, PST, mbox, EML, TGZ (Zimbra/Carbonio) |
| **Verificação** | P0 | Contagens, logs, comparadores |
| **Produção** | P1 | Usado em migrações reais; manutenção activa |
| **OAuth/M365** | P1 | Office 365 / Google modernos |
| **Licença** | P1 | Open source ou uso comercial permitido |

---

## Matriz de ferramentas (decisão)

### 1. IMAP → IMAP (servidor a servidor) — **PRIMÁRIO**

| Ferramenta | Repo / URL | Stars | Veredito |
|------------|------------|-------|----------|
| **imapsync** | https://github.com/imapsync/imapsync | ~4k | ✅ **Escolhido — motor principal** |
| doveadm backup/sync | https://doc.dovecot.org/latest/core/admin/migration.html | — | ✅ Secundário se origem/destino Dovecot |
| offlineimap / mbsync | vários | — | ❌ Menos adequado a migração one-way em massa |

**Porquê imapsync:**
- Padrão de facto para migração IMAP entre fornecedores (cPanel, Zimbra, O365, Gmail → Carbonio).
- Sync **incremental e recursivo** — pode correr dias antes do DNS.
- Evita duplicatas; retomável.
- Suporte OAuth2 via `oauth2_imap` (site oficial imapsync.lamiral.info).
- Documentação extensa (FAQ, casos Exchange/Gmail).

**Quando doveadm:**
- Ambos os lados Dovecot/Carbonio com acesso admin.
- Verificação UIDL mais rigorosa (documentação Dovecot recomenda `diff` manual).

---

### 2. PST / OST (Microsoft Outlook) — **PIPELINE OFICIAL**

| Etapa | Ferramenta | Repo / pacote | Veredito |
|-------|------------|---------------|----------|
| PST → mbox | **readpst** (libpst) | `pst-utils` / https://www.five-ten-sg.com/libpst/ | ✅ Extracção battle-tested |
| mbox → IMAP | **imap-upload** | https://github.com/rgladwell/imap-upload (~148⭐) | ✅ Upload para Carbonio via IMAP |
| Wrapper moderno | **pst2mbox** | https://github.com/beaufour/pst2mbox | ✅ Progress bar, resumível, arquitectura modular |

**Pipeline Ligbox (PST):**
```
.pst → readpst -o mbox -r arquivo.pst
     → imap-upload.py --ssl --host mail.destino --user conta@dominio ...
     → validação contagem + amostra
```

**Riscos PST (mitigação na spec):**
- PST corrompido → `readpst` com log; quarentena em `ERR_MBOX` (flag `--error` do imap-upload).
- RTF vs HTML → não usar `-b` em PST antigos (pré-2010).
- Pastas Outlook → mapear estrutura `readpst` para IMAP com prefixo `INBOX.`.
- **Não** depender só de drag-and-drop Outlook (manual, não auditável).

**pst2mbox** recomendado como wrapper futuro (Fase B) — encapsula readpst + upload com progresso.

---

### 3. Zimbra / Carbonio (mesma família) — **NATIVO**

| Método | Comando | Veredito |
|--------|---------|----------|
| Export TGZ | `zmmailbox -z -m user getRestURL '/?fmt=tgz'` | ✅ Bulk, preserva metadados |
| Import TGZ | `zmmailbox -z -m user postRestURL "/?fmt=tgz&resolve=skip" ficheiro.tgz` | ✅ Destino Carbonio |
| IMAP fallback | imapsync | ✅ Zimbra antigo → Carbonio novo |

**Ordem Zextras Community (referência):**
1. Criar contas no destino  
2. **Migrar dados (TGZ ou imapsync)**  
3. **Só depois** alterar MX/DNS  
4. Sync final pós-DNS  

Fonte: [Zimbra → Carbonio CE migration](https://community.zextras.com/how-to-use-script-to-migrate-zimbra-to-carbonio-carbonio-ce/)

---

### 4. mbox / EML avulso

| Ferramenta | Uso |
|------------|-----|
| imap-upload | mbox → IMAP Carbonio |
| `zmmailbox addMessage` | EML individual no Carbonio (admin) |
| ImportExportTools NG (Thunderbird) | Fallback manual auditado |

---

### 5. Office 365 / Gmail

| Ferramenta | Notas |
|------------|-------|
| imapsync + oauth2_imap | O365 exige OAuth; não usar password básica |
| imap-upload `--office365` / `--gmail` | Upload mbox para destinos cloud |

---

### 6. Ferramentas comerciais (referência — **fora do MVP**)

| Ferramenta | Motivo exclusão MVP |
|------------|---------------------|
| BitRecover / Advik / TrustVare | Fechadas; sem API; sem integração Desk |
| MailStore | Trial; possível Fase C para auditoria legal |

---

## Stack aprovada para Spec 013

```
┌─────────────────────────────────────────────────────────────────┐
│                  Ligbox Ops — Migration Orchestrator            │
│                     (VM122 API + Worker)                        │
└────────────────────────────┬────────────────────────────────────┘
                             │
     ┌───────────────────────┼───────────────────────┐
     │                       │                       │
     ▼                       ▼                       ▼
┌─────────┐          ┌─────────────┐         ┌──────────────┐
│ imapsync│          │ readpst     │         │ zmmailbox    │
│ (IMAP)  │          │ + imap-upload│        │ tgz export/  │
│         │          │ (PST/mbox)  │         │ import       │
└────┬────┘          └──────┬──────┘         └──────┬───────┘
     │                      │                       │
     └──────────────────────┼───────────────────────┘
                            ▼
                   ┌─────────────────┐
                   │ Carbonio VM112  │
                   │ (destino IMAP)  │
                   └─────────────────┘
                            │
                   ┌────────▼────────┐
                   │  GATE: DNS OK   │  ← só após migration_gate=ready
                   └─────────────────┘
```

---

## Verificação de integridade (obrigatória)

| Check | Ferramenta / método |
|-------|---------------------|
| Contagem mensagens por pasta | imapsync log + IMAP `STATUS` / `SEARCH ALL` |
| Contagem global | Script Python `migration_verify.py` (a criar) |
| Amostra corpo/anexos | 5 msgs aleatórias por pasta crítica |
| UIDL (Dovecot) | `doveadm fetch -u user uidl` + diff |
| PST | `readpst -S` stats vs destino |
| Falhas upload | `ERR_MBOX` do imap-upload preservado |

**Regra:** `migration_gate` **bloqueia** cutover DNS se `messages_dest < messages_source * 0.99` ou checks críticos falharem.

---

## Dependências de sistema (worker VM122 ou jump host)

```bash
# Debian/Ubuntu
apt-get install -y imapsync pst-utils python3 python3-pip
pip3 install pst2mbox  # Fase B opcional

# imap-upload
git clone https://github.com/rgladwell/imap-upload.git /opt/migration-tools/imap-upload
```

**Carbonio (VM112):** `zmmailbox`, `zmprov` — já presentes.

---

## Referências

- imapsync: https://github.com/imapsync/imapsync · https://imapsync.lamiral.info/
- Dovecot migration: https://doc.dovecot.org/latest/core/admin/migration.html
- imap-upload: https://github.com/rgladwell/imap-upload
- pst2mbox: https://github.com/beaufour/pst2mbox
- libpst/readpst: https://www.five-ten-sg.com/libpst/
- Carbonio PST forum: https://community.zextras.com/forum/carbonio-general-thread/importing-outlook-pst-files-into-carbonio/
- Zimbra→Carbonio SOP: https://community.zextras.com/how-to-use-script-to-migrate-zimbra-to-carbonio-carbonio-ce/
