메시지 보내기
메시지를 생성했으니 이제 보내도록 하자. 우리가 지금 하고 있는 일의 속성을 내포하고 있기 때문에 이 두 액션(생성과 보내기)은 별개의 과정으로 봐야 한다. ‘
재버 즐기기 1부’에서 재버 메시지를 설명하면서 “컨테이너(container)"라는 용어를 사용했다. 이제 컨테이너와 이의 컨텐츠를 생성했으므로, 지금부터는 생성한 컨텐츠를 보내도록 하자. 컨테이너를 보낼 때에는 Net::Jabber::Message 클래스의 매소드가 아니라, Net::Jabber::Client 클래스를 사용하는데, $connection 스칼라에 이미 우리의 스크립트로 나타나 있기 때문이다.
즉, 메시지는 우리의 클라이언트가 재버 서버에 보낸 데이터 꾸러미이다. 다음을 보자:
$connection->Send($message);
|
|
접속 종료
메시지를 보냈으므로 이젠 접속을 종료하자. 접속을 종료하려면 Disconnect()메소드를 사용다. 이는 XML::Stream 클래스의 Disconnect() 메소드를 보호하는 필수적인 과정이며, 이때의 XML::Stream 클래스는 XML 닫기 태그를 전송하여 XML Stream(재버 XML은 “stream" 모드로 전송한다)을 종료하며 소켓을 닫는다.
$connection->Disconnect();
exit;
|
|
요약
여기에 지금까지 작성했던 모든 스크립트와 각주를 나열했다.
# notify.pl
# Version 1
# E-mail notification script to Jabber client
use strict;
use Mail::Internet;
use Net::Jabber;
# Declare our constants
# ---------------------
use constant RECIPIENT => "dj@yak"; # Jabber ID to be notified
use constant SERVER => "yak"; # Jabber server to connect to
use constant PORT => 5222; # Port to connect to
use constant USER => "notify"; # user this script connects as
use constant PASSWORD => "notify"; # password associated with USER
use constant RESOURCE => "perlscript";
# Read and parse email and extract header info
# --------------------------------------------
my $header = Mail::Internet->new(*STDIN)->head()->header_hashref();
chomp $header->{$_}[0] foreach keys(%{$header});
# Create a new Jabber client and connect
# --------------------------------------
my $connection = Net::Jabber::Client->new();
$connection->Connect( "hostname" => SERVER,
"port" => PORT )
or die "Cannot connect ($!)n";
# Identify and authenticate with the server
# -----------------------------------------
my @result = $connection->AuthSend( "username" => USER,
"password" => PASSWORD,
"resource" => RESOURCE );
if ($result[0] ne "ok") {
die "Ident/Auth with server failed: $result[0] - $result[1]n";
}
# Create a message and build it up
# --------------------------------
my $msg = Net::Jabber::Message->new();
$msg->SetMessage( "to" => RECIPIENT,
"subject" => "Email from $header->{From}[0]",
"body" => join("n", "Subject: $header->{Subject}[0]",
"Date: $header->{Date}[0]") );
# Send the message
# ----------------
$connection->Send($msg);
# Disconnect from the Jabber server
# ---------------------------------
$connection->Disconnect();
exit;
|
|
맺음말
아주 놀랍게도 이제 재버가 작동한다. 그림 5에 스크립트로 발송된 메일 알림 공지가 도착했다는 것이 나타나 있다:
그림 5: 내 WinJab 클라이언트에 도착한 공지
이는 단지 하나의 예에 불과하며, 한계점도 많다. 먼저 RECIPIENT 값을 바꿀 수 없다. 그래서 명령행으로 RECIPIENT 값을 바꿔서 사용자의 프록메일 레시피에 다음과 같은 것을 입력하는 기능은 지원되지 않는다:
:0 c
| ~/notify.pl -n qmacro@jabber.org
|
|
게다가 무엇인가 잘못되면, 스크립트는 자동으로 죽어 버린다. 그러므로 만약 설정(혹은 재버 서버)에 무엇인가 잘못되었다면, 이를 찾아내는 일 또한 어렵다.