跳转至主要内容

你的应用程序刚刚检测到了一个关键条件,你可以在应用程序日志或syserr_log中写一个消息,但是你如何通知某人现在的应用程序需要注意?很明显的答案是发送E-mail或SMS消息给某个人或几个人,但是OpenVOS没有任何内置的方法来做这件事,或者说没有?

gnu_library包括Perl命令和大量的Perl模块(pm文件,不要和程序模块混淆)。其中一个模块是SMTP.pm。根据文档,它"实现了一个SMTP和ESMTP协议的客户端接口,使perl5应用程序能够与SMTP服务器对话"。

我使用该模块编写了以下Perl脚本。在没有任何参数的情况下调用这个脚本,会得到如下的使用信息。

perl smtp.pl

使用方法
   perl smtp.pl -hub MAILHUB -from SENDER@DOMAIN -subject SUBJECT(主题)。
                -message MESSAGE [-message MESSAGE]*。
                -to RECIPIENT@DOMAIN [-to RECIPIENT@DOMAIN]*---。
                [-verbose]

所需的参数是SMTP服务器,也就是mailhub (-h),发件人,作为E-mail地址(-f),主题(-s)和至少1条消息行(-m)和收件人(-t)。如果主题的文本或任何消息行包含空格,文本必须用引号括起来。-v是一个可选的调试辅助工具,表示所有参数和与SMTP服务器的通信都应该被显示。

例如,如果我想向绑定在手机上的账户发送电子邮件,我可以执行

perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 1' -m 'n'。
+网络崩溃了,现在就呼叫!-to [email protected]

正如你所看到的,你可以将参数缩写为只有它们的第一个字母,对不起,但你无法看到我手机的E-mail账户。这封邮件看起来像

来自:Noah Davids
测试1
2010年10月28日 12:42下午

网络瘫痪
现在!

发短信和发E-mail完全一样,但"收"的地址是phonenumber@phonecompany。Phone number显然是手机的电话号码。phonecompany的域名会根据电话公司的不同而有所不同。

比如说

perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 2' -m 'n'。
"+网络崩溃,请立即呼叫" -m!-to 5555555555@phonecompany

你会注意到,线路是连在一起的,你也看不到我的电话号码和服务商。

主题:测试2
 网络崩溃了,请马上打电话过来!

我在这里 这里找到了组成以下列表的条目。我已经测试了Sprint和Verizon,其他的就靠你自己了。

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。
舜坤公司
T-Mobile tmomail.net
US Cellular email.uscc.net
Verizon vtext.com
Virgin Mobile vmobl.com

如果你没有安装gnu_library,在ftp.stratus.com服务器上有一个SMTP客户端,你可以点击这里下载一个捆绑包。该软件包包括源代码和所有硬件类型和TCP堆栈的程序模块。

send_smtp_mail.pm -form

-------------------------------- send_smtp_mail ------------------------------
 -smtp_server:
 -to:
 -cc:
 -bcc:
 -from:
 -reply_to:
 -reply_to: -return_receipt_to:
 -subject:
 信息_1:
 message_2:
 信息_3: -信息_4: -信息_5: -信息_6:
 訊息_4:
 訊息_5: 訊息_6: 訊息_3: 訊息_4: 訊息_5:
 message_6: -send_file:
 -send_file: -smtp_port: smtp
 -smtp_port: smtp
 -retry_times:
 -user_name:
 -password:
 -control:
 -domain: -importance: normal -send_file_mode: text
 -importance: normal -send_file_mode: text.
 -authorization: none -force_: no

下面是一个执行的例子。

send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'test'。
+ 3'-msg'网络正在崩溃呼叫中' -msg'NOW !'-to [email protected]
邮件发送至:[email protected]

请注意,命令行参数与表格参数不同。要显示命令行参数,请使用 -help 选项。

send_smtp_mail.pm -help     

 命令行语法。(所有参数后面都需要一个值)

-server|s
 -port|p
 -to;;...
 -cc;;...
 -bcc;;...
 -from|fr
 -reply|rp|rply
 -return|rtn
 -重要性|i高|正常|低
 -subject|sub
 -msg|m (允许多个)
 -file|f /text|html|binary|text_encl|html_encl (允许多个)
 -auth|a登录
 -user|u (只在登录认证时需要)
 -password|pass (仅在登录认证时需要)
 -braces|b yes|no
 -domain|dom
 -retry|ret
 -control|c

要启用 VOS 表格模式,请在所有其他选项之前提供 -vos 选项。

这些都是命令,你如何将它们集成到应用程序中?很显然,如果你的应用程序是一个Perl脚本,你可以使用我的脚本作为模板来调用SMTP模块。同样的道理,你也可以将send_smtp_mail模块的C代码集成到你的C应用程序中。另一种方法是直接从你的应用程序中调用Perl或send_smtp.mail命令。假设你的应用程序是用C语言编写的,下面的调用就可以了

系统("perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'APPL'。
+ICATION ALERT' -m 'Some failure event has occurred' -t [email protected]")。

如果你使用的是PL1或Cobol,你将需要编写一个C例程并将其绑定到你的应用程序中。

最后,我们来谈谈错误。

如果from地址有问题,SMTP Perl模块会报告说

perl smtp.pl -h mailhub.stratus.com -f noah.davids -m 'debug test line 1' -m 'de'。
+bug 测试行 2' -m 'debug 测试行 3' -to [email protected] -s 'test 4' 。
从地址设置错误,建议设置静音模式。

使用建议的 verbose 参数,你可以看到 SMTP 服务器的报告。

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

send_smtp_mail.pm会报告SMTP服务器的响应,不需要任何额外的催促。

send_smtp_mail.pm -s mailhub.stratus.com -fr noah.davids -sub 'test 4' -msg 'b'。
'+ad from address' -msg 'NOW !-to [email protected]
send_smtp_mail。预计有250个回复  收到553 5.5.4 noah.davids...域名
+所需

如果你无法到达mailhub,Perl脚本会报告说

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>

send_smtp_mail命令会报告

pm>send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'te'。
'+st 2' -msg 'network is crashing call in' -msg 'NOW !'-to [email protected]
send_smtp_mail。无法连接到: mailhub.stratus.com 试图连接的网络。
+ed是无法到达的。

一个错误的"to"地址不会从这两个命令中产生任何错误。它可能会导致从mailhub到"from"地址的E-mail,表明邮件无法送达。

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

 

© 2024Stratus Technologies.