{"id":674,"date":"2026-09-06T12:54:32","date_gmt":"2026-09-06T15:54:32","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/go-imapsync\/"},"modified":"2026-09-08T10:15:50","modified_gmt":"2026-09-08T13:15:50","slug":"go-imapsync","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/go-imapsync\/","title":{"rendered":"go-imapsync: migra\u00e7\u00e3o de caixas IMAP com um \u00fanico bin\u00e1rio em Go"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro conectando o duto que migra as mensagens do servidor antigo para o novo, com o gopher do Go ao lado\" src=\"\/wp-content\/uploads\/2026\/09\/go-imapsync-v2.webp\" width=\"1486\" height=\"856\" \/><\/p>\n<p>Quem j\u00e1 precisou migrar caixas de e-mail entre servidores conhece o <a href=\"https:\/\/imapsync.lamiral.info\/\" rel=\"noopener\" target=\"_blank\">imapsync<\/a>, a cl\u00e1ssica ferramenta em Perl do Gilles Lamiral. Ela resolve o problema, mas arrasta uma cadeia de depend\u00eancias de m\u00f3dulos Perl que nem sempre \u00e9 divertida de instalar. O <strong><a href=\"https:\/\/github.com\/jniltinho\/go-imapsync\" rel=\"noopener\" target=\"_blank\">go-imapsync<\/a><\/strong> \u00e9 uma reimplementa\u00e7\u00e3o do essencial do imapsync em <strong>Go<\/strong>: sincroniza\u00e7\u00e3o IMAP <em>one-way<\/em> e incremental de <code data-no-translation=\"\">host1 \u2192 host2<\/code>, sem duplicados, distribu\u00edda como <strong>um \u00fanico bin\u00e1rio est\u00e1tico<\/strong> \u2014 sem runtime, sem depend\u00eancias, \u00e9 baixar e rodar.<\/p>\n<h2>O que ele faz<\/h2>\n<p>O go-imapsync conecta em duas contas IMAP ao mesmo tempo (origem e destino), replica a \u00e1rvore de pastas e copia as mensagens que ainda n\u00e3o existem no destino, preservando flags (lida, respondida, etc.) e a data interna de cada mensagem. A detec\u00e7\u00e3o de duplicados usa <strong>cabe\u00e7alhos<\/strong> (<code data-no-translation=\"\">Message-Id<\/code> and <code data-no-translation=\"\">Received<\/code>, o mesmo modelo do imapsync original), ent\u00e3o voc\u00ea pode rodar quantas vezes quiser: cada execu\u00e7\u00e3o \u00e9 incremental e s\u00f3 transfere o que falta.<\/p>\n<p>Recursos do MVP atual:<\/p>\n<ul>\n<li>SSL\/IMAPS (padr\u00e3o, porta 993) e STARTTLS<\/li>\n<li>Listagem recursiva de pastas na origem + cria\u00e7\u00e3o autom\u00e1tica no destino<\/li>\n<li>FETCH\/APPEND das mensagens com flags e data interna preservadas<\/li>\n<li>Pulo de duplicados por cabe\u00e7alho \u2014 execu\u00e7\u00e3o incremental e re-execut\u00e1vel<\/li>\n<li>Modos seguros de teste: <code data-no-translation=\"\">--dry<\/code> and <code data-no-translation=\"\">--justfolders<\/code><\/li>\n<li>Resumo ao final da execu\u00e7\u00e3o e exit codes bem definidos (<code data-no-translation=\"\">0<\/code> sucesso, <code data-no-translation=\"\">1<\/code> falha de execu\u00e7\u00e3o, <code data-no-translation=\"\">2<\/code> erro de uso\/configura\u00e7\u00e3o \u2014 \u00f3timo para scripts)<\/li>\n<\/ul>\n<h2>Installation<\/h2>\n<p>A forma mais r\u00e1pida \u00e9 baixar o bin\u00e1rio pronto na p\u00e1gina de <a href=\"https:\/\/github.com\/jniltinho\/go-imapsync\/releases\" rel=\"noopener\" target=\"_blank\">Releases<\/a>. H\u00e1 builds para Linux x86_64, macOS Apple Silicon e Windows x86_64:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">wget https:\/\/github.com\/jniltinho\/go-imapsync\/releases\/download\/v0.1.3\/go-imapsync_0.1.3_linux_amd64.tar.gz\ntar xzf go-imapsync_0.1.3_linux_amd64.tar.gz\nsudo mv go-imapsync \/usr\/local\/bin\/\ngo-imapsync version<\/code><\/pre>\n<p>Prefere compilar? Com Go 1.26+ instalado:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">git clone https:\/\/github.com\/jniltinho\/go-imapsync.git\ncd go-imapsync\nmake build     # bin\u00e1rio est\u00e1tico em dist\/go-imapsync\nmake test      # go test -race .\/...<\/code><\/pre>\n<h2>Uso: comece devagar<\/h2>\n<p>A filosofia \u00e9 a mesma dos exemplos do imapsync cl\u00e1ssico: valide antes de transferir. A sequ\u00eancia segura \u00e9 rodar primeiro s\u00f3 as pastas em modo simula\u00e7\u00e3o, depois criar as pastas de verdade, depois simular a c\u00f3pia das mensagens e s\u00f3 ent\u00e3o sincronizar tudo:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># 1. Simula apenas a estrutura de pastas (n\u00e3o altera nada)\ngo-imapsync \n  --host1 imap.origem.com --user1 alice --password1 'segredo1' \n  --host2 imap.destino.com --user2 bob  --password2 'segredo2' \n  --justfolders --dry\n\n# 2. Cria as pastas no destino\ngo-imapsync ... --justfolders\n\n# 3. Simula a transfer\u00eancia das mensagens\ngo-imapsync ... --dry\n\n# 4. Sincroniza de verdade\ngo-imapsync ...<\/code><\/pre>\n<p>Senhas na linha de comando ficam no hist\u00f3rico do shell \u2014 em produ\u00e7\u00e3o, prefira as vari\u00e1veis de ambiente, que nunca aparecem nos logs:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">export GOIMAPSYNC_PASSWORD1='segredo-da-origem'\nexport GOIMAPSYNC_PASSWORD2='segredo-do-destino'\ngo-imapsync --host1 imap.origem.com --user1 alice \n            --host2 imap.destino.com --user2 bob<\/code><\/pre>\n<h2>Flags mais \u00fateis<\/h2>\n<ul>\n<li><code data-no-translation=\"\">--host1\/--user1\/--password1\/--port1<\/code> \u2014 conta de origem (idem <code data-no-translation=\"\">*2<\/code> para o destino)<\/li>\n<li><code data-no-translation=\"\">--ssl1\/--nossl1<\/code> and <code data-no-translation=\"\">--tls1\/--notls1<\/code> \u2014 IMAPS (padr\u00e3o) ou STARTTLS, por servidor<\/li>\n<li><code data-no-translation=\"\">--dry<\/code> \u2014 s\u00f3 relata o que faria; nenhum CREATE\/APPEND no destino<\/li>\n<li><code data-no-translation=\"\">--justfolders<\/code> \u2014 sincroniza apenas pastas, sem corpos de mensagem<\/li>\n<li><code data-no-translation=\"\">--skipemptyfolders<\/code> \u2014 n\u00e3o espelha pastas vazias<\/li>\n<li><code data-no-translation=\"\">--useheader<\/code> \u2014 cabe\u00e7alhos usados na identidade da mensagem (padr\u00e3o <code data-no-translation=\"\">Message-Id<\/code> and <code data-no-translation=\"\">Received<\/code>)<\/li>\n<li><code data-no-translation=\"\">--logfile<\/code> \u2014 grava o log tamb\u00e9m em arquivo<\/li>\n<li><code data-no-translation=\"\">--timeout<\/code> \u2014 timeout de rede (padr\u00e3o 60s)<\/li>\n<li><code data-no-translation=\"\">--insecuretls<\/code> \u2014 pula a verifica\u00e7\u00e3o TLS (<strong>somente laborat\u00f3rio<\/strong>)<\/li>\n<\/ul>\n<h2>Docker<\/h2>\n<p>O reposit\u00f3rio traz um Dockerfile pronto. As credenciais entram por env ou flags em tempo de execu\u00e7\u00e3o \u2014 nunca ficam na imagem:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">make docker-build\ndocker run --rm \n  -e GOIMAPSYNC_PASSWORD1 -e GOIMAPSYNC_PASSWORD2 \n  go-imapsync:dev \n  --host1 imap.origem.com --user1 alice \n  --host2 imap.destino.com --user2 bob --dry<\/code><\/pre>\n<h2>O que vem por a\u00ed<\/h2>\n<p>O projeto \u00e9 um MVP e o roadmap est\u00e1 aberto no reposit\u00f3rio: filtros e mapeamento de pastas, <code data-no-translation=\"\">--delete1\/--delete2<\/code>, autentica\u00e7\u00e3o XOAUTH2, labels do Gmail e migra\u00e7\u00e3o em massa via CSV est\u00e3o na fila. O c\u00f3digo \u00e9 <a href=\"https:\/\/github.com\/jniltinho\/go-imapsync\/blob\/main\/LICENSE\" rel=\"noopener\" target=\"_blank\">MIT<\/a>, com testes (<code data-no-translation=\"\">go test -race<\/code>), lint e CI no GitHub Actions \u2014 contribui\u00e7\u00f5es s\u00e3o bem-vindas via <a href=\"https:\/\/github.com\/jniltinho\/go-imapsync\/blob\/main\/CONTRIBUTING.md\" rel=\"noopener\" target=\"_blank\">CONTRIBUTING.md<\/a>.<\/p>\n<p>Se voc\u00ea administra servidores de e-mail ou tem uma migra\u00e7\u00e3o IMAP na agenda, teste o <a href=\"https:\/\/github.com\/jniltinho\/go-imapsync\" rel=\"noopener\" target=\"_blank\">go-imapsync<\/a> \u2014 e se ele te poupar uma tarde de luta com m\u00f3dulos Perl, deixe uma estrela no reposit\u00f3rio e abra uma issue contando como foi.<\/p>","protected":false},"excerpt":{"rendered":"<p>Quem j\u00e1 precisou migrar caixas de e-mail entre servidores conhece o imapsync, a cl\u00e1ssica ferramenta em Perl do Gilles Lamiral. Ela resolve o problema, mas arrasta uma cadeia de depend\u00eancias de m\u00f3dulos Perl que nem sempre \u00e9 divertida de instalar. O go-imapsync \u00e9 uma reimplementa\u00e7\u00e3o do essencial do imapsync em Go: sincroniza\u00e7\u00e3o IMAP one-way e &#8230; <a title=\"go-imapsync: migra\u00e7\u00e3o de caixas IMAP com um \u00fanico bin\u00e1rio em Go\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/en\/2026\/09\/go-imapsync\/\" aria-label=\"Read more about go-imapsync: migra\u00e7\u00e3o de caixas IMAP com um \u00fanico bin\u00e1rio em Go\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78,111,120],"tags":[79,31,242,330,331],"class_list":["post-674","post","type-post","status-publish","format-standard","hentry","category-email","category-opensource","category-servidores","tag-email","tag-golang","tag-imap","tag-imapsync","tag-migracao"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/comments?post=674"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/674\/revisions"}],"predecessor-version":[{"id":1339,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/posts\/674\/revisions\/1339"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/media?parent=674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/categories?post=674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/en\/wp-json\/wp\/v2\/tags?post=674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}