前へ     目次     索引     DocHome     次へ     
iPlanet Calendar Server 5.1 イベント通知サービスマニュアル



第 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 (抹消)」が実行されました)。

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

  • すべてのイベントは、INBOX にのみ関係します。

  • 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 で指定する。 値が - に設定されているときは、割り当てがないことを示す  

qMsgUsed  

符号なし 32 ビット整数  

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

qMsgMax  

符号なし 32 ビット整数  

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



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




ペイロード

イベントに応じて、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)
ontent-type: text/plain; charset=us-ascii
Content-langua

次に別の例として、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 実装を伴って出荷されていますが、デフォルトでは使用できません。 iPlanet Messaging Server で ENS を使用可能にするには、『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

* --

* 簡単な対話形式の非同期パブリッシャ

* --

*

* この単純化されたプログラムは、

* ハードコード化された以下のイベント参照を使用してイベントを公開します。

* enp://127.0.0.1/store

* また、通知ペイロードとしてプロンプトに入力されたデータを使用します。

* プログラムを終了するには、"." を入力します。

*

* 対応するサブスクライバの asub を同じ通知サーバ上で実行すると、

* asub ウィンドウに送信データが

* 出力されます。

*

* 構文:

* $ apub <host> <port>

* 説明

* <host> は、通知サーバのホスト名

* <port> は、通知サーバの IP ポート番号

*/

#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("\n使用法:\napub ホストポート\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("状態 %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("状態 %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; /* \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("パブリッシャを作成できません");

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

* --

* 簡単なサブスクライバ

* --

*

* この単純化されたプログラムは、ハードコード化された次のイベント参照

* に一致するイベントを購読します。

* enp://127.0.0.1/store

* 続いて、apub プロセスのいずれかが使用されて、apub プロセスが放出した

* メッセージを受信したら、各々の受信した通知のペイロードを

* 標準出力へ表示します。

*

* 構文:

* $ asub <host> <port>

 * 説明

* <host> は、通知サーバのホスト名

* <port> は、通知サーバの IP ポート番号

*/

#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("\n使用法:\nasub ホストポート\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("購読に成功しました\n");

subscriber_keepalive(_subscriber, 30000);

} else {

printf("購読に失敗しました - 状態 %d\n", rc);

pas_shutdown(disp);

}

}

static void _unsubscribe_ack(void *arg, int rc, void *ignored)

{

(void *)ignored;

(void *)arg;

if (rc != 0) {

printf("購読の解除に失敗しました - 状態 %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("状態 %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("パブリッシャを作成できません");

subscriber_new_a(disp, NULL, host, port, _open_ack, NULL);

pas_dispatch(disp);

pas_dispatcher_delete(disp);

exit(0);

}



実装上の注意



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


前へ     目次     索引     DocHome     次へ     
Copyright (C) 2002 Sun Microsystems, Inc. Some preexisting portions Copyright (C) 2000 Netscape Communications Corp. All rights reserved.

最終更新日: 2002 年 1 月 31 日