Sun ONE logo     前へ     目次     索引     次へ     
Sun ONE Messaging and Collaboration イベント通知サービスマニュアル



第 5 章   iPlanet Messaging Server 固有の情報


この章では、ENS API を使用するために必要となる iPlanet™ Messaging Server に固有の項目について説明します。

この章は、次の節で構成されています。



iPlanet Messaging Server のイベントおよびパラメータ

iPlanet Messaging Server では、イベント参照は 1 つだけですが、そのイベント参照を複数のパラメータで構成することができます。各パラメータには、値とペイロードがあります。

iPlanet Messaging Server は、次の種類のイベントをサポートしています。

  • NewMsg -ユーザのメールボックスに新しいメッセージを受信

  • DeleteMsg - ユーザがメールボックスからメッセージを削除 (IMAP プロトコルでは「expunge (抹消)」 )

  • UpdateMsg - メッセージが (NewMsg 以外のイベントによって) メールボックスに追加。 たとえば、ユーザが電子メールをメールボックスにコピー

  • ReadMsg - メールボックス内のメッセージが既読になった (IMAP プロトコルではメッセージが 「Seen (既読)」のマークが付いた)

  • PurgeMsg - メッセージがメールボックスからパージされた (IMAP プロトコルでは「expunge (抹消)」)

上記のサポートされるイベントに対しては、以下が適用されます。

  • すべてのイベントは「受信箱」だけに関係する

  • NewMsg 通知は、メッセージがユーザのメールボックスに入って初めて発行される (「サーバが受け付けて、メッセージキューに入ったところで発行される」 とは反対)

  • DeleteMsg イベントと PurgeMsg イベントはどちらも、メッセージがユーザのメールボックスから削除されたとき (IMAP プロトコルでは、メッセージに expunge が実行されたとき) に相当する。IMAP プロトコルで削除のマークが付いたときではない。2 つのイベントの唯一の違いは、誰がメッセージを削除したかという点。DeleteMsg は、ユーザがメッセージを削除したことを示し、PurgeMsg は、iPlanet Messaging Server がメッセージを削除したことを示す (たとえば、メッセージの期限が切れた場合)

  • 通知では、イベントの種類に応じて、さまざまな情報を運ぶ。 たとえば、NewMsg は、新しいメッセージの IMAP uid を示す

  • POP3 クライアントのアクセスに対するイベントは生成されない


パラメータ

iBiff は、ENS イベント参照に次の形式を使用します。

enp://127.0.0.1/store?param=value&param1=value1&param2=value2

イベントキーの enp://127.0.0.1/store は、文字列として一意であるということ以外、大きな意味はありません。たとえば、イベントキーのホスト名の部分には、ホスト名としての意味はありません。URI の一部である文字列というだけです。ただし、イベントキーはユーザが構成することができます。iBiff 構成パラメータの一覧を、以下の別の節に示します。

イベント参照の 2 番目の部分は、パラメータとその値のペアで構成されています。この部分は、疑問符 (?) を使用してイベントキーと区切られています。パラメータと値は、等号 (=) で区切られています。パラメータと値の各ペアは、アンパサンド (&) で区切られています。値が空の場合もありますが、これはただ値が存在しないということです。

表 5-1 では、すべての通知に含める必要がある、必須構成パラメータについて説明します。


表 5-1    必須構成パラメータ

パラメータ

データ型

説明

evtType  

文字列  

イベントの種類を指定する。NewMsg、UpdateMsg、ReadMsg、DeleteMsg、PurgeMsg のいずれか  

mailboxName  

文字列  

メッセージストアのメールボックス名を指定する。mailboxName の書式は uid@domain (uid はユーザ ID で、domain はユーザが属するドメイン)。@domain 部分は、ユーザがデフォルトのドメインに属していない場合 (ユーザがホストドメイン内にいる場合) に限って追加される  

timestamp  

64ビット整数  

epoch (1970 年 1 月 1 日午前 0 時 GMT) から起算してミリ秒で指定する  

process  

文字列  

イベントを生成したプロセスの名前を指定する。プロセス名がわからない場合は、プロセス ID が使用される (整数)  

hostname  

文字列  

イベントを生成したマシンのホスト名  

表 5-2で、イベントの種類に依存する、オプションの構成パラメータについて説明します。


表 5-2    オプションの構成パラメータ  

パラメータ

データ型

説明

numMsgs  

符号なし 32 ビット整数  

既存のメッセージ数を指定する  

size  

符号なし 32 ビット整数  

メッセージのサイズを指定する。ペイロードは通常、メッセージが短縮されたものであるため、これは、ペイロードのサイズとは一致しない  

uidValidity  

符号なし 32 ビット整数  

IMAP uid 有効パラメータを指定する  

imapUid  

符号なし 32 ビット整数  

IMAP uid パラメータを指定する  

uidSeqSeen  

文字列  

「1:6」 のように、IMAP 構文で 「seen (既読)」 のマークが付いた uid のリストを指定する  

lastUid  

符号なし 32 ビット整数  

最後に使用された IMAP uid を指定する  

hdrLen  

符号なし 32 ビット整数  

メッセージヘッダーのサイズを指定する。ペイロードは短縮されているため、これは、ペイロードのヘッダーのサイズとは一致しない  

qUsed  

符号なし 32 ビット整数  

割り当てで使用されるディスク容量を KB で指定する  

qMax  

符号なし 32 ビット整数  

ディスク容量割り当てを KB で指定する。値が -1 に設定されているときは、割り当てがないことを示す  

qMsgUsed  

符号なし 32 ビット整数  

割り当てで使用されるメッセージの数を指定する。numMsgs と同じ値を指定すること  

qMsgMax  

符号なし 32 ビット整数  

最大メッセージ数に対する割り当てを指定する。値が -1 に設定されているときは、割り当てがないことを示す  



サブスクライバは、イベント参照を構文解析するとき、文書化されていないパラメータについても考慮する必要があります。将来、新しいパラメータが追加されたときに互換性を持たせることができます。




ペイロード

イベントに応じて、ENS 通知のペイロード部分には次のデータが含まれます。

  • メッセージのヘッダー (文字列) - 長さは特定の (構成可能な) サイズに制限される。次の各節に示す構成パラメータ参照

  • メッセージ本体の最初の数バイト (文字列) -実際のバイト数は構成可能。次の各節に示す構成パラメータ参照

表 5-3 に、各イベントの種類で使用できるパラメータを示します。


表 5-3    各イベントタイプに使用できるパラメータ  

フィールド名

NewMsg、UpdateMsg

ReadMsg

DeleteMsg、PurgeMsg

numMsgs  

 

不可  

 

size  

 

不可  

不可  

uidValidity  

 

 

 

imapUid  

 

不可  

 

uidSeqSeen  

不可  

 

不可  

uidSeqDel  

不可  

 

不可  

lastUid  

不可  

不可  

 

hdrLen  

 

不可  

不可  

qUsed  

 

不可  

 

qMax  

 

不可  

 

qMsgUsed  

 

不可  

 

qMsgMax  

 

不可  

 

ペイロード (ヘッダー/本文)  

 

不可  

不可  




次に、NewMsg イベント参照の例を示します (読みやすくするために数行に分けてありますが、実際は 1 行です)。


enp://127.0.0.1/store?evtType=NewMsg&mailboxName=ketu310&timestamp=972423964000
&process=16233&hostname=ketu&numMsgs=1&size=3339&uidValidity=972423964&
imapUid=1&hdrLen=810

これは、関連付けられているペイロードです。 本体の部分は短縮されています。


Return-path: <>
Received: from process-daemon.ketu.siroe.com by ketu.siroe.com
(iPlanet Messaging Server 5.0 (built Oct 17 2000))
id <0G2Y00C01F4SIY@ketu.siroe.com> for ketu310@ims-ms-daemon
(ORCPT ketu310@siroe.com); Tue, 24 Oct 2000 14:46:04 -0700 (PDT)
Received: from ketu.siroe.com
(iPlanet Messaging Server 5.0 (built Oct 17 2000))
id <0G2Y00C01F4RIX@ketu.siroe.com>; Tue, 24 Oct 2000 14:46:04 -0700 (PDT)
Date: Tue, 24 Oct 2000 14:46:04 -0700 (PDT)
From: Internet Mail Delivery
Subject: Delivery Notification: Delivery has failed
To: ketu310@siroe.com
Message-id: <0G2Y00C05F4SIX@ketu.siroe.com>
MIME-version: 1.0
Content-type: multipart/report; report-type=delivery-status;
boundary="Boundary_(ID_VlTrnuIgC5ferJnL2SCzhQ)"


--Boundary_(ID_VlTrnuIgC5ferJnL2SCzhQ)
Content-type: text/plain; charset=us-ascii
Content-language

次に別の例として、DeleteMsg イベントの例を示します (ここでも読みやすくするために 1 行を数行に分けています)。この例では、ホストドメインsymult.com のユーザ ID blim の mailboxName を示しています。


enp://127.0.0.1/store?evtType=DeleteMsg&mailboxName=blim@symult.com&
timestamp=972423953000&process=15354&hostname=ketu&numMsgs=0&
uidValidity=972423928&imapUid=2&lastUid=2

3 番目に、ReadMsg イベントの例を示します (ここでも読みやすくするために 1 行を数行に分けています)。この例では、uidSeqSeen パラメータに空の値が示されています。また、前述の例と同じユーザ ID を共有していますが、これは別のユーザ、つまりデフォルトのドメイン内にいるユーザと対応しています。


enp://127.0.0.1/store?evtType=ReadMsg&mailboxName=blim&timestamp=972423952000&
process=15354&hostname=ketu&uidValidity=972423928&uidSeqSeen=&uidSeqDel=1



iPlanet Messaging Server のコーディング例



iPlanet Messaging Server は、完全な ENS 実装を伴って出荷されていますが、デフォルトでは使用できません。 ENSでiPlanet Messaging Serverを使用可能にするには、『iPlanet Messaging Server 5.2 管理者ガイド』 の付録C を参照してください。

次の 2 つのコーディング例で、ENS API の使い方を説明します。コーディング例は、製品の次のディレクトリにあります。

server-root/bin/msg/enssdk/examples


パブリッシャのコーディング例

次のコーディング例は、簡単な対話形式の非同期パブリッシャを設定します。

/*
 * Copyright 2000 by Sun Microsystems, Inc.
 * All rights reserved
 */
/*
 *
 * apub
 * --
 * a simple interactive asynchronous publisher
 * --
 *
 * This simplistic program publishes events using the hard-coded
 * event reference
 * enp://127.0.0.1/store
 * and the data entered at the prompt as notification payload.
 * Enter "." to end the program.
*
 * If you happen to run the corresponding subscriber, asub, on the
 * same notification server, you will notice the sent data printed
 * out in the asub window.
 * Syntax:
 * $ apub <host> <port>
 * where
 * <host> is the notification server hostname
 * <port> is the notification server IP port number
 */

#include <stdlib.h>
#include <stdio.h>#include "pasdisp.h"
#include "publisher.h"

static pas_dispatcher_t *disp = NULL;
static publisher_t *_publisher = NULL;
static int _shutdown = 0;
static void _read_stdin();

static void _exit_usage()
{
   printf("\nUsage:\n   apub host port\n");
   exit(5);
}

static void _exit_error(const char *msg)
{
   printf("%s\n", msg);
   exit(1);
}

static void _call_shutdown()
{
   _shutdown = 1;
   pas_shutdown(disp);
}

static void _open_ack(void *arg, int rc, void *enc)
{
   _publisher = (publisher_t *)enc;
   (void *)arg;

if (!_publisher) {
      printf("Failed to create publisher with status %d\n", rc);
      _call_shutdown();
      return;
   }
   _read_stdin();
   return;
}

static void _publish_ack(void *arg, int rc, void *ignored)
{
   (void *)ignored;
   free(arg)
   if (rc != 0) {
      printf("Publish failed with status %d\n", rc);
      _call_shutdown();
      return;
   }

   _read_stdin();
   return;
}

static void _read_stdin()
{
   static char input[1024];
   printf("apub> ");
   fflush(stdout);
   while (!_shutdown) {
      if ( !fgets(input, sizeof(input), stdin) ) {
          continue;
       } else {
          char *message;
          unsigned int message_len;
          input[strlen(input) - 1] = 0; /* Strip off the \n */
         if (*input == '.' && input[1] == 0) {
             publisher_delete(_publisher);
             _call_shutdown();
             break;
          }
         message = strdup(input);
         message_len = strlen(message);
         publish(_publisher, "enp://127.0.0.1/store",
                message, message_len,
                _publish_ack, NULL, (void *)message, 0);
          return;
      }
   }
    return;
}

main(int argc, char **argv)
{
   unsigned short port = 7997;
   char host[256];
   if (argc < 2) _exit_usage();
   if (*(argv[1]) == '0') {
      strcpy(host, "127.0.0.1");
   }else {
      strcpy(host, argv[1]);
   }
   if (argc > 2) {
      port = (unsigned short)atoi(argv[2]);
   }
   disp = pas_dispatcher_new(NULL);
   if (disp == NULL) _exit_error("Can't create publisher");
   publisher_new_a(disp, NULL, host, port, _open_ack, disp);
   pas_dispatch(disp);
   _shutdown = 1;
   pas_dispatcher_delete(disp);
   exit(0);
}


サブスクライバのコーディング例

次のコーディング例は、簡単なサブスクライバを設定します。

/*
 * Copyright 1997 by Sun Microsystems, Inc.
 * All rights reserved
 *
 */

/*
 *
 * asub
 * --
 * a simple subscriber
 * --
 *
 * This simplistic program subscribes to events matching the
 * hard-coded event reference:
 * enp://127.0.0.1/store
 * It subsequently received messages emitted by the apub processes
 * if any are being used, and prints the payload of each received
 * notification to stdout.
 *
 * Syntax
 * $ asub <host> <port>
 * where
 * <host> is the notification server hostname
 * <port> is the notification server IP port number
 */

#include <stdlib.h>
#include <stdio.h>

#include "pasdisp.h"
#include "subscriber.h"

static pas_dispatcher_t *disp = NULL;
static subscriber_t *_subscriber = NULL;
static subscription_t *_subscription = NULL;
static renl_t *_renl = NULL;

static void _exit_usage()
{
   printf("\nUsage:\n   asub host port\n");
   exit(5);
}

static void _exit_error(const char *msg)
{
   printf("%s\n", msg);
   exit(1);
}

static void _subscribe_ack(void *arg, int rc, void *subscription)
{
   (void)arg;
   if (!rc) {
      _subscription = subscription;
      printf("Subscription successful\n");
      subscriber_keepalive(_subscriber, 30000);
   }else {
      printf("Subscription failed - status %d\n", rc);
      pas_shutdown(disp);
   }
}

static void _unsubscribe_ack(void *arg, int rc, void *ignored)
{
(void *)ignored;
   (void *)arg;
   if (rc != 0) {
      printf("Unsubscribe failed - status %d\n", rc);
   }
   subscriber_delete(_subscriber);
   pas_shutdown(disp);
}

static int _handle_notify(void *arg, char *url, char *str, int len)
{
   (void *)arg;
   printf("[%s] %.*s\n", url, len, (str) ? str : "(null)");
   return 0;
}

static void _open_ack(void *arg, int rc, void *enc)
{
   _subscriber = (subscriber_t *)enc;
   (void *)arg;
   if (rc) {
      printf("Failed to create subscriber with status %d\n", rc);
      pas_shutdown(disp);
      return;
   }

   subscribe(_subscriber, "enp://127.0.0.1/store",
            _handle_notify, NULL,
            _subscribe_ack, NULL);
   return;
}

static void _unsubscribe(int sig)
{
   (int)sig;
    unsubscribe(_subscriber, _subscription, _unsubscribe_ack, NULL);
}

main(int argc, char **argv)
{
   unsigned short port = 7997;
   char host[256];
   if (argc < 2) _exit_usage();
   if (*(argv[1]) == '0') {
      strcpy(host, "127.0.0.1");
    }else {
      strcpy(host, argv[1]);
   }
   if (argc > 2) {
      port = (unsigned short)atoi(argv[2]);
   }   disp = pas_dispatcher_new(NULL);
   if (disp == NULL) _exit_error("Can't create publisher");
   subscriber_new_a(disp, NULL, host, port, _open_ack, NULL);
   pas_dispatch(disp);
   pas_dispatcher_delete(disp);
exit(0);
}



実装上の注意



現在の実装では、購読するイベントに対するセキュリティ保護を提供していません。したがって、ユーザは、すべてのイベントおよび他のすべてのユーザのメールの一部を登録することができます。このため、ENS サブスクライバは、できるだけファイアウォールの「安全」な側に配置することを強くお勧めします。


前へ     目次     索引     次へ     
Copyright 2002 Sun Microsystems, Inc. All rights reserved.

最終更新日 2002 年 8 月 30 日