Backup de Buzón de Gmail en Buzón IMAP

Este artículo explica cómo automatizar backups de un buzón de Gmail / Google Mail contra un servidor IMAP estándar. En el ejemplo se muestra cómo hacer una sincronización regular desde GMAIL contra un servidor dovecot-imap.

Esto nos permite hacer una copia de seguridad de todos los correos de nuestra cuenta de Gmail por si algún día se cierra el servicio o alguien consiguiera averiguar el password de nuestra cuenta, quitándonos el acceso a la misma. También nos proporciona una forma de migrar de Gmail a otros servicios basados en IMAP (servidor propio, etc) sin perder nuestro histórico de correos.

Lo primero (condición indispensable) habilitamos el acceso IMAP en nuestra cuenta de Gmail.


Descargamos el software: Offlineimap

Para la copia utilizaremos el programa OfflineIMAP: un script en python que permite sincronizar un servidor IMAP remoto contra uno local.

Así pues, descargamos la última versión de OfflineIMAP y la desempaquetamos en un directorio de uso.

gmail@tatil-e500:~$ tar xvzf offlineimap_6.0.3.tar.gz


Fichero de configuración para offlineimap

Después, creamos el fichero de configuración de nombre ".offlineimap_cuenta.cfg" en nuestro directorio $HOME:

gmail@tatil-e500:~$ cat ~/.offlineimap_cuenta.cfg
[general]

accounts = nombrecuenta
metadata = ~/.offlineimap_cuenta

# Numero de cuentas que vamos a configurar:
maxsyncaccounts = 1
ui = Noninteractive.Basic


# Nombre de la cuenta 1
[Account nombrecuenta]
localrepository = Local.cuentalocal
remoterepository = Remote.cuentaremota
autorefresh = 120
quick = 10

# Repositorio local (cuenta DESTINO de la copia):
[Repository Local.cuentalocal]

type = Maildir
localfolders = /home/gmail/Maildir/


# Repositorio remoto (cuenta ORIGEN de la copia):
[Repository Remote.cuentaremota]

# Nombres de buzones para version en Ingles de GMAIL
# Hay que cambiarlo por los nombres en tu idioma local:
# Traducimos los nombres de los buzones GMAIL a nombres IMAP:
#
#  EtiquetaGmail -> .EtiquetaGmail
#  [Gmail]/Trash -> .Trash
#  [Gmail]/Sent Mail -> .Sent Mail
#
nametrans = lambda foldername: \
            re.sub('^', '.', \
            re.sub('^INBOX$', '', \
            re.sub('\[Gmail\]\/', '', foldername)))

# Copiamos todos los buzones menos los de esta lista:
folderfilter = lambda foldername: foldername not in \
               ['[Gmail]/All Mail', '[Gmail]/Trash', 
                '[Gmail]/Spam', '[Gmail]/Starred']

type = IMAP
remotehost = imap.gmail.com
remoteuser = cuentaremota@gmail.com
remoteport = 993
ssl = yes
remotepass = XXXXXXXXXX

Como el fichero tiene nuestro password de gmail, lo protegemos ante miradas curiosas:

gmail@tatil-e500:~$ chmod 0600 ../.offlineimap_cuenta.cfg

Es importantísimo que no nos equivoquemos en el orden de replicación. Si ponemos un orden de replicación incorrecto, offlineimap borrará los correos de gmail (repositorio destino) por no estar presentes en el repositorio origen. La regla es:

  • ORIGEN = remoterepository
  • DESTINO = localrepository


Script para lanzar la replicación

Nos creamos un script para lanzar la replicación de buzones:

gmail@tatil-e500:~/bin$ 
#!/bin/sh
python ~/offlineimap/offlineimap.py -o -c ~/.offlineimap_cuenta.cfg

Una vez creado, podemos realizar la replicación inicial del servidor IMAP remoto al local. En esta primera replicación, el script se bajará todos los correos de nuestro buzón IMAP, por lo que puede tardar bastante. Podemos también cortarlo en cualquier momento y re-ejecutarlo, ya que continuará desde donde se quedó:

gmail@tatil-e500:~$ sh bin/sincroniza_gmail.sh 
OfflineIMAP 6.0.3
Copyright (C) 2002 - 2008 John Goerzen <jgoerzen@complete.org>
This software comes with ABSOLUTELY NO WARRANTY; see the file
COPYING for details.  This is free software, and you are welcome
to distribute it under the conditions laid out in COPYING.
***** Processing account cuenta_gmail
Copying folder structure from IMAP to Maildir
Establishing connection to imap.gmail.com:993.
Syncing INBOX: IMAP -> Maildir
Copy message 7055 IMAP[INBOX] -> Maildir[.], LocalStatus[.]
Copy message 7056 IMAP[INBOX] -> Maildir[.], LocalStatus[.]
Deleting 1 messages (7050) in IMAP[INBOX], LocalStatus[.]
Syncing Coding: IMAP -> Maildir
Copy message 1 IMAP[Coding] -> Maildir[.Coding], LocalStatus[.Coding]
Copy message 2 IMAP[Coding] -> Maildir[.Coding], LocalStatus[.Coding]
Syncing Linux: IMAP -> Maildir
Copy message 1 IMAP[Linux] -> Maildir[.Linux], LocalStatus[.Linux]
Copy message 2 IMAP[Linux] -> Maildir[.Linux], LocalStatus[.Linux]
Syncing python: IMAP -> Maildir
Syncing [Gmail]/Sent Mail: IMAP -> Maildir
Copy message 12 IMAP[[Gmail]/Sent Mail] -> Maildir[.Sent Mail], LocalStatus[.Sent Mail]
Copy message 13 IMAP[[Gmail]/Sent Mail] -> Maildir[.Sent Mail], LocalStatus[.Sent Mail]
Copy message 14 IMAP[[Gmail]/Sent Mail] -> Maildir[.Sent Mail], LocalStatus[.Sent Mail]
***** Finished processing account cuenta_gmail

El resultado es una copia de nuestro buzón de GMail:

gmail@tatil-e500:~$ ls -la Maildir/
(...)
drwx------  5 gmail gmail  4096 feb  9 16:42 .Coding
drwx------  2 gmail gmail  4096 feb  9 13:49 cur
drwx------  5 gmail gmail  4096 feb  9 13:13 .Drafts
drwx------  5 gmail gmail  4096 feb  9 13:13 .Linux
drwx------  2 gmail gmail  4096 feb  9 13:48 new
drwx------  5 gmail gmail  4096 feb  9 13:13 .python
drwx------  5 gmail gmail  4096 feb  9 13:13 .Sent Mail
drwx------  5 gmail gmail  4096 feb  9 13:13 .Servers
drwx------  2 gmail gmail  4096 feb  9 13:35 tmp
drwx------  5 gmail gmail  4096 feb  9 13:49 .Trash

gmail@tatil-e500:~$ du -sh Maildir/
70M	Maildir/

Las subsiguientes ejecuciones del script bajarán sólo los cambios desde las última ejecución:

gmail@tatil-e500:~$ sh bin/sincroniza_gmail.sh 
OfflineIMAP 6.0.3
Copyright (C) 2002 - 2008 John Goerzen <jgoerzen@complete.org>
This software comes with ABSOLUTELY NO WARRANTY; see the file
COPYING for details.  This is free software, and you are welcome
to distribute it under the conditions laid out in COPYING.
***** Processing account cuenta_gmail
Copying folder structure from IMAP to Maildir
Establishing connection to imap.gmail.com:993.
Syncing INBOX: IMAP -> Maildir
Copy message 7085 IMAP[INBOX] -> Maildir[.], LocalStatus[.]
Copy message 7086 IMAP[INBOX] -> Maildir[.], LocalStatus[.]
Syncing Coding: IMAP -> Maildir
Syncing Linux: IMAP -> Maildir
Syncing Personal: IMAP -> Maildir
Syncing [Gmail]/Sent Mail: IMAP -> Maildir
Copy message 4958 IMAP[[Gmail]/Sent Mail] -> Maildir[.Sent Mail], LocalStatus[.Sent Mail]
Syncing Servers: IMAP -> Maildir
Syncing python: IMAP -> Maildir
***** Finished processing account cuenta_gmail

Podemos dejar este script en el Crontab, y asegurar una copia regular de Gmail.

## /etc/crontab:
# Copia del buzon de Gmail en Maildir local
0 4,14,20 * * * gmail /home/gmail/bin/sincroniza_gmail.sh > /dev/null

Además, podemos guardar copias totales en tar.bz2 regularmente:

## /etc/crontab:
# Realizar tar.gzs del buzón de Gmail domingos y miercoles
10 5 * * 0,3 gmail /home/gmail/bin/targz_buzon_gmail.sh > /dev/null

Y el script de backup targz_buzon_gmail.sh:

#!/bin/sh

FECHA="`date +%Y-%m-%d`"

cd /datos/gmail/micuenta/
tar cjf gmail_Maildir_${FECHA}.tar.bz2 Maildir/

# Guardamos 20 dias de tar.gzs
find /datos/gmail/micuenta/ -name "gmail_Maildir*bz2" -mtime +20 -exec rm -f {} \;



<Volver a la sección de GNU/Linux>