Translate

viernes, 5 de octubre de 2012

Notificación de correo HTML para el buzón de voz.

Todos sabemos que Asterisk nos informa vía correo electrónico sobre un nuevo mensaje en nuestro Buzón de voz. Esta herramienta es de las más solicitadas en las instalaciones de los IP-PBX; sin embargo, la notificación tiende a ser en texto plano con muy poco formato.


Enviar la notificación en modo HTML nos permite darle mayor vista/formato, además de que es un plus a nuestras instalaciones y nuestro trabajo. ;)

Existen dos maneras de hacer que Asterisk envíe la notificación de correo con formato HTML: Nativamente y con un Script externo.


Nativamente:

Usando este método no se necesita mas que modificar el archivo app_voicemail.c y recompilar Asterisk para enviar en modo HTML el correo electrónico.

Pero tiene su desventaja: dado que la aplicación encargada de ejecutar el proceso tiene el tamaño de las variables limitadas el cuerpo del mensaje es muy pequeño, cerca de 500 letras solamente, lo que limita el formato del correo. Si aún así pretenden hacerlo de manera nativa he aquí los pasos a seguir:


1) Con el editor de Texto preferido abrir el archivo fuente: app_voicemail.c, ubicado en le directorio apps.


2) Navegar hasta la línea #4748, estamos buscando esta cadena:
fprintf(p, "Content-Type: text/plain; charset=%s" ENDL "Content-Transfer-Encoding: 8bit" ENDL ENDL, charset);



3) Reemplazar text/plain por text/html:
fprintf(p, "Content-Type: text/html; charset=%s" ENDL "Content-Transfer-Encoding: 8bit" ENDL ENDL, charset);

4) Guardar los cambios y recompilar Asterisk:
# make && make install



5) Editar el Archvio voicemail.conf para añadir nuestro mensaje con formato HTML, yo utilicé este codigo:
emailbody="
Estimado: ${VM_NAME}
Deseamos Hacerle saber que ha recibido un nuevo mensaje de voz desde el número ${VM_CALLERID} el día ${VM_DATE}.
Para revisarlo marque desde su Teléfono la extensión 9898 o vaya al siguiente enlace
Sistema de Correo de Voz Digital-Merge
6) Entramos al cli de Asterisk y recargamos la configuración del voicemail:
> voicemail reload


7) Al recibir un nuevo buzón de voz, ahora nuestro correo recibirá un texto similar a esta imagen:




Usando un Script:


Este método requiere un poco mas de trabajo pero la presentación final vale la pena:

1) Lo que vamos a hacer es un archivo externo que envíe el correo usando PHP y dando el formato desde ese mismo archivo. Por esta razón necesitamos la librería PHPMAILER. 

2) Lo que necesitamos es capturar la salida de Asterisk al enviar el correo al stdin de Linux, con el fin de capturar las variables del buzón de voz. Este es el ejemplo de la salida que envía Asterisk al STDIN:


Date: Mon, 17 Sep 2012 11:22:41 -0500
From: "Digital-Merge" <Digital-Merge@Airo-Shaka>
To: "Max Reyes" <navaismo@gmail.com>
Subject: =?ISO-8859-1?Q?=5BVM=5D=3A_Nuevo_Mensaje_de_Voz?=
Message-ID: <Asterisk-1-1981780523-5000-1192@Airo-Shaka>
X-Asterisk-CallerID: 5001
X-Asterisk-CallerIDName: Test
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----voicemail_150001192190857712"


This is a multi-part message in MIME format.

------voicemail_150001192190857712
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

Max Reyes|5000|0:01|"Test" <5001>|Monday, September 17, 2012 at 11:22:41 AM
------voicemail_150001192190857712
Content-Type: audio/x-wav; name="msg0000.wav"
Content-Transfer-Encoding: base64
Content-Description: Voicemail sound attachment.
Content-Disposition: attachment; filename="msg0000.wav"

UklGRqQMAABXQVZFZm10IBAAAAABAAEAQB8AAIA+AAACABAAZGF0YYAMAAAIAAAACAAIAAgA
CAAIAAAACAAAAAAACAAAAAAACAAAAAAAAAAIAAgACAAIAAgAAAAAAAgACAAIAAgACAAIAAgA
CAAAAAgACAAIAAgAAAAIAAAAAAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgA
CAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgAAAAIAAAACAAIAAAACAAAAAAA
CAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgACAAIAAgAAAAIAAAA
CAAIAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgAAAAAAAAACAAAAAAACAAIAAgACAAIAAgA
CAAIAAgACAAAAAgACAAIAAgACAAIAAgACAAIAAgAAAAAAAgACAAIAAgACAAIAAgACAAIAAgA
CAAIAAAAAAAIAAAAAAAIAAgACAAIAAgAAAAAAAgACAAAAAgACAAAAAAACAAIAAgACAAIAAAA
AAAAAAgACAAIAAgAAAAAAAAACAAIAAAAAAAAAAAACAAIAAAACAAIAAgACAAIAAgACAAIAAgA
AAAIAAgACAAAAAgACAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgACAAIAAgACAAAAAAAAAAAAAAA
AAAAAAAAAAAIAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAgACAAIAAgA
AAAAAAgACAAIAAAAAAAAAAgAAAAAAAgACAAIAAgACAAAAAAACAAIAAgACAAIAAgACAAIAAgA
AAAIAAgACAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAIAAAAAAAAAAAAAAAAAAAACAAIAAAAAAAIAAAACAAIAAgACAAAAAgAAAAAAAgAAAAAAAAA
AAAAAAAAAAAAAAAACAAAAAgACAAIAAgAAAAAAAgACAAAAAgACAAIAAAACAAIAAAACAAAAAgA
AAAIAAgAAAAIAAgAAAAAAAAAAAAAAAAACAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA
AAAIAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgAAAAAAAgACAAAAAAAAAAAAAAAAAAIAAAA
CAAIAAgACAAIAAAACAAAAAAACAAAAAAAAAAAAAAAAAAIAAgAAAAAAAgACAAAAAAACAAAAAAA
CAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAgACAAAAAgACAAIAAgAAAAIAAAACAAIAAgACAAAAAgACAAAAAgACAAIAAAACAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAAAAgACAAAAAAAAAAIAAgAAAAIAAgAAAAIAAAAAAAAAAgA
CAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAIAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAIAAAAAAAIAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAAAAAACAAIAAAA
AAAAAAAAAAAAAAAACAAAAAAAAAAIAAgAAAAAAAgACAAIAAgAAAAAAAgAAAAAAAAACAAIAAAA
CAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAIAAAAAAAAAAgACAAAAAgACAAIAAAAAAAAAAgA
CAAAAAgACAAAAAAACAAIAAAAAAAAAAAAAAAIAAgACAAAAAgACAAAAAAACAAIAAAAAAAAAAAA
AAAAAAAACAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAgACAAIAAAAAAAAAAAA
AAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAA
AAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAAAgACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAIAAgACAAIAAAAAAAIAAAACAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAgA
AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAAAAAAAAAAA
CAAAAAAACAAAAAAACAAIAAgACAAAAAgACAAAAAAAAAAIAAgAAAAAAAAAAAAAAAAAAAAIAAgA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgAAAAAAAgAAAAAAAAAAAAAAAAACAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA
AAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAAACAAAAAgA
CAAAAAgAAAAAAAAAAAAAAAAAAAAIAAgACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACAAIAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgAAAAAAAAA
AAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
CAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA
AAAAAAAACAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAIAAAA
AAAAAAAACAAIAAgACAAIAAAAAAAAAAAACAAIAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAIAA==


------voicemail_150001192190857712--
.




3) El script de PHP:
#!/usr/bin/php -q
?php
date_default_timezone_set('America/Mexico_City');

//************** obtenemos el stdin del asterisk *************************************/
$in = fopen('php://stdin', 'r');
while(!feof($in)){
 $text = $text . fgets($in, 4096);
}

//************* guardamos la salida a un archivo temporal ****************************/
$time=time();
$fp = fopen("/etc/asterisk/data_" .$time .".txt", "w");
fwrite($fp, $text);
fclose($fp);

//************ Obtenemos las Lineas que contienen los datos del Buzón
$path = "/etc/asterisk/data_" .$time. ".txt";
$handle = fopen($path, "r");
$lines = file($path); 

//*********** las lineas que usaremos son:
$linenum = 2; //email
$linenum2 = 17; // variables vm
$linenum3 = 19; // numero de mensaje

$toemail=get_between($lines[$linenum],"<",">"); //********* el email
$msg=str_replace('"',"",$lines[$linenum3]); //********* Quitamos las comillas
$msg2=get_between($msg,"=",".wav"); //********* el numero de mensaje
$args=$lines[$linenum2]; //********* argumentos del vm(nombre, buzon, CID etc) 

/*********** Separamos los Valores de Nombre, buzon, Fecha, CID y Duracion *************************/
$vmargs=explode("|",$args);
$name=$vmargs[0];
$mailbox=$vmargs[1];
$dur=$vmargs[2];
$cid=$vmargs[3];
$date=$vmargs[4];


/********** Construimos las Variables a usar para enviar el email **********************************/

$mail_lib_path = "/etc/asterisk/PHPMailer/"; 
$from = "micorreo@midominio.com";  /* correo */
$fromName = "QuienEnvia";                  /* quien lo envia */
$host = "ssl://smtp.gmail.com";              /* servidor smpt */
$username = "micorreo@midominio";  /* usuario  */
$password = "mipassword";                   /* password */
$port = "465";                                            /* puerto   */
$subject = "[VM]: New Voicemail Message";   /* titulo del correo */


/***************** Este es el Cuerpo HTML,  editar las URLS **************************/
$body="
New Voicemail Received
Dear ${name}
You have a new voicemail on your mailbox: ${mailbox}. From the Number: ${cid} with duration: ${dur} the day ${date}
You can check it from the user's web page.
Best Regards.
Or Just Dial

You can hear the message from your phone just dialing the number 9898 and following the instructions.
Digital-Merge Voicemail System
"; /*************** Asignamos las varibales al constructor email ******************/ require($mail_lib_path . "class.phpmailer.php"); $mail = new PHPMailer(true); $mail -> IsHTML (true); $mail->IsSMTP(); //$mail->SMTPDebug = 1; // Habilita información SMTP (opcional para pruebas) // 1 = errores y mensajes // 2 = solo mensajes $mail->SMTPAuth = true; // Habilita la autenticación SMTP $mail->Subject = $subject; $mail->Body = $body; $mail->AddAddress($toemail,$name); $mail->From = $from; $mail->FromName = $fromName; $mail->Host = $host; $mail->Mailer = "smtp"; $mail->SMTPAuth = true; $mail->Username = $username; $mail->Password = $password; $mail->Port = $port; $mail->AddAttachment("/var/spool/asterisk/voicemail/default/".${mailbox}."/INBOX/".${msg2}.".wav"); /************* enviar email ******************************/ if($mail->Send()) { echo "\r\nSent Ok! \r\n"; } else { echo "\r\nSend Failed... \r\n"; echo $mail->ErrorInfo; } /**************** eliminamos el archivo temporal ******************/ unlink("/etc/asterisk/data_" .$time .".txt"); /****************** funcion para obtener una cadena entre dos palabras ****************/ function get_between ($text, $s1, $s2) { $mid_url = ""; $pos_s = strpos($text,$s1); $pos_e = strpos($text,$s2); for ( $i=$pos_s+strlen($s1) ; (( $i<($pos_e)) && $i < strlen($text)) ; $i++ ) { $mid_url .= $text[$i]; } return $mid_url; } ?>
4) Editamos el Archivo voicemail.conf para enviar las variables y ejecutar el script, solo editamos la parte del emailbody y el programa que se ejecutará:



emailbody=${VM_NAME}|${VM_MAILBOX}|${VM_DUR}|${VM_CALLERID}|${VM_DATE}
mailcmd=/etc/asterisk/sendvm.php
5) Finalmente cuando recibamos un nuevo buzón de voz la notificacón que llegara será como esta imagen:






Espero esto les sea de utilidad!