Tivoli 服务台 6.0 开发工具包脚本程序设计指南

第九章:Tivoli 服务台(TSD)脚本邮件接口

返回目录


简介

电子邮件(e-mail)是增长最快的应用软件领域之一。Internet 和组织内部网都依赖电子邮件作为通信代理。

电子邮件允许下列几种通信方式:

存储与转发机制

由电子邮件网络提供的优势之一是存储与转发机制

存储并转发机制允许一个用户把消息传送给第二个用户,即使第二个用户没有登录上网。

服务器把第一个用户的消息存储起来,并在第二个用户检查邮箱时传送给他或她。这样就要允许两个用户之间能够异步通信。异步通信意味着通信操作与时间无关。

通信 API

大多数的电子邮件供应商公布其 API(应用程序设计接口)的方式为:允许其他供应商的应用程序与他们的消息基础结构接口。API 是一系列例行程序,应用程序使用这些例行程序来在操作系统中请求并实施较低级别的服务。

使用 API 允许软件供应商支持特殊化的操作。这意味着使用这些 API 的应用程序必须在专门系统中运行,以利用这种发送消息功能。

注: Internet 邮递协议(SMTP/POP)不是 API。

VIM 协议

与供应商的特定发送消息的 API 不同,VIM(供应商独立消息发送)协议不依赖于供应商的特定格式。使用 VIM 协议,开发人员可以编写的可在任意平台上运行,并支持应用程序内置的消息发送特性。

VIM 接口协议是用 VIM Consortium 设计的,包括下列组成部分:

MAPI

TSD 脚本语言支持的另一个流行的电子邮件协议是 MAPI(邮件应用程序接口),是 Microsoft 的产品。MAPI 表现出与 VIM 相似的功能,并允许使用与 VIM 相同的邮件通信方法。

TSD 脚本邮件接口与 VIM 和 MAPI 都能进行通信。

注:MAPI 支持下列语句 :

SMTP

简单邮件传输协议(SMTP)为电子邮件提供如下传送机制:

POP3

邮局协议-版本 3(POP3)允许工作站动态访问服务器主机上的邮件投送点。通常,这意味着 POP3 服务器允许工作站在保留有电子邮件的服务器上检索邮件。

注:SMTP 和 POP3 不支持下列语句。

使用带协议的 TSD 脚本邮件

TSD 脚本邮件接口给程序员提供了一种开发启用邮件的应用程序的手段。目前,接口支持三种协议:

TSD 脚本邮件接口允许灵活地建立应用程序,概括如下:

使用 TSD 脚本邮件接口

使用 TSD 脚本邮件接口,您可以建立 TSD 脚本程序来实现下列功能:

TSD 脚本邮件接口术语

本小节介绍了一些用来描述 TSD 脚本邮件接口如何实现的术语。

通讯录

通讯录是用户信息、地址、邮寄表等等所存储的位置。典型地,由邮件管理员管理通讯录。

有两种类型的通讯录:公共私人

TSD 脚本邮件接口支持仅按 VIM 协议来读取公用通讯录的能力。

实体

实体是发送或接受电子邮件消息的一个人或程序。

附件文件

附件文件是可以附到消息上的文件。附上的文件可以是任意格式。正确解释这些文件是发送者和接收者的责任。

收件箱

收件箱是一个特殊文件,用来支持按照 POP3 协议阅读消息和对消息做标记。它把从 POP3 服务器检索出来的消息存储起来,并提供一种机制,将消息标记为已读或未读。

MsgCntnr 作为参数指针,指向 SMTP/POP3 的收件箱。

邮件管理员

邮件管理员是负责监视邮件服务器的人。此人负责管理用户帐户并管理储存在网络中的信息容量。

信箱

信箱是分配给个别实体的物理地址。信箱把分发的消息储存起来。信箱也可以说成是一种消息容器。

消息

消息是可以在消息发送系统中传送并保存在消息容器中的任何对象。

消息客户机

消息客户机是一种接口,允许最终用户做以下操作:

消息容器

消息容器是接收的消息的储存位置。与信箱是同义词。

消息标题

消息标题是包含如下信息的标题:

消息项

消息项是项目列表。一条消息项可以有两种类型:

消息类型

消息类型定义了消息内容的格式和语意。

备注部分

备注部分是消息的实际组成部分,VIM 协议支持数种类型。

TSD 脚本邮件接口仅仅支持文本备注部分。

服务器

服务器是消息发送系统的一部分,处理如下任务:

服务器也叫"后端"。

用户地址

用户地址是消息接收者的信箱地址。每个消息系统都有自己的地址格式。

消息寻址是开发消息应用程序中最复杂的问题之一。TSD 脚本邮件接口开发出来以与所有的遵从 VIM、MAPI 和 SMTP/POP 的消息系统接口。但是,要记住,在开发消息应用程序或增强程序时,您必须考虑使用的基础消息系统的要求。

用户标识

用户标识是分配给实体的唯一标识符。它允许实体登录到邮件服务器上。

TSD 脚本邮件记录结构


下面的片段是从 TSD 脚本中的 mail.kb 文件中摘出的片段。要获得其他信息,参见本章末尾的 "Mail.kb 文件"。

标题文件

TSD 脚本邮件接口定义了下列类型。根据您的邮件系统的实现情况不同,一些类型是任选项。Internet 邮件协议仅支持 EntityNameAddress 两种类型。SMTP/POP 要求指定 AddressEntityName 是任选项。

MAILContainer is INTEGER; 
MAILSession is INTEGER; 
MAILRef is REAL; 
MAILName is RECORD; 
  EntityType        : INTEGER; 
  NameType          : INTEGER; 
  AddressBookName   : STRING; 
  EntityName        : STRING; 
  AddressType     : INTEGER; 
  Address         : STRING; 
  CharSet:            : STRING; 
            END; 

在前面例子中使用的类型的说明列在下面。

指定消息项

下面的记录用来定义一个消息项。

MAILItem is RECORD 
  Class         : INTEGER; 
  Type                      : STRING; 
  Name            : STRING; 
  BufferType    : INTEGER; 
  BufferData    : STRING; 
            END; 

在前面例子中使用的类型的说明列在下面。

在没有发送者和接收者的私人协议的时候,建议优先使用 ISO-8859-* 系列中的成员。

消息标题

这一记录包含了要发送的消息的标题信息。

在 MAPI 中,仅仅 Suject类型起作用,这意味着不支持其它类型。

Internet 邮件协议仅支持 SubjectInReplyTo 类型。

Status: 
MAILSendHeader is RECORD 
  Subject                       : STRING; 
  Priority                      : INTEGER; 
  DeliveryReport      : BOOLEAN; 
  NonDeliveryReport   : BOOLEAN; 
  NonDeliveryContents : BOOLEAN; 
  Encrypt             : BOOLEAN;
  Sign                          : BOOLEAN; 
  ExpirationDate      : DATE
  ConversationID                       : LIST of STRING;
  Sensitivity                   : INTEGER; 
  InReplyTo                            : STRING;
  RespondBy                     : DATE; 
  KeyWord             : LIST of STRING; 
  ReturnReceipt                        : BOOLEAN; 
  Save                : BOOLEAN; 
  CharSet:            : STRING;
            END; 

在前面例子中使用的类型的说明列在下面。

注:缺省设置是 NORMAL。

在没有发送者和接收者的私人协议的时候,建议优先使用 ISO-8859-* 系列中的成员。

消息属性

这一记录在发送消息时设置标题属性。多值的标题属性用列表来声明。
在 MAPI 中,仅仅支持下列类型:

Internet 邮件协议支持下列类型:

下面是消息标题属性的实例:

MAILReadHeader is RECORD 
  Type                      : STRING; 
  FromName                  : STRING; 
  FromAddress               : STRING; 
  Subject                       : STRING; 
  MessageDate               : DATE; 
  Priority                      : INTEGER; 
  Sign                          : BOOLEAN; 
  NestingDepth                         : INTEGER; 
  UniqueMsgID                   : STRING; 
  Sensitivity                   : INTEGER; 
  InReplyTo                            : STRING; 
  RespondBy                     : DATE; 
  ReturnReceipt                        : BOOLEAN; 
  ConversationID                       : LIST of STRING; 
  KeyWords                             : LIST of STRING;
  AddressType     : INTEGER; 
  FromCharSet               : STRING;
  SubjectCharSet            : STRING;
            END; 

在前面例子中使用的类型的说明列在下面。

在没有发送者和接收者的私人协议的时候,建议优先使用 ISO-8859-* 系列中的成员。

消息摘要

在消息容器里搜索消息时,这一记录获取消息属性的摘要。

MAPI 仅支持 MsgReference 类型。

Internet 邮件协议支持除了 Priority 之外的所有类型。

下面是消息属性摘要的例子。

MAILMsgSummary is RECORD 
  MsgReference              : MAILRef; 
  Type                      : STRING; 
  UnreadMail                : BOOLEAN; 
  FromName                  : STRING; 
  FromAddress               : STRING; 
  Priority                      : INTEGER; 
  Subject                       : STRING; 
  MessageDate               : DATE; 
  FromCharSet               : STRING;
  SubjectCharSet            : STRING;
            END; 

在前面例子中使用的类型的说明列在下面。

在没有发送者和接收者的私人协议的时候,建议优先使用 ISO-8859-* 系列中的成员。

过滤记录

这一记录用于过滤在扫描消息进程中检索出的消息类型。

MAPI 和 SMTP/POP 都不支持过滤。

下面是过滤器属性的例子。

MAILFilter is RECORD 
  MessageType                   : STRING; 
  UniqueMsgID                   : STRING; 
  Sent                          : BOOLEAN; 
  Keyword                       : STRING; 
  From                          : STRING; 
  Subject                       : STRING; 
  Date                          : DATE; 
  Priority                      : INTEGER; 
  Sign                          : BOOLEAN; 
  ConversationID                : STRING; 
  Sensitivity                   : INTEGER; 
  RespondBy                     : DATE; 
            END; 

在前面例子中使用的类型的说明列在下面。

其他用户定义的值也是可以接受的。

MAILInfoRec

MAILInfoRec 记录结构用在 MAILQueryDefaults 函数中,用于接收缺省的邮件系统值。
下例演示了 MailInfoRec 结构如何工作。

MAILInfoRec is RECORD
  Product:                        STRING;
  SpecVersion:                    INTEGER;
  MaxSubjectLen:                  INTEGER;
  MaxTextLen:                     INTEGER;
  PathNameReq:                    BOOLEAN;
  UserNameReq:                    BOOLEAN;
  PasswdReq:                      BOOLEAN;
  DefPathName:                    STRING;
  DefUserName:                    STRING;
  DefCharSet:                     STRING;
            END;

在前面例子中使用的类型的说明列在下面。

通讯录

TSD 脚本允许您在通讯录中列出消息接收人的姓名。( MAPI 或 SMTP/POP 都不支持通讯录。) 此外,TSD 脚本不支持嵌套通讯录。

下面的记录用来检索通讯录中的项。

MAILABEntry is RECORD 
  Name            : STRING; 
  AddressType     : INTEGER; 
  Address         : STRING; 
  Comments        : STRING; 
  EntryType       : INTEGER; 
            END; 

注:最终用户不能修改通讯录。

在前面例子中使用的类型的说明列在下面。

TSD 脚本邮件接口的实现

本小节指导您实现一个小的 TSD 脚本程序样本进。这个程序把邮件消息从标识为 "BILL" 的用户向标识为 "JOHN." 的用户发送。

把 TSD 脚本邮件接口添加到 TSD 脚本程序中

TSD 脚本程序可以通过把 TSD 脚本邮件模块添加到知识库中的 uses 段来使用 TSD 脚本邮件接口。
TSD 脚本邮件模块在 mail.kb 文件中,并在开发工具包安装目录下自动安装。mail.kb 文件包含了 TSD 脚本邮件函数使用的记录结构、常量和返回码的定义。

下列代码段演示了向程序中添加 TSD 脚本邮件接口的第一步:

Knowledgebase SENDMAIL; 
USES
    mail; 
PUBLIC 
PROCEDURE SendMailMessage; 
PRIVATE 
ROUTINES 
PROCEDURE SendMailMessage IS 
ACTIONS 
    (*Body of procedure *) 
            END; 

初始化 TSD 脚本邮件接口

在调用任何 TSD 脚本邮件函数之前,应用程序必须首先调用 MAILInitialize 语句。这一函数初始化TSD 脚本邮件接口所用的资源和数据结构。

MAILInitialize 语句必须指定将要使用的协议作为其参数:

初始化 TSD 脚本邮件接口之后,您就可以打开其中的任意数目的邮件会话了。

MAILInitialize(OMI_VIM_INTERFACE)

注:在成功调用 MailInitialize 后,切记在退出程序之前始终要调用 MailTerminate

打开会话

初始化 TSD 脚本邮件接口之后,您就可以使用 MAILOpenSession 语句打开会话了。MAILOpenSession 要求:

下面的实例代码:

注:在 OS/2 中,使用 OMISEL_CP850。在 Windows 中, 使用 OMISEL_CP1252。

您也可以传递 $Unknown, 系统使用缺省字符集。

注: Microsoft Windows 95/98 的用户:请参阅 TSD 脚本语言参考中的 MailOpenSession 语句中的备注部分。

对于任何失败状态,用 MailGetLastErrorType 语句。

PROCEDURE SendMailMessage 
VARIABLES 
    sessID:       MailSession; 
    rc:Integer; 
ACTIONS 
    rc := MAILInitialize(OMI_VIM_INTERFACE); 
     IF (rc <> KML_SUCCESS) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        Exit; 
            END; 
     rc := MAILOpenSession('M:\APPS\CCMAIL\CCDATA',
                          'BILL','K2K2', OMISEL_CP850,
                           sessID,OMI_VIM_INTERFACE);
     IF (rc <> KML_SUCCESS) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        MailTerminate(OMI_VIM_INTERFACE);
        Exit; 
            END; 
        (* Send the message *) 
     rc := MAILCloseSession(sessID); 
     IF (rc <> KML_SUCCESS) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        MailTerminate(OMI_VIM_INTERFACE); 
        Exit; 
            END; 
     rc := MAILTerminate(OMI_VIM_INTERFACE); 
            END; 

现在,打开了一个有效的会话。然而,在发送消息之前,必须完成几项任务:

  1. 初始化消息标题记录。
  2. 初始化接收者列表。
  3. 指定接收者列表。
  4. 指定消息项列表。

初始化消息标题

在下面的例子中,仅仅 MAILSendHeader记录结构中的 Sub jectPriority 字段被初始化了。所有其它的字段都保留为 $Unknown

msgHeader:MAILSendHeader; 
msgHeader.Subject := 'Floor Plan'; 
msgHeader.Priority := OMI_HIGH_PRIORITY; 

初始化接收者列表

假设您想给一个叫做 John 的接收者发送消息。接收者列表仅有一个组成部分,地址 "JOHN"。

如例子中所演示的,toListMAILName 记录的列表。

    toList:       LIST of MAILName; 
toRecipient:MAILName;

指定接收者

有两种方法可以指定接收者:地址或姓名。

MailName 记录有一种叫做 EntityType 的类型,它指接收者的类型。如果接收者是单一用户或程序,EntityType 必须被赋值 OMISEL_ENTITY。如果接收消息的是一个组(例如邮寄列表),则 EntityType 必须被赋值为 OMISEL_GROUP。

按姓名来指定接收者

如果按姓名来指定接收者,必须在 MAILName 记录中初始化下列类型:

NameType 类型中的条目取决于发送消息的应用程序名。例如:

按地址来指定接收者

如果按地址来指定接收者,必须初始化 MAILName 记录中的 AddressTypeAddress 字段。

AddressType 字段指地址类型。例如: OMISEL_CCMAIL、OMISEL_NOTES、OMISEL_MHS 等等。您可在本章后的类型说明中找到 AddressType 的完整列表。

Address 类型包含了 AddressType 类型所规定的格式的地址字符串。请参阅您的 VIM e-mail 供应商所提供的文档来确定正确的地址格式。

SMTP/POP 要求按地址来指定接收者。name 字段是任选项。

注:
MAILReadMessage 读取消息时,语句在检索消息的同时完成 MAILName 记录的 NameAddress 的类型说明。

当被用作 SMTP/POP3 支持时,msgCntnr 语句指向收件箱。象此代码片段所演示的那样,您按照姓名来指定接收者,并使用缺省通讯录:

toRecipient.EntityType := OMISEL_ENTITY; 
toRecipient.AddressBookName := ''; 
toRecipient.EntityName := 'JOHN'; 
ListInsert(toList, toRecipient, $After); 

注:语句 toListccList 可用同种方法来声明。

指定消息项列表

下面的任务将建立消息项列表。必须指定下列项:

本例程序包含消息项列表:

(* Build the message items list *) 
    (* First item is a note part *) 
Item.Class      := OMISEL_NOTE_PART; 
    Item.Type       := OMI_TEXT; 
    Item.Name       := 'Title for the 
                       note part'; 
    Item.BufferType := OMI_ACTUAL_DATA; 
    Item.BufferData := 'Hi John. I have' & 
                       'enclosed the floor' &
                       'plan layout in the' & 
                       'file attachment. ';
    Name.Address    := 'JOHN/ACME CORPORATION'
    ListInsert(Items, Item, $After);
   (* Second item is a file attachment *)
Item.Class      := OMISEL_ATTACH;
    Item.Name       := 'image.pcx';
    Item.BufferType := OMI_FILE_DATA;
    Item.BufferData := 'D:\TMP\PAPANIM.PCX';
    ListInsert(Items, Item, $After);

注:演示 Name.Address 的 SMTP/POP 例子类似于:

Name.Address := 'john@acme.com'

编写 SendMailMessage 过程

SendMailMessage 过程可象编写如下。

PROCEDURE SendMailMessage IS 
VARIABLES 
    header:       MAILSendHeader; 
    Items:        LIST of MAILItem; 
    Item:         MAILItem; 
    name:         MAILName; 
    toList:       LIST of MAILName; 
  rc              :INTEGER; 
    sessID:       MailSession; 
ACTIONS 
    rc := MAILInitialize(OMI_VIM_INTERFACE); 
    IF (rc < 1) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        Exit; 
            END; 
    rc := MAILOpenSession('M:\APPS\CCMAIL\CCDATA', 
                          'BILL','K2K2', 
                     OMISEL_CP850, sessID,
OMI_VIM_INTERFACE); 
        IF (rc < 1) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        MailTerminate(OMI_VIM_INTERFACE); 
        Exit; 
                END; 
    (* Send the message *) 
    (* Set the header record *) 
    header.subject := 'Floor Plan'; 
    header.Priority := OMI_HIGH_PRIORITY; 
    (* Build the message items list *) 
    (* First item is a note part *) 
    Item.Class      := OMISEL_NOTE_PART; 
    Item.Type       := OMI_TEXT; 
    Item.Name       := 'Title for
                      the note part'; 
    Item.BufferType := OMI_ACTUAL_DATA; 
    Item.BufferData := 'Hi John. I have enclosed'& 
                       'the floor plan layout in'& 
                       'the file attachment. '; 
    ListInsert(Items, Item, $After); 
    (* Second item is a file attachment *) 
    Item.Class      := OMISEL_ATTACH; 
    Item.Name       := 'image.pcx'; 
    Item.BufferType := OMI_FILE_DATA; 
    Item.BufferData := 'D:\TMP\PAPANIM.PCX'; 
    ListInsert(Items, Item, $After); 
    (* Specify the recipient *) 
    name.EntityType := OMISEL_ENTITY; 
    name.AddressBookName := ''; 
    name.EntityName := 'JOHN' 
    ListInsert(toList, name, $After); 
    rc := MailSendMessage(SESSID, OMI_MAIL, header,
                          toList, $UNKNOWN,$UNKNOWN,
                           Items);
    IF (rc < 1) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & rc <); 
        ELSE ('Mail sent successfully'); 
            END; 
    rc := MAILCloseSession(sessID); 
    IF (rc < 1) THEN 
        WinMessageBox($desktop, 'error', $MBOK,
                      'Error in MAILInit. 
                       Error code is ' & r <); 
        MailTerminate(OMI_VIM_INTERFACE); 
        Exit; 
            END; 
    rc := MAILTerminate(OMI_VIM_INTERFACE); 
            END; 

读取邮件容器中的消息

TSD 脚本邮件接口可以读取邮件容器中的消息。读取消息是一个两步骤的过程:

注: SMTP/POP3 不支持过滤器。

下面是接收邮件的程序例子:

KNOWLEDGEBASE mailrecv;
 
USES mail; 

ROUTINES 

PROCEDURE ReadMail; 

PRIVATE
ROUTINES 

PROCEDURE ReadMail IS
VARIABLES
  sess :MAILSession;
  msgContainer :MAILContainer;
  toList :LIST OF MAILName;

  outfile         :FILE;
  numMessages     :INTEGER;
  msgSummary      :LIST OF MAILMsgSummary;
  summRec         :MAILMsgSummary;
  msgRef          :MAILRef;
  msgHeader       :MAILReadHeader;
  msgItems        :LIST of MAILItem;
  ccList, bccList :LIST of MAILName;
  nestedMsg       :BOOLEAN;
  reply           :string;
  rc              :INTEGER;
ACTIONS
   rc:=MAILInitialize(OMI_SMTP_POP_INTERFACE);
              IF rc < 1 THEN
    EXIT;
            END;
   rc:=MAILOpenSession('mozart.softart.com',
                      'Mr Totstuser@domain name',
                       'pass',$UNKNOWN,
                       sess,OMI_SMTP_POP_INTERFACE);
              IF rc < 1 THEN
             WinMessageBox($Desktop,'Error',$MBIconError,
                'Open session failed: '&rc);
 MAILTerminate(OMI_SMTP_POP_INTERFACE);
    EXIT;
            END;
 rc:=MAILOpenMessageContainer (sess,
                              'c:\mail\inbox.idx',
                               msgContainer);
              IF rc < 1 THEN
             WinMessageBox($Desktop,'Error',$MBIconError,
                 'Open container failed: '&rc);
 MAILCloseSession(sess);
 MAILTerminate(OMI_SMTP_POP_INTERFACE);
    EXIT;
            END;
 rc:= MAILScanMessages(msgContainer, OMI_UNREADONLY,
                      $Unknown, TRUE, numMessages,
                       msgSummary);
              IF rc < 1 THEN
     WinMessageBox($Desktop,'Error',$MBOK,
                   'Scan failed: '&rc);
 MAILCloseMessageContainer(msgContainer);
 MAILCloseSession(sess);
 MAILTerminate(OMI_SMTP_POP_INTERFACE);
    EXIT; 
            END;
 REPEAT
    IF numMessages > 0 THEN
         rc:=FOpen(outfile, 'mailtest.log', $CREATE);
              IF rc < 1 THEN 
             WinMessageBox($Desktop,'Error',$MBIconError,
                          'File Open failed: '&rc);
                EXITLoop;
ELSE
             FWriteLn(outfile, 'Number Read: ' & 
                      numMessages);
            FOR msgSummary DO
                 summRec := msgSummary[$Current];
                 FWriteLn(outfile, 'Message Type: ' &
                          summRec.Type);
                 FWriteLn(outfile, 'Unread Mail: ' &
                          summRec.UnreadMail);
                 FWriteLn(outfile, 'FromName: ' &
                          summRec.FromName);
                 FWriteLn(outfile, 'FromAddress ' &
                          summRec.FromAddress);
                 FWriteLn(outfile, 'Priority: ' &
                          summRec.Priority);
                 FWriteLn(outfile, 'Subject: ' &
                          summRec.Subject);
                 msgRef := summRec.MSGReference;
                rc := MAILReadMessage(msgContainer,msgRef,
                                      0,msgHeader,
                                     msgItems,toList,
                                     ccList,bccList,
                                      nestedMsg);
              IF rc < 1 THEN
                WinMessageBox($Desktop,'Error',
                              $MBIconError,
                              'ReadMessage failed: '&rc);
          FClose(outfile); 
                EXITLoop; 
               ELSE
                    MAILReleaseMessageReference
                        (msgContainer, msgSummary
                         [$Current].msgReference);
              FOR tolist DO
                 FWriteLn(outfile,'To Name: ' &
                          toList[$current].EntityName);
                 FWriteLn(outfile,'To Address: ' &
                          toList[$current].address);
            END;
              FWriteLn(outfile, ' ***Message Items**** ');
                 FOR msgItems DO
            FWriteLn(outfile,msgItems
                     [$current].Type);
            FWriteLn(outfile,msgItems
                     [$current].Name);
            FWriteLn(outfile,msgItems
                     [$current].BufferData);
            END;
            FWriteLn(outfile, 
                    '*********************************
                     ******************* ');
            END; (*End of Else*)
          END; (*End of For LOOP*)
          FClose(outfile); 
       END;(*End of Else*)
    END;(*End of IF*)
 UNTIL TRUE;
 MAILCloseMessageContainer(msgContainer);
 MAILCloseSession(sess);
 MAILTerminate(OMI_SMTP_POP_INTERFACE);
 WinMessageBox($Desktop,'Program Complete',$MBOK,
              'Execution is complete. 
               Check for output.');
            END;

关闭 TSD 脚本邮件会话

同时打开多个 TSD 脚本邮件会话是可能的。

要关闭 TSD 脚本邮件会话,调用 MAILCloseSession 语句。这样就释放了与 TSD 脚本邮件会话相关联的系统资源。

终止 TSD 脚本邮件接口

当您准备终止 TSD 脚本邮件接口时,必须首先关闭所有打开的 TSD 脚本邮件会话。然后您需要调用 MAILTerminate 语句。

TSD 脚本邮件返回码

本节列出了可能从 TSD 脚本邮件接口语句发生的的出错代码。错误可能会在消息传送处理中的几个点出现,在 VIM 或 MAPI 层,或在 TSD 脚本层。下表描述可能在这些层的每一层产生的错误代码。

注:如果函数执行成功,所有的 TSD 脚本邮件接口调用将返回值 1。否则,将返回一个负数。

由 VIM 层生成的错误代码

下表列出了可能由 VIM 层生成的错误代码的详细信息。

错误 注释
OMISTS_FAILURE -1 一般错误。
OMISTS_FATAL -2 产生了致命错误。必须纠正错误后,
才能继续使用系统。
OMISTS_ALL_PARAMS_REQUIRED -3 当基础消息系统对路径、名称和口令全部要求时,MAILOpenSession 返回此消息。
OMISTS_ATTACHMENT_NOT_FOUND -4 指定的附件文件(在 MAILSendMessage 中)没有找到。
OMISTS_BAD_PARAM -5 所要求的参数为未知,
参数超出范围或参数是无效的。
OMISTS_BUF_TOO_SMALL -6 TSD 脚本邮件接口使用缓冲区来
从消息系统检索值。此返回码
表示使用的缓冲区太小,不能容纳返回的值。
OMISTS_CONV_NOT_SUPPORTED -7 此实现不支持指定的转换。
OMISTS_INSUFFICIENT_MEMORY -8 由于内存不足内部操作失败。
OMISTS_INVALID_CONFIGURATION -9 检测到无效的基本配置。
OMISTS_INVALID_OBJECT
-10 对象句柄 (MAILSessionMAILContainerMAILRef) 未知或无效。例
如,非邮件消息的句柄可能未
被传递给要求邮件消息的函数。
OMISTS_INVALID_PASSWORD -11 传递给 MAILOpenSession 的口令无效。
OMISTS_INVALID_SELECTOR -12 把选择器 (OMISEL_*) 传送给了此上下文中未知的
语句。
OMISTS_INVALID_SIGNATURE -13 MAILVerifySignature 传送了无效的签名,
或消息已失密。
OMISTS_NAME_EXISTS -14 VIM 不使此返回代码。
OMISTS_NAME_NOT_FOUND -15 MAILSendMessage 立即验证接收者的姓名,而在指定的通讯录中没有找到这个名字。(如果没有指定通讯录,
则使用缺省通讯录。)
OMISTS_NOT_SUPPORTED -16 此实现不支持所调用的特性。
OMISTS_NO_COMMON_CERTIFICATES -17 MAILVerifyMessage 签名报告在接收者与签名者之间没有共同的证明。
OMISTS_NO_DEFAULT -18 MAILGetEntityName 不能在几个活动会话之间作出选择。一些实现可能会返回
时间最长的那个会话名称,而不是返回错误代码。
OMISTS_NO_MATCH -19 找不到匹配。
OMISTS_NO_SIGNATURE -20 MAILVerifyMessage 签名报告
指定的消息没有包含签名。
OMISTS_NO_SUCH_ATTRIBUTE -21 没有使用调用的属性。
OMISTS_OPEN_FAILURE -22 当打开或新建一个文件时,产生了基于平台的错误。
OMISTS_PASS_REQUIRED -23 MAILOpenSession 报告要求口令
来打开本执行中的会话。
OMISTS_READ_FAILURE -24 当打开或新建一个文件时,产生了基于平台的错误。
OMISTS_UNSUP_TYPE -25 传递给 MAILSendMessageMAILSendDerived Message 的消息类型非 VIM_MAIL,
此实现不支持它。或者,MAILReadMessage 不支持读取
这种类型的项。
OMISTS_UNSUP_VERSION -26 TSD 脚本邮件接口与
基础 VIM 接口不匹配。
OMISTS_WRITE_FAILURE -27 当对文件进行写操作时,产生了与平台有关的错误。

由 MAPI 层生成的错误代码

下表列出了可能由 MAPI 层生成的错误代码的详细信息。

错误 注释
MAPI_USER_ABORT -201 用户取消了进程。函数未完成。
MAPI_E_FAILURE

-202 产生了一个或多个不明错误。函数
未7完成。
MAPI_E_LOGIN_ FAILURE

-203 用户没有成功登录。未
返回会话标识符。
MAPI_E_DISK_FULL
-204 磁盘已满。
MAPI_E_INSUFFICIENT
_MEMORY

-205 没有足够的内存,无法继续。函数
未7完成。
MAPI_E_TOO_MANY_SESSIONS

-208 同时打开的会话太多。
MAPI_E_ TOO_MANY_FILES -209 附件文件太多。
MAPI_E_ TOO_MANY_RECIPIENTS -210 指定的消息接收者太多。
MAPI_E_ATTACHMENT_NOT
_FOUND
-211 找不到要附到消息的一个或多个文件。
MAPI_E_ ATTACHMENT_OPEN_FAILURE -212 找不到要附到消息的一个或多个文件。
MAPI_E_ ATTACHMENT_WRITE_FAILURE -213 附件无法写到临时文件中。
检查目录权限。
MAPI_E_UNKNOWN_RECIPIENT -214 地址列表中找不到接收者。
MAPI_E_BAD_RECIPTYPE -215 没有指定接收者类型,或类型无效。
MAPI_E_INVALID_MESSAGE -217 消息参考号是无效的。
MAPI_E_TEXT_TOO_LARGE -218 消息正文太长。
MAPI_E_INVALID_SESSION -219 会话标识符无效。
MAPI_E_TYPE_NOT
_SUPPORTED
-220 此实现不支持一个或多个类型。
MAPI_E_AMBIGUOUS
_RECIPIENT
-221 一个或多个接收者不明确。
MAPI_E_INVALID_RECIPS -225 一个或多个接收者无效。
MAPI_E_NOT_SUPPORTED -226 基础实现不支持此函数。


由 SMTP 生成的错误代码

下面的表格列出了可能由 SMTP 生成的错误代码。

错误 注释
OMI_ERR_SMTP_OPENSESSION
_FAILURE
-3000 初始化 MAILOpenSession(..) 中的所有数据时失败。.
OMI_ERR_SMTP_MAIL
_FAILURE
-3001 向 SMTP 服务器发送邮件命令时失败。
OMI_ERR_SMTP_CLOSE
_FAILURE
-3002 向 SMTP 服务器发送关闭命令时失败。
OMI_ERR_SMTP_VERIFY
_FAILURE
-3003 SMTP 服务器不能验证接收者列表中的某个用户。
OMI_ERR_ATTACH_FILE
_ERROR
-3004 指定为附件的文件或是不存在,
或是文件名格式不正确。
OMI_ERR_SMTP_OPEN_SERVER
_FAILURE
-3005 打开与 SMTP 服务器的连接时失败。
OMI_ERR_POP_OPEN_FAILURE -3006 打开与 POP 服务器的连接时失败。
OMI_ERR_INVALID_PASSWORD -3007 口令验证失败。
OMI_ERR_POP_STAT_FAILURE -3008 向 POP 服务器发送 stat 命令时失败。
OMI_ERR_POP_RETR_FAILURE -3009 向 POP 服务器发送 retr 命令时失败。
OMI_ERR_POP_DELE_FAILURE -3010 向 POP 服务器发送 delete 命令时失败。
OMI_ERR_POP_QUIT_FAILURE -3011 向 POP 服务器发送 quit 命令时失败。
OMI_ERR_SOCKET_FAILURE -3012 套接字调用失败。
OMI_ERR_PARSE_MESSAGE
_FAILURE
-3013 分析消息调用失败。
OMI_ERR_INVALID_FILE -3014 文件大小为 0。
OMI_ERR_SERVICE_NOT
_AVAILABLE
-3421 如果服务知道它必须关闭时,本项可以是对任何 SMTP 命令的应答。
OMI_ERR_MAILBOX_BUSY -3450 邮件箱可能忙。
OMI_ERR_LOCAL_ERROR_IN
_PROCESSING
-3451 由于处理时的本地错误,所要求的操作中断。
OMI_ERR_INSUFFCIENT
_SYSTEM_STORAGE
-3452 系统存储器不足,所要求的操作中断。
OMI_ERR_SYNTAX_ERROR -3500 语法错误,不能识别命令。
OMI_ERR_SYNTAX_ERROR_IN
_PARAMETER
-3501 参数或自变量语法错误。
OMI_ERR_COMMAND_NOT
_IMPLEMENTED
-3502 命令没有实现。
OMI_ERR_SEQUENCE_ERROR -3503 错误的命令顺序。
OMI_ERR_PARAMETER_NOT
_IMPLEMENTED
-3504 命令参数未实现。
OMI_ERR_MAILBOX
_UNAVAILABLE
-3550 要求的操作不能执行:邮件箱不可用。
OMI_ERR_USER_NOT_LOCAL -3551 用户不在本地;请试用 <forward-path>
OMI_ERR_EXCEEDED
_STORAGE_ALLOCATION
-3552 请求的邮递操作中断:超过存储器分配。
OMI_ERR_MAILBOX_NAME
_NOT_ALLOWED
-3553 邮箱名未经许可。
OMI_ERR_TRANSACTION
_FAILED
-3554 事务失败
OMI_ERR_SOCKET_ERROR -3099 套接字通信出错

由 TSD 脚本生成的错误代码

下表列出了可能由 Script 脚本生成的错误代码的详细信息。

错误 注释
OMI_ERR_INVALID_BUFFER
_TYPE
-2000 在 Mail 项的记录中指定了无效的缓冲类型
OMI_ERR_INVALID_BUFFER
_DATA
-2001 缓冲数据无效。
OMI_ERR_NO_MEMORY -2002 系统内存资源耗尽。
OMI_ERR_INVALID_FILENAME -2003 文件名无效。
OMI_ERR_NO_TOLIST -2004 没有指定 "To" 列表。
OMI_ERR_BAD_PARAM -2005 指定了无效的参数。
OMI_ERR_NO_NESTED
_MESSAGE
-2006 在请求的层上没有找到嵌套消息。
OMI_ERR_TOO_MANY_FILE
_NAMES
-2007 指定的文件名太多。
OMI_ERR_UNSUPPORTED
_PROTOCOL
-2008 协议自变量的值无效或
此协议不被支持。
OMI_ERR_UNSUPPORTED
_FEATURE
-2009 在本实现中此特性不可用。
OMI_ERR_NOT_IMPLEMENTED -2010 还未实现此特性。
OMI_ERR_UNKNOWN_ITEM
_CLASS
-2011 项目类未知。
OMI_ERR_INVALID_NOTE_PART -2012 消息的备注部分无效。
OMI_ERR_MAPI_FAILURE -2013 在对 MAPI 接口进行程序设计时出错。
OMI_ERR_NOT_INITIALISED -2014 还未初始化邮件接口。在使用 TSD 邮件接口之前必须调用 MailInitialize
OMI_ERR_COULD_NOT_LOAD
_DLL
-2015 TSD 脚本邮件不能加载 MAPI 或 VIM DLL。
KML_ERR_UNKNOWN_ITEM
_CLASS
-5000 指定了未知的项目类。
KML_ERR_UNKNOWN_ITEM
_TYPE
-5001 指定了未知的项目类型。
KML_ERR_UNKNOWN_BUFFER_TYPE -5002 指定了未知的缓冲类型。
KML_ERR_UNKNOWN_BUFFER_DATA -5003 指定了未知的缓冲数据。

TSD 脚本邮件常量

下面是有效的 TSD 脚本邮件常量。

常量
OMISEL_ADDRESS 1
OMISEL_ATTACH 6
OMISEL_BCC 9
OMISEL_CC 10
OMISEL_CCMAIL 11
OMISEL_CLASS 13
OMISEL_CP1252 16
OMISEL_CP437 17
OMISEL_CP850 18
OMISEL_ENTITY 26
OMISEL_FORWARD 33
OMISEL_GROUP 38
OMISEL_LMBCS 44
OMISEL_MHS 49
OMISEL_NOT_SUPPORTED 61
OMISEL_NOTE_PART 62
OMISEL_NOTES 63
OMISEL_REPLY 77
OMISEL_TO 97
OMISEL_UNICODE 99
OMISEL_UNKNOWN_RECIP_TYPE 101
OMISEL_UNWRAPPED_TEXT 105
OMISEL_X400 107
OMISEL_X500 108
OMI_MAIL 'VIM_MAIL'
OMI_RTF 'VIM_RTF'
OMI_DLR 'VIM_DLR'
OMI_NDLR 'VIM_NDLR'
OMI_PRIVATE 'VIM_PRIVATE'
OMI_PUBLIC 'VIM_PUBLIC'
OMI_RTRC 'VIM_RTRC'
OMI_TEXT 'VIM_TEXT'
OMI_UNWRAPPED_TEXT 'VIM_UNWRAPPED
_TEXT'
OMI_LOW_PRIORITY 0
OMI_NORMAL_PRIORITY 1
OMI_HIGH_PRIORITY 2
OMI_HISTORY 1
OMI_INHERIT_CONTENTS 2
OMI_ALL_RECIPIENTS 4
OMI_UNREADONLY 2
OMI_NORMAL_SENS 0
OMI_PRIVATE_SENS 1
OMI_PERSONAL_SENS 2
OMI_CO_CONFID_SENS 3
OMI_APP_DEF_SENS 16384
OMI_FILE_DATA 1
OMI_ACTUAL_DATA 2
OMI_REVERSE_SCAN 1
OMI_UNREAD_ONLY 2
OMI_SMTP_POP_INTERFACE 3

Mail.kb 文件

TSD 脚本邮件文件

可在安装有开发工具包的目录下找到完整的 mail.kb 文件。


Tivoli 服务台 6.0 开发工具包脚本程序设计指南

返回目录

版权所有