Ir para o conteúdo principal

Sua aplicação acaba de detectar uma condição crítica; você pode registrar uma mensagem no log da aplicação ou até mesmo no syserr_log, mas como notificar alguém imediatamente de que a aplicação precisa de atenção? A resposta óbvia seria enviar um e-mail ou uma mensagem SMS para uma pessoa, ou talvez para várias pessoas, MAS o OpenVOS não possui nenhuma funcionalidade integrada para fazer isso, ou será que possui?

A biblioteca gnu_library inclui o comando Perl e um grande número de módulos Perl (arquivos pm, que não devem ser confundidos com módulos de programa). Um desses módulos é o SMTP.pm. De acordo com a documentação, ele “implementa uma interface de cliente para os protocolos SMTP e ESMTP, permitindo que uma aplicação Perl 5 se comunique com servidores SMTP”.

Escrevi o seguinte script em Perl usando esse módulo. Ao executar o script sem nenhum argumento, você verá a mensagem de instruções de uso

perl smtp.pl

Uso:
   perl smtp.pl -hub MAILHUB -from SENDER@DOMAIN -subject SUBJECT
                -message MESSAGE [-message MESSAGE]*
                -to RECIPIENT@DOMAIN [-to RECIPIENT@DOMAIN]*
                [-verbose]

Os argumentos obrigatórios são o servidor SMTP, também conhecido como mailhub (-h), o remetente, na forma de um endereço de e-mail (-f), um assunto (-s) e, no mínimo, uma linha de mensagem (-m) e um destinatário (-t). Se o texto do assunto ou de qualquer linha de mensagem contiver espaços, ele deve ser colocado entre aspas. O -v é um recurso opcional de depuração e indica que todos os argumentos e a comunicação com o servidor SMTP devem ser exibidos.

Por exemplo, se eu quiser enviar um e-mail para a conta vinculada ao meu celular, eu poderia executar

perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'teste 1' -m 'a rede está travando, ligue' -m AGORA!! -para [email protected]

Como você pode ver, é possível abreviar os argumentos usando apenas suas iniciais, e, desculpe, mas você não vai conseguir ver a conta de e-mail do meu celular. O e-mail era mais ou menos assim:

De: Noah Davids
teste1
28 de outubro de 2010, 12h42

a rede está travando, ligue para nós
AGORA!

Enviar uma mensagem de texto é exatamente igual a enviar um e-mail, mas o endereço de destino é númerodetelefone@operadora. O “número detelefone” é, obviamente, o número de telefone do aparelho. O domínio da operadora varia de acordo com a operadora.

Por exemplo

perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 2' -m 'A rede está travando, ligue' -m AGORA!! -to 5555555555@phonecompany

Você vai notar que as linhas estão unidas, e também não dá para ver meu número de telefone nem a operadora.

Assunto: teste 2
A rede está travando. Ligue AGORA!

Encontrei as entradas que compõem a lista a seguir aqui e aqui. Já testei a Sprint e a Verizon; quanto às outras, você terá que se virar sozinho.

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

Se você não tiver o gnu_library instalado, há um cliente SMTP no servidor ftp.stratus.com; você pode baixar um pacote clicando aqui. O pacote inclui o código-fonte e também módulos de programa para todos os tipos de hardware e pilhas TCP.

send_smtp_mail.pm -form

-------------------------------- send_smtp_mail ------------------------------
 -smtp_server:
 -para:
 -cc:
 -cco:
 -de:
 -responder para:
 -confirmação de recebimento para:
 -assunto:
 mensagem_1:
 mensagem_2:
 mensagem_3:
 mensagem_4:
 mensagem_5:
 mensagem_6:
 -send_file:
 -smtp_port:         smtp
 -retry_times:
 -user_name:
 -password:
 -control:
 -domain:
 -importance:        normal              -send_file_mode:    text
 -authorization:     none                -force_:          no

Aqui está um exemplo de execução.

send_smtp_mail.pm -s mailhub.stratus.com -fr  [email protected] -sub 'test\
+ 3' -msg 'A rede está travando, entre em contato'  -msg 'AGORA !!' -to [email protected]\
E-mail enviado para [email protected]

Observe que os argumentos da linha de comando são diferentes dos argumentos do formulário. Para exibir os argumentos da linha de comando, use a opção -help

send_smtp_mail.pm -help                                                        

 Sintaxe da linha de comando: (Todos os argumentos devem ser seguidos por um valor)

-server|s
 -port|p
 -to ;;...
 -cc ;;...
 -bcc ;;...
 -from|fr
 -reply|rp|rply
 -return|rtn
 -importance|i high|normal|low
 -subject|sub
 -msg|m     (vários permitidos)
 -file|f /text|html|binary|text_encl|html_encl    (vários permitidos)
 -auth|a login
 -user|u           (necessário apenas para autenticação de login)
 -password|pass     (necessário apenas para autenticação de login)
 -braces|b sim|não
 -domain|dom
 -retry|ret
 -control|c

para ativar o modo de formulário VOS, forneça a opção -vos antes de TODAS as outras opções.

Esses são comandos, como integrá-los a um aplicativo? Bem, obviamente, se o seu aplicativo for um script em Perl, você pode usar o meu script como modelo para fazer chamadas ao módulo SMTP. Da mesma forma, você pode integrar o código C dos módulos send_smtp_mail ao seu aplicativo em C. A outra alternativa é simplesmente chamar o Perl ou o comando send_smtp.mail diretamente do seu aplicativo. Supondo que o seu aplicativo seja em C, a seguinte chamada funcionará

sistema ("perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'APPL
+ICATION ALERT' -m 'Ocorreu algum evento de falha' -t [email protected]");

Se você estiver usando PL1 ou Cobol, precisará escrever uma rotina em C e integrá-la à sua aplicação.

Por fim, vamos falar sobre erros.

Se houver algum problema com o endereço de remetente, o módulo SMTP do Perl irá informar

perl smtp.pl -h mailhub.stratus.com -f noah.davids -m 'linha de teste de depuração 1' -m 'debug test line 2' -m 'linha de teste de depuração 3' -to [email protected] -s 'test 4'
Erro ao definir o endereço de origem; sugere-se ativar o modo detalhado

Ao usar o argumento "verbose" sugerido, você pode ver o que o servidor SMTP está informando.

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 [email protected] -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] = [email protected]

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

O arquivo send_smtp_mail.pm exibirá a resposta do servidor SMTP sem que seja necessário fazer nada a mais.

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids -sub  'test 4'  -msg 'b
+endereço de remetente' -msg 'AGORA !!' -to [email protected]
send_smtp_mail: Esperava uma resposta 250.  Recebido: 553 5.5.4 noah.davids... Nome de domínio r\
+exigido

Se não for possível acessar o servidor de e-mail, o script Perl exibirá uma mensagem

perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 1' -m 'n
+etwork is crashing call in' -m NOW!! -to [email protected]
Cannot reach mailhub <mailhub.stratus.com>

O comando send_smtp_mail exibe

pm>send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'te
+st 2' -msg 'A rede está travando, liguem' -msg 'AGORA !!' -to [email protected]
send_smtp_mail: Não é possível conectar-se a: mailhub.stratus.com A rede que se está tentando acessar
+ está inacessível.

Um endereço de destino incorreto não gerará erros em nenhum dos comandos. Isso pode resultar no envio de um e-mail do servidor de e-mail para o endereço de remetente, indicando que a mensagem não pôde ser entregue.

O script Perl smtp.pl:

# smtp.pl begins here
#
#
# Version 1.00 10-10-31
# [email protected]
#
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

 

© 2024 Stratus Technologies.