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 {} \;