ubicación de los mensajes en zimbra

16 de julio de 2008

Para saber donde están ubicados físicamente los mensajes de un usuario de Zimbra tenemos que consultar el mysql de Zimbra.

Nos conectamos al mysql y miramos que esquemas tenemos y luego miramos la lista de buzones:

# su - zimbra
# mysql
mysql> show databases;
mysql> select comment, group_id from zimbra.mailbox order by comment
+--------------------------------+----------+
 comment                     group_id 
+--------------------------------+----------+
 xxxxx@yyyyyy.com                 1 
 zzzz@yyyyyyy.com                  4 

X rows in set (0.00 sec)
El el campo group_id tenemos el ID del grupo de mailboxes al que pertenece el usuario. Por tanto si pertenece al group_id=4 querrá decir que habrá un esquema dentro del mysql que se llamará mboxgroup4.

mysql> use mboxgroup4;
mysql> show tables;
Dado que sólo podemos tener 100 grupos de mailboxes (segun la wiki de zimbra) si nos dá que group_id=1023 entonces el ID del grupo de mailbox será 1024 mod 100 = 24. Debe existir el esquema mboxgroup24.

El ID del grupo de mailbox también se puede conseguir con el comando zmprov.

# zmprov getMailboxInfo miusuario@midominio.com
mailboxId: 1023
quotaUsed: 651627
Veamos ahora un listado de todos los mails que hay dentro del grupo mailbox 4. Si tenemos más de 100 usuarios puede ser que dentro de este grupo de mailbox haya correo de varias cuentas. En la tabla mail_items tenemos los mails y tambien tenemos los contactos de la libreta de direcciones. Aun no sé como distingue lo que es un mail de una contacto en la libreta de direcciones.

mysql> select * from mboxgroup4.mail_item where id>26000 and mailbox_id=4 \G
*************************** 1. row ***************************
mailbox_id: 4
id: 26001
type: 5
parent_id: NULL
folder_id: 2
index_id: 26001
imap_id: 26001
date: 1182380903
size: 95842
volume_id: 1
blob_digest: rbrw+fj0tvyvTPt2haxssued7,A=
unread: 1
flags: 2
tags: 0
sender: miusuario@midominio.com
subject: Un mensaje
name: NULL
metadata: d1:f147:This message...1:p8:Re: SF: 1:s21:miurusio@midominio.com1:vi10e
mod_metadata: 30102
change_date: 1182380905
mod_content: 30102

1 row in set (0.00 sec)
El campo volume_id=1 indica la carpeta donde estan almacenados todos los grupos de mailbox. Normalmente será /opt/zimbra/store. Veamos si esto es cierto:
mysql> select id, name, path from zimbra.volume;
+----+----------+-------------------+
 id   name       path              
+----+----------+-------------------+
  1  message1  /opt/zimbra/store 
  2  index1     /opt/zimbra/index 
+----+----------+-------------------+
2 rows in set (0.00 sec)
Luego tenemos que el mailbox_id=4 y el id=26001. Ahora según Zimbra tenemos que hacer una operació a nivel de bits y mover 12bits:

# perl -e 'print 4 >> 12 ; print "\n"'
0
# perl -e 'print 26001 >> 12 ; print "\n"'
6
Nos da como resultado 0 y 6.

Portanto el mensaje que buscamos está en:

<path del store> / <mailbox_id >> 12> / <mailbox_id> /msg/ <id >>12> / id-<?>.msg
es decir
/opt/zimbra/store/0/4/msg/6/26001-30102.msg