Está en la página 1de 3

Procedimiento de implementacin: sincronismo OnLine Zimbra MySQL/PostgreSQL

Paso 1: Crear y compilar el programa.


Se encuentra actualmente en la siguiente direccin:
Servidor: 192.168.2.4
Programa: udf_savarzimbra.c
Ruta: /opt/zimbra/pagos/

Para compilar:
gcc -m64 -fPIC -shared -I/opt/zimbra/mta/mysql-standard-5.5.24-pc-linux-gnu-i686-glibc23/include/
udf_savarzimbra.c -o udf_savarzimbra.so

Importante: para compilar se debe contar con la libreras cliente de MySQL.

Paso 2: renombrar y mover la funcin a la ruta donde el MySQL lo reconocer. El servidor zimbra trabaja con el
MySQL
mv udf_savarzimbra.so /opt/zimbra/mysql/lib/plugin/libudf_savarzimbra.so

Debe identificarse y conectarse a la BD donde se encuentra el registro de la cuenta de correo. En el ambiente


de prueba la cuenta pagos@savarcorp.com.pe est en la BD mboxgroup40 y en produccin mboxgroup27
(segn la instalacin actual).
Secuencia de pasos para conectarse:

Paso 3: Conexin a la BD MySQL de Zimbra:


> use zimbra (enter)
> mysql (enter)
mysql> use mboxgroup27; (enter)

Paso 4: Creacin de la funcin externa ExecShell_PagoSunat.


El zimbra instalado en el ambiente de pruebas reconoce las libreras en la ruta: /opt/zimbra/mysql/lib/plugin/
en este caso: /opt/zimbra/mysql/lib/plugin/libudf_savarzimbra.so

CREATE FUNCTION ExecShell_PagoSunat RETURNS INTEGER SONAME 'libudf_savarzimbra.so';

Si se quiere borrar la funcin para hacer cambios y refrescar hay que borrar y volver a crear.
DROP FUNCTION ExecShell_PagoSunat;

Paso 5: Crear el trigger en esta BD:


Para crear el trigger debe tenerse la siguientes consideraciones:
Identificar el ID de la cuenta pagos@savar.com.pe. En pruebas es 40, en produccin es 27 (segn la
instalacin actual).
Eso se refleja en el condicional del trigger: NEW.mailbox_id = 27
-- Por lnea de comandos:
DELIMITER |
CREATE TRIGGER `tg_insert_mail_item` AFTER INSERT ON `mail_item` FOR EACH
ROW BEGIN DECLARE int_result INT; IF (NEW.mailbox_id = 27 AND
trim(NEW.sender) = 'epago@sunat.gob.pe') THEN IF (NEW.id IS NOT NULL AND
NEW.mod_content IS NOT NULL) THEN SELECT
ExecShell_PagoSunat(concat(CONVERT(NEW.id,CHAR(8)),'\0'),concat(CONVERT(NEW
.mod_content,CHAR(8)),'\0')) INTO int_result; END IF; END IF; END|
DELIMITER ;

-- Por interfaz:
DELIMITER |

CREATE TRIGGER `tg_insert_mail_item`


AFTER INSERT
ON `mail_item`
FOR EACH ROW
BEGIN
DECLARE int_result INT;
IF (NEW.mailbox_id = 27 AND trim(NEW.sender) = 'epago@sunat.gob.pe') THEN
IF (NEW.id IS NOT NULL AND NEW.mod_content IS NOT NULL) THEN
SELECT
ExecShell_PagoSunat(concat(CONVERT(NEW.id,CHAR(8)),'\0'),concat(CONVERT(NEW
.mod_content,CHAR(8)),'\0')) INTO int_result;
END IF;
END IF;

END|

DELIMITER ;

--Si se quiere borrar el trigger:


DROP TRIGGER `tg_insert_mail_item`;

Paso 6: Ejemplo de ejecucin de la funcin.


La funcin recibe dos parmetros, identificadores del correo recibido. Con estos se forma el nombre del correo
fsico que se guarda en el servidor (archivo fsico en una ruta del servidor de correos).

SELECT ExecShell_PagoSunat(concat(CONVERT(340,CHAR(8)),'\0'),concat(CONVERT(600,CHAR(8)),'\0'));

Paso 7: Creacin de la Shell (pagos_sunat.sh) que ser ejecutada por el programa en C.


Se encuentra en la ruta: /opt/zimbra/pagos/pagos_sunat.sh
La shell recibe 4 parmetros y ejecuta el programa de parseo: /opt/zimbra/pagos/lee-correo-
levante.php

Paso 8: Creacin del programa PHP (lee-correo-levante.php) que ser ejecutada por la shell.
Se encuentra en la ruta: /opt/zimbra/pagos/lee-correo-levante.php