Ir al contenido principal

Su aplicación acaba de detectar una condición crítica, puede escribir un mensaje en un registro de la aplicación o incluso en el syserr_log, pero ¿cómo se notifica a alguien ahora mismo que la aplicación necesita atención? La respuesta obvia para enviar un e-mail o un mensaje SMS a alguien o tal vez a varios, pero OpenVOS no tiene ninguna forma incorporada para hacer esto, ¿o sí?

La gnu_library incluye el comando Perl y un gran número de módulos de Perl (archivos pm, no confundir con los módulos de programa). Uno de esos módulos es SMTP.pm. El cual de acuerdo con la documentación "implementa una interfaz de cliente para el protocolo SMTP y ESMTP, permitiendo a una aplicación perl5 hablar con los servidores SMTP".

He escrito el siguiente script Perl usando ese módulo. Invocando el script sin ningún argumento le dará el mensaje de uso

perl smtp.pl

Uso:
   perl smtp.pl -hub MAILHUB -de SENDER@DOMAIN -sujeto
                -MENSAJE DE MENSAJE [MENSAJE DE MENSAJE]*
                -a RECIPIENTE@DOMINIO [-a RECIPIENTE@DOMINIO]*
                [-verbosa]

Los argumentos requeridos son el servidor SMTP alias mailhub (-h), el remitente, como una dirección de correo electrónico (-f), un asunto (-s) y al menos una línea de mensaje (-m) y el destinatario (-t). Si el texto del asunto o de alguna línea del mensaje contiene espacios, el texto debe ir entre comillas. La -v es una ayuda opcional de depuración e indica que deben mostrarse todos los argumentos y la comunicación con el servidor SMTP.

Por ejemplo, si quiero enviar un e-mail a la cuenta vinculada a mi teléfono podría ejecutar

perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'prueba 1' -m 'n
+La red se está colapsando... ¡¡¡Llama ahora!!! -a XXXXXX@YYYYY.com

Como puede ver, puede abreviar los argumentos a sólo sus primeras letras, y lo siento pero no puede ver la cuenta de correo electrónico de mi teléfono. El correo parecía

De: Noah Davids
prueba 1
Oct 28, 2010 12:42 PM

la red está colapsando la llamada
¡AHORA!

Enviar un mensaje de texto es exactamente lo mismo que enviar un e-mail, pero la dirección de destino es phonenumber@phonecompany. El número de teléfono es obviamente el número de teléfono del teléfono. El dominio de la compañía telefónica variará dependiendo de la compañía telefónica.

Por ejemplo

perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'test 2' -m 'n
+La red se está colapsando... ¡¡¡Llama ahora!!! -a 5555555555@compañía telefónica

Notará que las líneas están unidas, y tampoco podrá ver mi número de teléfono o mi proveedor de servicios.

Sujeto: prueba 2
 la red está colapsando la llamada en AHORA!

Encontré las entradas que componen la siguiente lista aquí y aquí... He probado a Sprint y Verizon, estás solo con los demás.

Alltel message.alltel.com
AT&T txt.att.net
AT&T MMS MMS.att.net
Cingular cingularme.com
Metro PCS MyMetroPcs.com
Nextel messaging.nextel.com
Powertel ptel.net
Sprint messaging.sprintpcs.com
SunCom tms.suncom.com
T-Mobile tmomail.net
US Cellular email.uscc.net
Verizon vtext.com
Virgin Mobile vmobl.com

Si no tiene la gnu_library instalada hay un cliente SMTP en el servidor ftp.stratus.com, puede descargar un paquete haciendo clic aquí. El paquete incluye el código fuente y también los módulos de programa para todos los tipos de hardware y las pilas TCP.

send_smtp_mail.pm -form

-------------------------------- send_smtp_mail ------------------------------
 -smtp_server:
 -to:
 -cc:
 -bcc:
 -de:
 -reply_to:
 -retorno_recibido_a:
 -sujeto:
 mensaje_1:
 mensaje_2:
 mensaje_3:
 mensaje_4:
 mensaje_5:
 mensaje_6:
 -enviar_fichero:
 -smtp_port: smtp
 -...reintentar los tiempos:
 -nombre_de_usuario:
 -contraseña:
 -control:
 -dominio:
 -importancia: normal -modo_de_envío_de_ficheros: texto
 -autorización: ninguna -fuerza_: no

Aquí hay un ejemplo de ejecución.

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids@stratus.com -sub 'test
+ 3' -msg 'network is crashing call in' -msg 'NOW !!' -a XXXXXX@YYYYY.com
Correo enviado a XXXXXX@YYYYY.com

Observe que los argumentos de la línea de comandos son diferentes de los argumentos de la forma. Para mostrar los argumentos de la línea de comandos utilice la opción -help

send_smtp_mail.pm -help     

 Sintaxis de la línea de mando: (Todos los argumentos requieren un valor para seguir)

-servidor|s
 -puerto|p
 -...a...
 -cc ;;;...
 -bcc ;;;...
 -...desde...
 -Responde.
 -retorno|rtn
 -La importancia es alta, normal, baja...
 -sujeto
 -msg|m (múltiples permitidos)
 -fichero|f /texto|html|binario|text_encl|html_encl (múltiples permitidos)
 -auth|a login
 -usuario|u (sólo se necesita para la autentificación de acceso)
 -contraseña|pasaporte (sólo se necesita para el acceso a la autentificación)
 -abrazaderas sí, no...
 -...el dominio...
 -retry|ret
 -control...

para habilitar el modo de forma VOS, suministrar la opción -vos antes que TODAS las demás opciones.

Estos son comandos, ¿cómo los integras en una aplicación? Bueno, obviamente si tu aplicación es un script Perl puedes usar mi script como una plantilla para hacer llamadas al módulo SMTP. De la misma manera puedes integrar el código C de los módulos send_smtp_mail en tu aplicación C. La otra alternativa es simplemente llamar a Perl o al comando send_smtp.mail directamente desde su aplicación. Asumiendo que su aplicación está en C, la siguiente llamada funcionará

sistema ("perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'APPL
+ALERTA DE ICE' -m 'Algún evento de falla ha ocurrido' -t XXXXXX@YYYYY.com");

Si está usando PL1 o Cobol, tendrá que escribir una rutina C y vincularla a su solicitud.

Por último, hablemos de los errores.

Si hay un problema con la dirección "from" el módulo Perl SMTP informará

perl smtp.pl -h mailhub.stratus.com -f noah.davids -m 'debug test line 1' -m 'de
+bug test line 2' -m 'debug test line 3' -to XXXXXX@YYYYY.com -s 'test 4'
La configuración de error de la dirección sugiere la configuración del modo verborreico

Usando el argumento verboso sugerido puedes ver lo que el servidor SMTP está reportando.

perl smtp.pl -h mailhub.stratus.com -f noah.davids -m 'debug test line 1' -m 'de
+bug test line 2' -m 'debug test line 3' -to XXXXXX@YYYYY.com -s 'test 4' -v
mailhub = mailhub.stratus.com
from = noah.davids
subject = test 4
message [0] = debug test line 1
message [1] = debug test line 2
message [2] = debug test line 3
to [0] = XXXXXX@YYYYY.com

Net::SMTP: Net::SMTP(2.24)
Net::SMTP:   Net::Cmd(2.21)
Net::SMTP:     Exporter(5.566)
Net::SMTP:   IO::Socket::INET(1.26)
Net::SMTP:     IO::Socket(1.27)
Net::SMTP:       IO::Handle(1.21)

Net::SMTP=GLOB(0x402f9c04)>>> MAIL FROM:
Net::SMTP=GLOB(0x402f9c04)<<< 553 5.5.4 ... Domain name required fo
+r sender address noah.davids
Error setting from address  suggest setting verbose mode

El send_smtp_mail.pm reportará la respuesta del servidor SMTP sin ningún tipo de picanto extra.

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids -sub 'test 4' -msg 'b
+ad desde la dirección' -msg 'AHORA!!' -a XXXXXX@YYYYY.com
send_smtp_mail: Se espera una respuesta de 250.  Recibido: 553 5.5.4 noah.davids... Nombre de dominio r
+equipado

Si no puedes contactar con el mailhub el script Perl informará

perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'test 1' -m 'n
+etwork is crashing call in' -m NOW!! -to XXXXXX@YYYYY.com
Cannot reach mailhub <mailhub.stratus.com>

El comando send_smtp_mail informa

pm>send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids@stratus.com -sub 'te
+st 2' -msg 'network is crashing call in' -msg 'NOW !!' -a XXXXXX@YYYYY.com
send_smtp_mail: No se puede conectar a: mailhub.stratus.com Network tratando de ser alcanzado
+ed es inalcanzable.

Una mala dirección de destino no generará ningún error de ninguno de los comandos. El resultado puede ser un correo electrónico del mailhub a la dirección "de" indicando que el correo no pudo ser entregado.

El guión de Perl smtp.pl:

# smtp.pl begins here
#
#
# Version 1.00 10-10-31
# noah.davids@stratus.com
#
use Net::SMTP;
use Getopt::Long;
use strict;

my ($mailHub, @To, $From, $Subject, @Message, $Verbose);
my ($Result, $i, $toList);
my ($smtp);

$Result = GetOptions ("hub=s"      => $mailHub,
                      "to=s"       => @To,
                      "from=s"     => $From,
                      "subject=s"  => $Subject,
                      "message=s"  => @Message,
                      "verbose"    => $Verbose);

if (($Result != 1) || !defined($mailHub) || !defined($From) ||
                      !defined($Subject) || !defined(@Message) ||
                      !defined(@To))
   {
   if (defined($mailHub)) { print "mailhub = " . $mailHub . "n"; }
   if (defined($From))    { print "from = " . $From . "n" ; }
   if (defined($Subject)) { print "subject = " . $Subject . "n"; }
   for ($i = 0; $i < @Message; $i++)
        { print "message [" . $i . "] = " . $Message[$i] . "n"; }
   for ($i = 0; $i < @To; $i++)
        { print "to [" . $i . "] = " . $To[$i] . "n"; }
   print "nnUsage:n";
   print "tperl smtp.pl -hub MAILHUB -from SENDER@DOMAIN -subject SUBJECTn";
   print "ttt-message MESSAGE [-message MESSAGE]*n";
   print "ttt-to RECIPIENT@DOMAIN [-to RECIPIENT@DOMAIN]*n";
   print "ttt[-verbose]nn";
   exit;
   }

if (defined($Verbose))
   {
   if (defined($mailHub)) { print "mailhub = " . $mailHub . "n"; }
   if (defined($From))    { print "from = " . $From . "n" ; }
   if (defined($Subject)) { print "subject = " . $Subject . "n"; }
   for ($i = 0; $i < @Message; $i++)
        { print "message [" . $i . "] = " . $Message[$i] . "n"; }
   for ($i = 0; $i < @To; $i++)
        { print "to [" . $i . "] = " . $To[$i] . "n"; }
   }

$smtp = Net::SMTP->new($mailHub) || die "Cannot reach mailhub <" .
                                        $mailHub . ">n";

if (defined($Verbose)) { $smtp->debug(1); }

$smtp->mail($From) || die "Error setting from address <" . $From .
                          "> suggest setting verbose moden";

$toList = $To[0];
$smtp->to($To[0]) || die "Error setting to address <" . $To[0] .
                          "> suggest setting verbose moden";

for ($i = 1; $i < @To; $i++)
    {
    $toList = $toList . ";" . $To[$i];
    $smtp->to($To[$i]) || die "Error setting to address <" . $To[$i] .
                          "> suggest setting verbose moden";

    }

$smtp->data() || die "Error setting data suggest setting verbose moden";

$smtp->datasend("To: " . $toList . "n") ||
       die "Error sending To string <" . $toList .
           "> suggest setting verbose moden";

$smtp->datasend("Subject: " . $Subject . "n") ||
       die "Error sending Subject string <" . $Subject .
           "> suggest setting verbose moden";

$smtp->datasend("n") ||
       die "Error sending newline suggest setting verbose moden";

for ($i = 0; $i < @Message; $i++)
   {
   $smtp->datasend($Message[$i] . "n") || die
       die "Error sending message " . $i . " <" . $Message[$i] .
           "> suggest setting verbose moden";
   }

$smtp->dataend() || die "Error ending data send " .
                        "suggest setting verbose moden";

$smtp->quit || die "Error closing connection suggest setting verbose moden";
#
# smtp.pl ends here