アプリケーションがクリティカルな状態を検出した場合、アプリケーションログや syserr_log にメッセージを書くことができますが、アプリケーションが注意を必要としていることを今すぐに誰かに通知するにはどうしたらいいでしょうか?明白な答えは、誰か、あるいは何人かにメールや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]*。
-to RECIPIENT@DOMAIN [-to RECIPIENT@DOMAIN] *。
[-verbose]
|
必要な引数は、SMTP サーバー、別名 mailhub (-h)、電子メール アドレスとしての送信者 (-f)、件名 (-s)、および少なくとも 1 つのメッセージ行 (-m) と受信者 (-t) です。件名やメッセージ行のテキストにスペースが含まれている場合は、引用符で囲む必要があります。vはオプションのデバッグ支援であり、すべての引数とSMTPサーバとの通信を表示することを示します。
例えば、携帯電話に紐づけられたアカウントにメールを送信したい場合は、次のように実行します。
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 1' -m 'n
+network is crashing call in' -m [email protected]
|
見ての通り、引数を最初の文字だけに省略することができ、申し訳ありませんが、私の携帯電話のメールアカウントを見ることはできません。メールは以下のようになっていました。
送り先は?ノア・デイビッド しけん 2010年10月28日 12:42 PM ネットワークがクラッシュしている 今すぐ! |
テキストメッセージの送信は、電子メールの送信と全く同じですが、"to"アドレスはphonenumber@phonecompanyです。電話番号は明らかに電話機の電話番号です。phonecompanyのドメインは電話会社によって異なります。
例えば
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 2' -m 'n
+ネットワークがクラッシュしています」 -m NOW!-トゥー555555555555@phonecompany
|
回線がつながっていることに気づくでしょうし、私の電話番号やサービス提供者も見られません。
お題:テスト2 ネットワークがクラッシュしています。 |
以下のリストを構成するエントリをこことここで見つけました...。私はSprintとVerizonをテストしましたが、他は自己責任でお願いします。
Alltel message.alltel.com AT&T txt.att.net AT&T MMS MMS.att.net Cingular cingularme.com メトロPCS MyMetroPcs.com Nextel messaging.nextel.com パワーテル ptel.net Sprint messaging.sprintpcs.com サンコム tms.suncom.com T-Mobile tmomail.net USセルラー email.uscc.net ベライゾン vtext.com ヴァージンモバイル vmobl.com |
gnu_library がインストールされていない場合は、ftp.stratus.com サーバ上に SMTP クライアントがありますので、ここをクリックしてバンドルをダウンロードしてください。バンドルには、ソースコードのほか、すべてのハードウェアタイプと TCP スタック用のプログラムモジュールが含まれています。
send_smtp_mail.pm -form
-------------------------------- send_smtp_mail ------------------------------
-smtp_server.
-to.
cc: -bcc: -bcc: -bcc: -bcc: -bcc
bcc: -smtp_server: -to: -cc: -bcc.
-からです。
reply_to: -reply_to.
-return_receipt_to.
-件名を指定します。
message_1.
message_2.
message_3.
message_4.
message_5.
message_6.
-ファイルを送信します。
-smtp_port: smtp
再試行回数: -retry_times.
ユーザー名: -user_name.
ユーザー名: -password.
-control.
ドメイン: -domain.
-重要度: 通常 -send_file_mode: テキスト
-authorization: none -force_: no
|
以下に実行例を示します。
send_smtp_mail.pm -s mailhub.stratus.com -fr [email protected] -sub 'test
+ 3'-msg 'network is crashing call in' -msg 'NOW [email protected]
[email protected] へのメール送信
|
コマンドライン引数はフォームの引数とは異なることに注意してください。コマンドライン引数を表示するには -help オプションを使います。
send_smtp_mail.pm -help
コマンドライン構文。(すべての引数には値が必要です)
-サーバ
-ポート|p
-to ;;...
-cc ;;;...
-bcc ;;;...
-から|fr
-返信|rp|rply
-戻り値|rtn
-重要度|i高|通常|低
-サブジェクト|サブ
-msg|m (複数可)
-file|f /text|html|binary|text_encl|html_encl (複数可)
-auth|a ログイン
-user|u (ログイン認証にのみ必要)
-password|pass (ログイン認証にのみ必要)
-ブレース|b yes|no
-ドメイン|ドメイン
-再試行|再試行
-コントロール
を有効にするには、他のすべてのオプションの前に -vos オプションを指定します。
|
これらはコマンドですが、どのようにしてアプリケーションに統合しますか?あなたのアプリケーションがPerlスクリプトであれば、私のスクリプトをテンプレートとして使用してSMTPモジュールを呼び出すことができます。同様に、send_smtp_mailモジュールのCコードをCアプリケーションに統合することができます。もう一つの方法は、Perlやsend_smtp.mailコマンドをアプリケーションから直接呼び出すことです。アプリケーションがC言語であると仮定すると、以下の呼び出しで動作します。
system ("perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'APP
+通信エラーが発生しました」 -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 test line 2' -m 'debug test line 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
+アドレスからの追加」 -msg 'NOW [email protected] へ
send_smtp_mail.250件の返信を期待しています。 受信しました553 5.5.4 noah.davids...ドメイン名 r
+必須
|
メールハブに到達できない場合は、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'
+sst 2' -msg 'network is crashing call in' -msg 'NOW [email protected]
send_smtp_mail.接続できません: mailhub.stratus.com ネットワークに接続しようとしています。
+EDには手が届きません。
|
間違った"to"アドレスを指定しても、どちらのコマンドからもエラーは発生しません。その結果、メールハブから"from"アドレスにメールが届かなかったことを示す電子メールが送られてくることがあります。
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
|