go-imapsync: migração de caixas IMAP com um único binário em Go

go-imapsync: sincronização IMAP em Go

Quem já precisou migrar caixas de e-mail entre servidores conhece o imapsync, a clássica ferramenta em Perl do Gilles Lamiral. Ela resolve o problema, mas arrasta uma cadeia de dependências de módulos Perl que nem sempre é divertida de instalar. O go-imapsync é uma reimplementação do essencial do imapsync em Go: sincronização IMAP one-way e incremental de host1 → host2, sem duplicados, distribuída como um único binário estático — sem runtime, sem dependências, é baixar e rodar.

O que ele faz

O go-imapsync conecta em duas contas IMAP ao mesmo tempo (origem e destino), replica a árvore de pastas e copia as mensagens que ainda não existem no destino, preservando flags (lida, respondida, etc.) e a data interna de cada mensagem. A detecção de duplicados usa cabeçalhos (Message-Id e Received, o mesmo modelo do imapsync original), então você pode rodar quantas vezes quiser: cada execução é incremental e só transfere o que falta.

Recursos do MVP atual:

  • SSL/IMAPS (padrão, porta 993) e STARTTLS
  • Listagem recursiva de pastas na origem + criação automática no destino
  • FETCH/APPEND das mensagens com flags e data interna preservadas
  • Pulo de duplicados por cabeçalho — execução incremental e re-executável
  • Modos seguros de teste: --dry e --justfolders
  • Resumo ao final da execução e exit codes bem definidos (0 sucesso, 1 falha de execução, 2 erro de uso/configuração — ótimo para scripts)

Instalação

A forma mais rápida é baixar o binário pronto na página de Releases. Há builds para Linux x86_64, macOS Apple Silicon e Windows x86_64:

wget https://github.com/jniltinho/go-imapsync/releases/download/v0.1.3/go-imapsync_0.1.3_linux_amd64.tar.gz
tar xzf go-imapsync_0.1.3_linux_amd64.tar.gz
sudo mv go-imapsync /usr/local/bin/
go-imapsync version

Prefere compilar? Com Go 1.26+ instalado:

git clone https://github.com/jniltinho/go-imapsync.git
cd go-imapsync
make build     # binário estático em dist/go-imapsync
make test      # go test -race ./...

Uso: comece devagar

A filosofia é a mesma dos exemplos do imapsync clássico: valide antes de transferir. A sequência segura é rodar primeiro só as pastas em modo simulação, depois criar as pastas de verdade, depois simular a cópia das mensagens e só então sincronizar tudo:

# 1. Simula apenas a estrutura de pastas (não altera nada)
go-imapsync 
  --host1 imap.origem.com --user1 alice --password1 'segredo1' 
  --host2 imap.destino.com --user2 bob  --password2 'segredo2' 
  --justfolders --dry

# 2. Cria as pastas no destino
go-imapsync ... --justfolders

# 3. Simula a transferência das mensagens
go-imapsync ... --dry

# 4. Sincroniza de verdade
go-imapsync ...

Senhas na linha de comando ficam no histórico do shell — em produção, prefira as variáveis de ambiente, que nunca aparecem nos logs:

export GOIMAPSYNC_PASSWORD1='segredo-da-origem'
export GOIMAPSYNC_PASSWORD2='segredo-do-destino'
go-imapsync --host1 imap.origem.com --user1 alice 
            --host2 imap.destino.com --user2 bob

Flags mais úteis

  • --host1/--user1/--password1/--port1 — conta de origem (idem *2 para o destino)
  • --ssl1/--nossl1 e --tls1/--notls1 — IMAPS (padrão) ou STARTTLS, por servidor
  • --dry — só relata o que faria; nenhum CREATE/APPEND no destino
  • --justfolders — sincroniza apenas pastas, sem corpos de mensagem
  • --skipemptyfolders — não espelha pastas vazias
  • --useheader — cabeçalhos usados na identidade da mensagem (padrão Message-Id e Received)
  • --logfile — grava o log também em arquivo
  • --timeout — timeout de rede (padrão 60s)
  • --insecuretls — pula a verificação TLS (somente laboratório)

Docker

O repositório traz um Dockerfile pronto. As credenciais entram por env ou flags em tempo de execução — nunca ficam na imagem:

make docker-build
docker run --rm 
  -e GOIMAPSYNC_PASSWORD1 -e GOIMAPSYNC_PASSWORD2 
  go-imapsync:dev 
  --host1 imap.origem.com --user1 alice 
  --host2 imap.destino.com --user2 bob --dry

O que vem por aí

O projeto é um MVP e o roadmap está aberto no repositório: filtros e mapeamento de pastas, --delete1/--delete2, autenticação XOAUTH2, labels do Gmail e migração em massa via CSV estão na fila. O código é MIT, com testes (go test -race), lint e CI no GitHub Actions — contribuições são bem-vindas via CONTRIBUTING.md.

Se você administra servidores de e-mail ou tem uma migração IMAP na agenda, teste o go-imapsync — e se ele te poupar uma tarde de luta com módulos Perl, deixe uma estrela no repositório e abra uma issue contando como foi.