Sua aplicação acabou de detectar uma condição crítica, você pode escrever uma mensagem para um log de aplicação ou mesmo para o syserr_log, mas como você notifica alguém agora mesmo que a aplicação precisa de atenção? A resposta óbvia para enviar uma mensagem de e-mail ou SMS a alguém ou talvez a várias pessoas MAS o OpenVOS não tem nenhuma maneira construída para fazer isso, ou tem?
A 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 é SMTP.pm. Que de acordo com a documentação "implementa uma interface cliente para o protocolo SMTP e ESMTP, permitindo que uma aplicação perl5 fale com servidores SMTP".
Eu escrevi o seguinte script Perl usando esse módulo. Ao invocar o script sem nenhum argumento, você receberá a mensagem de uso
perl smtp.pl
Utilização:
perl smtp.pl -hub MAILHUB -from SENDER@DOMAIN -subject SUBJECT
-MENSAGEM [-message MESSAGE]*
-a RECIPIENT@DOMAIN [-a RECIPIENT@DOMAIN]*
[-verbose]
|
Os argumentos necessários são o servidor SMTP aka mailhub (-h), o remetente, como um endereço de e-mail (-f), um assunto (-s) e pelo menos 1 linha de mensagem (-m) e o destinatário (-t). Se o texto do assunto ou qualquer linha de mensagem contiver espaços, o texto deve ser incluído entre aspas. O -v é um auxiliar opcional de depuração e indica que todos os argumentos e comunicação com o servidor SMTP devem ser exibidos.
Por exemplo, se eu quiser enviar um e-mail para a conta vinculada ao meu telefone, eu poderia executar
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 1' -m 'n
+etwork está se chocando" -m AGORA!! -para [email protected]
|
Como você pode ver, você pode abreviar os argumentos para apenas suas primeiras cartas, e desculpe, mas você não consegue ver a conta de e-mail do meu telefone. O correio parecia
De: Noah Davids teste 1 28 de outubro de 2010 12:42 rede está travando a chamada em AGORA! |
Enviar uma mensagem de texto é exatamente o mesmo que enviar um e-mail, mas o endereço de "para" é o número de telefone@fonecompanhia. O número de telefone é obviamente o número de telefone do telefone. O domínio da empresa telefônica varia de acordo com a empresa telefônica.
Por exemplo
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 2' -m 'n
+etwork está se chocando" -m AGORA!! -para 5555555555@fonecompanhia
|
Você notará que as linhas estão unidas, e também não poderá ver meu número de telefone ou prestador de serviços.
Assunto:teste 2 rede está travando a chamada AGORA! |
Encontrei as entradas que compõem a seguinte lista aqui e aqui... Eu testei Sprint e Verizon, vocês estão por conta própria com os outros.
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 a gnu_library instalada, existe um cliente SMTP no servidor ftp.stratus.com, você pode baixar um pacote clicando aqui. O pacote inclui 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:
-to:
-cc:
-bcc:
-from:
-reply_to:
-receipt_receipt_to:
-subject:
message_1:
message_2:
message_3:
message_4:
message_5:
message_6: mensagem_6:
-send_file:
-smtp_port: smtp
-retry_times:
-nome_do_usuário:
-password:
-controle:
-domain:
-importância: normal -send_file_mode: texto
-autorização: nenhuma -force_: não
|
Aqui está um exemplo de execução.
send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'test
+ 3' -msg 'network is crashing call in' -msg 'AGORA! -to [email protected]
Correio 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 exigem um valor a ser seguido)
-server|s
-port|p
-to ;;;...
-cc ;;;...
-bcc ;;;...
-from|fr
-reply|rp|rply
-retorno|rtn
-importância|i alta|normal|baixa
-subject|subject
-msg|m (múltiplos permitidos)
-file|f /text|html|binary|text_encl|html_encl (múltiplos permitidos)
-auth|a login
-user|u (somente necessário para login auth)
-password|pass (somente necessário para login auth)
-b sim|b sim|não
-domínio
-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.
|
Estes são comandos, como integrá-los em uma aplicação? Bem, obviamente se sua aplicação é um script Perl você pode usar meu script como um modelo para fazer chamadas para o módulo SMTP. Da mesma forma, você pode integrar o código C dos módulos send_smtp_mail em sua aplicação C. A outra alternativa é apenas chamar o Perl ou o comando send_smtp.mail diretamente de sua aplicação. Assumindo que sua aplicação esteja em C, a seguinte chamada funcionará
sistema ("perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'APPL
ALERTA DE +ICAÇÃO' -m 'Algum evento de falha ocorreu' -t [email protected]");
|
Se você estiver usando PL1 ou Cobol, você precisará escrever uma rotina C e ligá-la em sua aplicação.
Finalmente, vamos falar de erros.
Se houver um problema com o endereço do módulo SMTP Perl, o módulo SMTP Perl irá relatar
perl smtp.pl -h mailhub.stratus.com -f noah.davids -m 'debug test line 1' -m 'de
+ linha de teste de depuração 2' -m 'linha de teste de depuração 3' -to [email protected] -s 'teste 4
A configuração de erro a partir do endereço sugere a configuração do modo verboso
|
Usando o argumento verboso sugerido, você pode ver o que o servidor SMTP está relatando.
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 send_smtp_mail.pm irá relatar a resposta do servidor SMTP sem qualquer esforço extra.
send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids -sub 'teste 4' -msg 'b
+ad from address' -msg 'AGORA!'! -para [email protected]
send_smtp_mail: Resposta esperada: 250. Recebido: 553 5.5.4 noah.davids... Nome de domínio r
+equipado
|
Se você não conseguir chegar ao mailhub, o script Perl irá relatar
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>
|
Os relatórios de comando send_smtp_mail
pm>send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'te
+st 2' -msg 'a rede está travando a chamada' -msg 'AGORA! -para [email protected]
send_smtp_mail: Não consigo me conectar a: mailhub.stratus.com Rede tentando ser alcançado
+ed é inalcançável.
|
Um mau endereço "para" não gerará nenhum erro de nenhum dos comandos. Pode resultar em um e-mail do mailhub para o endereço "de" indicando que o correio não pôde ser entregue.
O roteiro do smtp.pl Perl:
# 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
|