Passa al contenuto principale

La vostra applicazione ha appena rilevato una condizione critica, potete scrivere un messaggio su un log dell'applicazione o anche il syserr_log, ma come si fa a comunicare a qualcuno in questo momento che l'applicazione ha bisogno di attenzione? La risposta ovvia per inviare una e-mail o un messaggio SMS a qualcuno o forse a più persone, MA OpenVOS non ha un modo costruito per farlo, o no?

La gnu_library include il comando Perl e un gran numero di moduli Perl (file pm, da non confondere con i moduli del programma). Uno di questi moduli è SMTP.pm. Che secondo la documentazione "implementa un'interfaccia client per il protocollo SMTP e ESMTP, permettendo ad un'applicazione perl5 di parlare con i server SMTP".

Ho scritto il seguente script Perl usando quel modulo. Invocare lo script senza argomenti vi darà il messaggio di utilizzo

perl smtp.pl

Uso:
   perl smtp.pl -hub MAILHUB -da SENDER@DOMAIN -soggetto SOGGETTO
                -messaggio MESSAGGIO [-messaggio MESSAGGIO]*
                -al RICERCATORE@DOMINIO [-al RICERCATORE@DOMINIO]*
                [-verbose]

Gli argomenti richiesti sono il server SMTP aka mailhub (-h), il mittente, come indirizzo e-mail (-f), un oggetto (-s) e almeno 1 riga di messaggio (-m) e il destinatario (-t). Se il testo dell'oggetto o di una qualsiasi riga del messaggio contiene spazi, il testo deve essere racchiuso tra virgolette. Il -v è un aiuto facoltativo per il debug e indica che tutti gli argomenti e la comunicazione con il server SMTP devono essere visualizzati.

Ad esempio, se voglio inviare un'e-mail al conto legato al mio telefono posso eseguire

perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'test 1' -m 'n
+il lavoro è in crash call in' -m ORA! -a XXXXXX@YYYYY.com

Come potete vedere, è possibile abbreviare gli argomenti solo alle prime lettere, e mi dispiace ma non si arriva a vedere l'account di posta elettronica del mio telefono. La posta sembrava

Da: Noah Davids
prova 1
28 ottobre 2010 12:42 PM

la rete è in crash
ORA!

L'invio di un messaggio di testo è esattamente uguale all'invio di un'e-mail, ma l'indirizzo "to" è phonenumber@phonecompany. Il numero di telefono è ovviamente il numero di telefono del telefono. Il dominio di phonecompany varia a seconda della compagnia telefonica.

Per esempio

perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'test 2' -m 'n
+il lavoro è in crash call in' -m ORA! -a 55555555555555@phonecompany

Noterete che le linee sono collegate e non potrete vedere il mio numero di telefono o il mio fornitore di servizi.

Soggetto: test 2
 la rete è in crash di chiamata ORA!

Ho trovato le voci che compongono la seguente lista qui e qui.. Ho testato Sprint e Verizon, tu sei da solo con gli altri.

Alltel message.alltel.com
AT&T txt.att.net
AT&T MMS MMS.att.net
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 non avete installato gnu_library c'è un client SMTP sul server ftp.stratus.com, potete scaricare un bundle cliccando qui. Il bundle include il codice sorgente e anche moduli di programma per tutti i tipi di hardware e stack TCP.

inviare_smtp_mail.pm -forma

-------------------------------- send_smtp_mail ------------------------------
 -smtp_server:
 -a:
 -cc:
 -bcc:
 -da:
 -rispondi_a:
 -reply_receipt_to:
 -soggetto:
 messaggio_1:
 messaggio_2:
 messaggio_3:
 messaggio_4:
 messaggio_5:
 messaggio_6:
 -inviare_file:
 -smtp_port: smtp
 -Tempo_di_prova:
 -nome_utente:
 -password:
 -controllo:
 -dominio:
 -importanza: normale -modalità_invio_file_mode_di_file: testo
 -autorizzazione: nessuna -forza_: no

Ecco un esempio di esecuzione.

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids@stratus.com -sub 'test
+ 3' -msg 'la rete è in crash call in' -msg 'ORA !! -a XXXXXX@YYYYY.com
Posta inviata a XXXXXX@YYYYY.com

Si noti che gli argomenti della riga di comando sono diversi da quelli del modulo. Per visualizzare gli argomenti della riga di comando usare l'opzione -help

inviare_smtp_mail.pm -aiuto      

 Sintassi della riga di comando: (Tutti gli argomenti richiedono un valore da seguire)

-server|s
 -porta|p
 -a ;;;...
 -cc ;;;...
 -bcc ;;;...
 -da|fr
 -rispondi|rp|rp|rp
 -ritorno|rtn
 -importanza|i alto|normale|basso
 -soggetto|sottoposto
 -msg|m (multiplo consentito)
 -file|f /text|html|binary|text_encl|html_encl (multiplo consentito)
 -auth|un login
 -utente|u (necessario solo per l'autenticazione del login)
 -password|pass (necessario solo per l'autenticazione del login)
 -b sì|b sì|no
 -dominio
 -riprova|ret
 -controllo|c

per abilitare il modo di modulo VOS, fornire l'opzione -vos prima di TUTTE le altre opzioni.

Questi sono comandi, come si integrano in un'applicazione? Beh, ovviamente se la vostra applicazione è uno script Perl potete usare il mio script come modello per effettuare chiamate al modulo SMTP. Allo stesso modo potete integrare il codice C dei moduli send_smtp_mail nella vostra applicazione C. L'altra alternativa è semplicemente chiamare Perl o il comando send_smtp.mail direttamente dalla vostra applicazione. Supponendo che la vostra applicazione sia in C, la seguente chiamata funzionerà

sistema ("perl smtp.pl -h mailhub.stratus.com -f noah.davids@stratus.com -s 'APPL
+ICATION ALERT' -m 'Si è verificato qualche evento di guasto' -t XXXXXX@YYYYY.com");

Se si utilizza PL1 o Cobol è necessario scrivere una routine C e legarla nella propria applicazione.

Infine, parliamo degli errori.

Se c'è un problema con l'indirizzo di partenza, il modulo SMTP Perl segnalerà

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'.
L'impostazione dell'errore dall'indirizzo suggerisce l'impostazione del modo verboso

Usando l'argomento verboso suggerito si può vedere ciò che il server SMTP sta riportando.

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

Il send_smtp_mail.pm riporterà la risposta del server SMTP senza alcun prodding aggiuntivo.

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids -sub 'test 4' -msg 'b
+ad dall'indirizzo" -msg 'ORA !! -a XXXXXX@YYYYY.com
inviare_smtp_mail: Atteso 250 risposte.  Ricevuto: 553 5.5.4 noah.davids... Nome a dominio r
+richiesto

Se non si riesce a raggiungere il mailhub lo script Perl riporterà

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>

Il comando send_smtp_mail riporta

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
inviare_smtp_mail: Non riesco a connettermi a: mailhub.stratus.com Rete che cerca di essere raggiungibile
+ed è irraggiungibile.

Un cattivo indirizzo "to" non genererà alcun errore da nessuno dei due comandi. Potrebbe risultare un'e-mail dal mailhub all'indirizzo "da" che indica che la posta non può essere recapitata.

Lo script smtp.pl Perl:

# 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

 

© 2020 Stratus Tecnologie.