アプリケーションが重大な異常を検知しました。アプリケーションログやsyserr_logにメッセージを書き込むことはできますが、アプリケーションに手動での対応が必要であることを、今すぐ誰かに通知するにはどうすればよいでしょうか? 当然の答えは、1人あるいは数人にEメールやSMSを送ることですが、OpenVOSにはこれを行うための組み込み機能がありません……それとも、あるのでしょうか?
gnu_library には、Perl コマンドおよび多数の Perl モジュール(pm ファイル。プログラムモジュールと混同しないこと)が含まれています。そのモジュールの一つが SMTP.pm です。ドキュメントによると、これは「SMTP および ESMTP プロトコルへのクライアントインターフェースを実装し、Perl 5 アプリケーションが 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 メールアドレス)(-f)、件名(-s)、および少なくとも 1 行の本文(-m)と受信者(-t)です。件名や本文のテキストにスペースが含まれる場合は、そのテキストを引用符で囲む必要があります。 -v オプションはデバッグ用の補助機能であり、すべての引数および SMTP サーバーとの通信内容を表示するように指定します。
たとえば、自分の携帯電話に紐付けられたアカウントにメールを送信したい場合は、次のように実行できます
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 1' -m 'ネットワークがクラッシュしています。今すぐ[email protected]に連絡してください'
|
ご覧の通り、引数は頭文字だけで省略できます。申し訳ありませんが、私の携帯電話のメールアカウントをお見せすることはできません。そのメールは次のような内容でした
差出人: ノア・デイヴィッズ テスト1 2010年10月28日 12:42 PM ネットワークがダウンしている。今すぐ連絡を! |
テキストメッセージの送信は、Eメールの送信とまったく同じですが、「宛先」のアドレスは「phonumber@phonecompany」となります。「phonumber」は、言うまでもなくその携帯電話の番号です。「phonecompany」のドメインは、携帯電話会社によって異なります。
例えば
perl smtp.pl -h mailhub.stratus.com -f [email protected] -s 'test 2' -m 'ネットワークがクラッシュしています。今すぐご連絡ください' -m NOW!! -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 SunCom tms.suncom.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:
-return_receipt_to:
-subject:
message_1:
message_2:
message_3:
message_4:
message_5:
message_6:
-send_file:
-smtp_port: smtp
-retry_times:
-user_name:
-password:
-control:
-domain:
-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 '今すぐ !!' -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
-importance|i high|normal|low
-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 '何らかの障害が発生しました' -t [email protected]");
|
PL1またはCOBOLを使用している場合は、Cルーチンを記述し、それをアプリケーションにバインドする必要があります。
最後に、エラーについて話しましょう。
送信元アドレスに問題がある場合、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
+ad from address' -msg 'NOW !!' -to [email protected]
send_smtp_mail: 250 の応答が期待されました。 受信: 553 5.5.4 noah.davids... ドメイン名が必要
|
メールハブに接続できない場合、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 'ネットワークがダウンしています。今すぐ連絡してください' -msg '今すぐ !!' -to [email protected]
send_smtp_mail: mailhub.stratus.com に接続できません。接続しようとしているネットワークに到達できません。
|
宛先アドレスが間違っていても、どちらのコマンドでもエラーは発生しません。ただし、メールハブから差出人アドレス宛てに、メールが配信できなかったことを知らせるメールが送信される場合があります。
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
|
