内容


对 Lotus Notes 邮件模版进行二次开发的最佳实践

提高产品可用性

Comments

编者按:想亲自动手试一试?请立即下载 IBM Lotus 软件试用版

现有 IBM Lotus Domino/Notes 邮件模板简介

模板概念

IBM Lotus Domino/Notes 应用包含一个或多个 Domino 数据库。 Domino 数据库保存了该应用中的数据、逻辑关系和设计元素。模板则是一种包含了数据库结构的文件,是一个包含了数据库设计元素的框架。它以 .ntf 作为其后缀名。通过使用模板,用户可以很方便地在企业内部或某一范围内确立 Domino/Notes 应用的设计标准,也可以很方便地维护同类型数据库设计的一致性。IBM Lotus Domino 提供了一系列的模板以供用户创建数据库使用。同时,用户也可以使用 Lotus Domino Designer 对模板进行定制。

本文中将主要讨论其中的邮件模板,它提供在本地或 Domino 服务器端发送或接收电子邮件以及使用日历进行行程安排等功能。当我们使用现有邮件模板创建一个新的邮件数据库的时候,模板中的设计元素就会被拷贝到该邮件数据库中。当然 , 我们也可以通过重新部署更新过的模板使邮件数据库与当前指定的邮件模板保持一致。

已有 Domino/Notes 邮件模板介绍

用户可以通过各种方式来访问 Domino 邮件数据库:Notes 客户端、Web 浏览器、POP3 客户端或者 IMAP 客户端等。无论是用哪种访问方式,Domino 邮件数据库的结构都是一样的,不同的是各种客户端的展现机制。使用 Lotus Notes 客户端的用户使用标准 Notes 邮件模板就可获取其所需功能。使用 Domino Web Access 或者 iNotes 客户端的用户则需要使用 Domino Web Access 邮件模板或 iNotes 邮件模板来创建自己的邮件数据库。各个版本的 Domino/Notes 提供的邮件模板如表 1 所示:

表 1. 各个版本的 Domino/Notes 邮件模板
服务器发布信息Notes 用户Web 用户
Domino 8.x 服务器Domino 8.5.X mail85.ntf mail85.ntf
 Domino 8.0.X mail8.ntf mail8.ntf
Domino 7.x 服务器 mail7.ntf dwa7.ntf
Domino 6.x 服务器 mail6.ntf iNotes6.ntf

各 Domino/Notes 版本对不同邮件模板版本的支持

在实际的应用环境中很难保证 Lotus Notes 和 Domino 版本始终一致,所以了解各个 Lotus Domino/Notes 版本对不同版本的邮件模板的支持情况是必要的。在此主要针对标准邮件模板作一下介绍。

表 2. 各个版本的 Domino/Notes 邮件模板
对 Mail85.ntf 的支持    
 Notes 8.5.x 客户端 Notes 8.x 客户端Notes 7.x 客户端Notes 6.x 客户端
Domino 8.5.x 服务器支持仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 8.x 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 7.x 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 6.5.6 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
对 Mail8.ntf 的支持    
 Notes 8.5.x 客户端Notes 8.x 客户端Notes 7.x 客户端Notes 6.x 客户端
Domino 8.5.x 服务器支持支持仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 8.x 服务器支持支持仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 7.x 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
Domino 6.5.6 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用仅支持在升级过程中的使用
对 Mail7.ntf 和 dwa7.ntf 的支持    
 Notes 8.5.x 客户端Notes 8.x 客户端Notes 7.x 客户端Notes 6.x 客户端
Domino 8.5.x 服务器支持支持支持 *
Domino 8.x 服务器支持支持支持 *
Domino 7.x 服务器支持支持支持 *
Domino 6.5.6 服务器仅支持在升级过程中的使用仅支持在升级过程中的使用 * *
对 Mail6.ntf 的支持       
  Notes 8.5.x 客户端Notes 8.x 客户端Notes 7.x 客户端Notes 6.x 客户端
Domino 8.5.x 服务器支持支持支持支持
Domino 8.x 服务器支持支持支持支持
Domino 7.x 服务器支持支持支持支持
Domino 6.5.6 服务器支持支持支持支持

注意:“仅支持在升级过程中的使用”表示该配置在服务器和客户端升级到新版本所需的时间之内是支持的。但不支持永远使用该配置。使用该配置不会导致已知的严重的问题或者缺陷。但是,IBM Lotus 不会对该配置上产生的问题发布补丁,因为该配置只会在升级过程中使用。

对于其他标注为 * 的部分,请参考关于具体版本支持的文档中的配置部分。

对现有模板进行二次开发的需求驱动有哪些?

虽然 Domino 系统提供的现有邮件模板已经具有了丰富的功能,使得终端用户可以比较方便的管理邮件以实现协同工作。但是,各终端用户都有其个性化的需求,需要定制或增加自己需要的设计元素,以增加终端用户使用的便捷性,或实现某功能需求,或更好地将邮件系统和其他已有的应用系统进行集成,例如:

  • 终端用户需要改变对 IBM Lotus Notes 客户端或者 Domino Web Access 客户端用户界面风格。例如改变界面的颜色或布局,添加或删除按钮等。
  • 对邮件本身信息的发现和处理。这是企业信息管理中很重要的一部分。将邮件信息与日常的商务处理进行结合,对邮件信息进行发掘利用,并与后台各种数据库应用服务器进行连接,可以很大程度的增加 Domino 的应用价值。例如:
    • 对邮件进行分类和标记。用户在日常工作过程中可能需要根据不同的条件对邮件进行分类,并对某一特定类别的邮件使用特有的图标标记其状态。这将在很大程度上帮助用户管理和识别邮件。
    • 对邮件进行自定义的归档和恢复,以及对邮件信息进行特定形式的搜索,以达到对邮件信息进行充分利用的目的。
    • 对邮件内容进行审计处理。
    • 将邮件与业务流程相结合。通过对邮件的处理进行业务的流转,这也是现在邮件相关应用的一种趋势。
  • 对于邮件处理过程中的多语言支持。邮件模板设计元素的定制必然会带来多语言支持的问题。准确地识别用户的语言环境并显示相应的语言信息,这也是用户需求较多的一部分功能。
  • 用户邮件操作的自动化处理。用户需要自定义一些功能块嵌入 Notes 邮件数据库中,并希望这些功能能够定时运行或及时被触发。例如:用户可能需要自动批量地进行邮件处理,以提高邮件处理效率;用户希望能够批量地删除或备份具有某些特征的邮件;用户希望能够对收到的邮件进行自动的分类存储。

怎样对现有模板进行二次开发

邮件数据库的组织

邮件数据库文件 (.NSF) 由四个部分组成:设计元素、数据文档、视图索引和全文索引。设计元素是指表单(Form)、视图(View)、代理(Agent) 和文件夹(Folder)等等,它们构成了应用的基础。数据文档(Documents)是用户提交的数据信息。形象来说,它就是用户保存在表单 (Form) 中的文档,数据库文件包容应用程序的数据,其结构由表单、域、文件夹、视图及其他显示功能部件(诸如导航器和数据库图标)组成。

图 1. 邮件数据库的组织
图 1. 邮件数据库的组织
图 1. 邮件数据库的组织

邮件数据库模板 (.NTF) 主要是指仅仅包含设计元素的邮件数据库文件。作为模板文件,它可以被应用到终端用户的邮件数据库中。同一个组织的终端用户可以共享一个邮件数据库模板,也可以使用多个邮件数据库模板,如不同部门使用不同的邮件数据库模板。

设计元素简介

下面对邮件数据库中的主要设计元素进行介绍,它们之间的关系如图 2 所示。

图 2. 邮件数据库的设计元素
图 2. 邮件数据库的设计元素
图 2. 邮件数据库的设计元素
  1. 框架集(Frameset): 框架集是框架 (Frame) 的集合,用户可以使用它在用户的 Web 站点或者 Notes 数据库中增加或者调整结构。
  2. 表单(Form):表单是用于在数据库中输入和查看信息的框架,邮件数据库可以包括基于若干个表单建立的文档。
  3. 视图(View):视图是数据库中的文档列表。基于所选择的准则,可以显示数据库的文档子集,或者所有的文档。基于文档的内容可以进行分组和排序。
  4. 文件夹(Folder):文件夹在结构上类似于视图,他们可以罗列文档,但是文件夹不具有选择规则,而是由用户来决定在文件夹中存储的内容,可以设置成私有或者共享的。
  5. 页面(Page):页面是可以向终端用户显示信息的设计元素。它类似于表单,只是它不能包含字段或者子表单。
  6. 字段(Field):字段是表单上存储数据的独立元素。字段可以确定单独的文档所能够包含的数据。文档中的每个字段都可以存储一种特定种类的数据。用户通常需要输入并且编辑字段值。例如人名、注释、电话号码、日期或计算结果。
  7. 共享代码(Shared Code):是指能够在数据库之间进行共享的 Domino 代码和设计元素。它包括:
    1. 代理(Agent):能够让用户在 Domino 中自动执行许多任务。进行设置之后能够在服务器上基于日程或者在出现特定事件的时候自动运行。
    2. 大纲(Outlines):类似于图像映射和导航器,可以为用户提供导航应用的方式。用户在大纲源进行一次改变,每个使用大纲源的导航结构都会动态进行更新。大纲可导航到用户数据库的视图和文件夹,或者与用户应用以外的其他元素、URL 进行链接。
    3. 子表单(Subform):可以在多个表单中使用的表单水平片段。
    4. 共享字段(Shared Fields):可以在不同的表单中使用,一旦改变,所有应用都相应改变。
    5. 操作(Action):可以为执行例行任务提供只需点击一次的快捷方式,可替代菜单选择。其中,可以为不能够访问 Notes 菜单的 Web 用户提供一种方式进行操作。操作能够进行共享,可在视图、子表单和表单上使用。
    6. 脚本库(Script Library):存放共享代码的位置,可以选择执行语言。
    7. 导航器(Navigator):作为图像映像出现在 Web 页面上,导航器提供了图形化的方式来让用户查找文档或在打开的数据库中执行操作而不用打开视图。
  8. 共享资源(Shared Resources): 能够在用户数据库之间共享的设计元素,有图像、文件、小应用程序、数据连接、样式表等。

每个数据库都能够包含它自己的共享代码和共享资源,用户能够在其他数据库中访问共享元素。共享元素可以让用户在应用中反复应用资源,而只需要在一个标准为之对其进行维护。利用共享代码和资源,用户还能够使用一个数据库集中存储特定类型的元素。然后在其他数据库中引用这些元素。

案例介绍

前面我们从理论上介绍了如何对邮件模板进行二次开发,下面我们结合实际案例对这一部内容进行进一步地介绍。我们知道,随 Lotus Domino/Notes 一起发布的模板主要提供对邮件信息的管理。而在实际应用中,邮件信息往往是和商业活动相关联的。通过对邮件模板的定制,能够更好地和商业活动相关联。

下面我们介绍一个简单的例子,考虑一个公司的法律部门,这个部门的员工经常需要处理与合同有关的邮件,而邮件可能来自于不同重要程度的客户:VIP 客户、重要客户和普通客户。对于来自不同级别客户的邮件所采取的响应时间是不同的,需要有相应的优先处理级别。通过创建自定义操作,终端用户可以标识邮件来自于哪个级别的客户。通过使用后台运行的代理,终端用户可以定期收到关于现有邮件的统计信息。通过创建分类清晰视图,终端用户则可以清楚地看到分类同时有层次关系的邮件。

创建自定义操作

在 Notes 客户端中,终端用户可以选择在“操作”菜单下提供的一些系统功能。通过二次开发,“自定义操作”可以添加到“操作”菜单中。“自定义操作”用前面提到的代理来实现。代理可以用简单的功能、公式、LotusScript 或者 Java 进行编程,可以根据具体任务选择最佳相应的语言和技术。

在 IBM Lotus Domino Designer 中,打开邮件数据库模板。单击设计框架的“共享代码”“代理”,单击“新建代理”按钮。就可以创建一个新的代理。如图 3,我们分别创建了“合同管理 \ 设置为 VIP 客户”,“合同管理 \ 设置为重要客户”和“合同管理 \ 设置为普通客户”三个代理。这里我们使用的反斜线是帮助创建二级操作。这三个代理同属于一个一级操作“合同管理”。

图 3. 使用 IBM Lotus Domino Designer 创建代理
图 3. 使用 IBM Lotus Domino Designer 创建代理
图 3. 使用 IBM Lotus Domino Designer 创建代理

在代理设计过程中,你需要指定代理名称、共享方式等基本信息。这些都比较容易理解。然而,选择代理何时运行,怎样运行以及怎么样处理对象是一个关键问题。通常代理可以“按事件”触发,也可以“按日程安排”来触发。创建自定义操作的代理,我们需要选择“按事件”触发。

表 3 “按事件”触发使用的选项和注意事项。
选项说明
“操作”菜单选项
(Action menu selection)
用户激活的代理使用该选项,如果在 Web 上运行该代理时,使用 WebQuerySave 或者 WebQueryOpen 事件。
代理列表中选择
(Agent list selection)
这项设置用于通过操作、按钮、URL 或其他代理调用的代理,具有这项设置的代理不会出现在“操作”菜单中。
新邮件到达前
(Before new mail arrives)
这项设置在邮件显示在邮件数据库之前用来处理邮件。 例如,移动新邮件到一特定的文件夹。
注意:一个邮件数据库里应至多有一个具有这项设置的代理。
新邮件到达后
(After new mail has arrived)
这项设置在邮件显示在邮件数据库之后用来处理邮件。 例如,回复,转发或者其他操作。
注意:一个邮件数据库里可以有多个具有这项设置的代理。
文档被创建或修改之后
(After documents are created or modified)
这项设置适合于用来处理新邮件或者更改的邮件的工作流任务。代理管理器会定期触发这样的代理在本地 Notes 客户端或者服务器端执行。
取决于服务器的负载,代理的执行可能有 5 到 30 分钟的延迟时间。
当文档被粘贴时
(When documents are pasted)
当文档被粘贴到邮件数据库时需要修改时使用这项设置。
注意: 这个选项需要用户触发,不能在后台运行。
服务器启动时
(When server starts)
具有这项设置的代理只能在服务器启动时被执行,其他时候都不会被执行。如果你希望代理不但在服务器启动时,而且在其他时候都被执行,可以使用代理列表中选择选项,然后创建另外一个在服务器启动时被调用的代理。

在这里,需要代理对终端用户可见,同时由终端用户选择触发,我们选择“操作”菜单选项。接下来,需要指定代理触发时所采取的具体的动作。对于本列来说,我们选择针对来自不同客户的邮件可以进行不同的标记。在 _ViewIcon 字段上,如果是来自于 VIP 客户,标记 116(紫色图标);如果是来自于重要客户,标记 115(红色图标);如果是来自于重要客户,标记 114(绿色图标)。标记为紫色图标的 LotusScript 代码如下所示:

Sub Initialize
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim doc As NotesDocument
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	Set doc = collection.GetFirstDocument()
	While Not(doc Is Nothing)		
		Set itemA = doc.ReplaceItemValue( "_ViewIcon", 116 )		
		Call doc.Save( False, True )		
		Set doc = collection.GetNextDocument(doc)
	Wend
End Sub

在 Notes 客户端所产生自定义操作如图 4 所示:

图 4. 在 IBM Lotus Notes 中可以选择的自定义操作
图 4. 在 IBM Lotus Notes 中可以选择的自定义操作
图 4. 在 IBM Lotus Notes 中可以选择的自定义操作

图 5 是终端用户对来自不同客户的邮件进行标记后的结果。

图 5. 邮件被标记后的结果
图 5. 邮件被标记后的结果
图 5. 邮件被标记后的结果

创建分类丰富的视图

当终端用户对来自不同客户的邮件进行标识后,分类丰富的视图能够更好地组织这些邮件。图 6 中的“合同邮件”视图就是一个这样的视图。 除了有不同颜色的图标来标识邮件外,来自于不同级别客户的邮件也被组织在不同的分区内。通过展开和折叠相应的分区,可以给终端用户不同的视角查看邮件,使得他们可以专注于关心的邮件。

图 6. “合同邮件”视图
图 6. “合同邮件”视图
图 6. “合同邮件”视图

那么如何实现这样的视图呢?

首先需要创建一个“合同邮件”视图使其只选取那些用户标识过的邮件,在“视图选择”指定如下公式:

SELECT _ViewIcon != ""

然后,增加两个新列:“状态列”和“( 状态帮助列 )”。

图 7. 设计“合同邮件”视图
图 7. 设计“合同邮件”视图
图 7. 设计“合同邮件”视图

“( 状态帮助列 )”是一个隐藏的列,根据邮件的内部状态计算出邮件的类别,同时给状态列赋赋予相应的类别显示名称,如下所示。

DocumentStateSort := 0;

DEFAULT DocumentStateCategory := @If(
         _ViewIcon=116;
                @Do(@Set ("DocumentStateSort";1);"VIP客户");
          _ViewIcon=115;
                @Do(@Set ("DocumentStateSort";2);"重要客户");
         _ViewIcon=114;
                @Do(@Set ("DocumentStateSort";4);"普通客户");
         @Do(@Set ("DocumentStateSort";5);"未知客户")
         );

DocumentStateSort

“状态”列的值很简单,即是 DocumentStateCategory。不过需要注意的是,此列需要设置如下的选项。排序可以选择“升序”或者“降序”。类型需要选择“分类”。同时选中“将多值分开显示成独立的条目”。

图 8. “状态”列设置
图 8. “状态”列设置
图 8. “状态”列设置

创建后台运行的代理

前面讲述了自定义操作的代理,同时我们也可以使用后台运行的代理来完成一些不需要终端用户触发的操作,如定期的发送统计邮件。

表 4. 日程处理周期
选项说明
每天多于一次 这项设置用来按时运行代理,一天若干次。单击“日程安排”按钮可以指定时间表。
每天一次 这项设置用来按时运行代理,一天一次。
每周一次 这项设置用来按时运行代理,一周一次。
每月一次 这项设置用来按时运行代理,一月一次。
从不运行 如果希望保存代理但不希望在特殊情况(如通过另一个代理调用)以外的情况运行,可以使用这项设置。

这里我们创建一个每月后台运行一次的代理,以发送对当月来自不同客户邮件的统计信息,邮件信息如图 9 所示。

Sub Initialize
    Dim NewUIWorkspace As New NotesUIWorkspace
    Dim NewNoteSession As New NotesSession
    Dim CurrentDB As NotesDatabase 
    Set CurrentDB = NewNoteSession.CurrentDatabase
    
    ‘创建新邮件
    Dim MailDoc As NotesDocument
    Set MailDoc = New NotesDocument(CurrentDB)
    MailDoc.form = "Memo"
    MailDoc.SendTo = NewNoteSession.EffectiveUserName
    MailDoc.Subject = "月度统计"
    
    ‘创建邮件体
    Dim TableNotesRichTextItem As NotesRichTextItem
    Set TableNotesRichTextItem = MailDoc.CreateRichTextItem("Body")
    
    Dim columnHeaderStyle As NotesRichTextStyle
    Set columnHeaderStyle = NewNoteSession.CreateRichTextStyle( )
    columnHeaderStyle.Bold = True
    columnHeaderStyle.FontSize =8
    columnHeaderStyle.NotesFont = TableNotesRichTextItem.GetNotesFont("Arial", True)
    
    ‘创建表格
    Dim i As Integer
    Dim columnStyles(0 To 4) As NotesRichTextParagraphStyle
    For i = 0 To 4
        Set columnStyles(i) = NewNoteSession.CreateRichTextParagraphStyle
        columnStyles(i).LeftMargin = 0
        columnStyles(i).FirstLineLeftMargin = 0
    Next
    columnStyles(0).RightMargin  =3 * RULER_ONE_CENTIMETER    
    columnStyles(1).RightMargin = 8 * RULER_ONE_CENTIMETER    
    columnStyles(2).RightMargin = 8 * RULER_ONE_CENTIMETER    
    columnStyles(3).RightMargin = 3 * RULER_ONE_CENTIMETER
    columnStyles(4).RightMargin = 3 * RULER_ONE_CENTIMETER
    
    Dim headerColor As NotesColorObject
    Dim dataColor As NotesColorObject
    Set headerColor = NewNoteSession.CreateColorObject
    Call headerColor.SetRGB(239,239,239)
    Set dataColor = NewNoteSession.CreateColorObject
    Call dataColor.SetRGB(255,255,255)
    
    Call TableNotesRichTextItem.AppendTable(1,5,,,columnStyles)
    
        ‘创建表格头
    Dim TableNotesRichTextNavigator As NotesRichTextNavigator
    Set TableNotesRichTextNavigator = TableNotesRichTextItem.CreateNavigator()
    TableNotesRichTextNavigator.FindLastElement RTELEM_TYPE_TABLE
    
    Dim TableNotesRichTextTable As NotesRichTextTable
    Set TableNotesRichTextTable = TableNotesRichTextNavigator.GetElement
    TableNotesRichTextTable.Style = TABLESTYLE_TOP
    TableNotesRichTextTable.SetColor headerColor
    TableNotesRichTextTable.SetAlternateColor dataColor
    
    TableNotesRichTextItem.AppendStyle columnHeaderStyle
    TableNotesRichTextNavigator.FindNextElement RTELEM_TYPE_TABLECELL
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    TableNotesRichTextItem.AppendText "客户类型"
    TableNotesRichTextItem.EndInsert
    TableNotesRichTextNavigator.FindNextElement
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    TableNotesRichTextItem.AppendText "发件人"
    TableNotesRichTextItem.EndInsert
    TableNotesRichTextNavigator.FindNextElement
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    TableNotesRichTextItem.AppendText "主题"
    TableNotesRichTextItem.EndInsert
    TableNotesRichTextNavigator.FindNextElement
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    TableNotesRichTextItem.AppendText "日期"
    TableNotesRichTextItem.EndInsert
    TableNotesRichTextNavigator.FindNextElement
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    TableNotesRichTextItem.AppendText "邮件链接"
    TableNotesRichTextItem.EndInsert
    
    ‘查找“合同邮件”视图
    Dim ContractNotesView As NotesView
    Set ContractNotesView = CurrentDB.GetView("合同邮件") 
    
    Dim ContractNotesViewNavigator As NotesViewNavigator
    Set ContractNotesViewNavigator = ContractNotesView.CreateViewNav
    Dim ContractNotesViewEntry As NotesViewEntry
    Set ContractNotesViewEntry = ContractNotesViewNavigator.GetFirstDocument
    
    Dim dataStyle As NotesRichTextStyle
    Set dataStyle = NewNoteSession.CreateRichTextStyle()
    dataStyle.Bold = False
    dataStyle.FontSize = 10
    
    TableNotesRichTextNavigator.FindNextElement 
    TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator
    Call TableNotesRichTextItem.AppendStyle(dataStyle)    
    TableNotesRichTextItem.EndInsert
    
'计算上个月
    Dim lastMonth As New NotesDateTime( "" )
    lastMonth.LSLocalTime = Now    
    Call lastMonth.AdjustMonth( -1 ) 
    
    While Not ContractNotesViewEntry Is Nothing
        Dim dateTime As NotesDateTime
        Dim item As NotesItem    
        Set dateTime = ContractNotesViewEntry.Document
		    .GetItemValueDateTimeArray("PostedDate")(0)    
        
        If (dateTime.GMTTime>lastMonth.GMTTime) Then
            
            ‘增加一行
            Call TableNotesRichTextTable.AddRow(1)
            
            TableNotesRichTextNavigator.FindNextElement
            TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator  
            
            Dim MailType As String 
            Dim MailTypeText As String
            MailType = ContractNotesViewEntry.Document.GetItemValue("_ViewIcon")(0)
            If MailType = "114" Then
                MailTypeText =  "普通客户"
            Elseif MailType = "115" Then
                MailTypeText =  "重要客户"
            Elseif MailType = "116" Then
                MailTypeText =  "VIP客户"            
            End If
            
            TableNotesRichTextItem.AppendText MailTypeText
            TableNotesRichTextItem.EndInsert
            
            TableNotesRichTextNavigator.FindNextElement
            TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator  
            TableNotesRichTextItem.AppendText ContractNotesViewEntry.Document_
			    .GetItemValue("From")(0)
            TableNotesRichTextItem.EndInsert
            
            TableNotesRichTextNavigator.FindNextElement
            TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator  
            TableNotesRichTextItem.AppendText ContractNotesViewEntry.Document_
			    .GetItemValue("Subject")(0)
            TableNotesRichTextItem.EndInsert
            
            TableNotesRichTextNavigator.FindNextElement
            TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator     
            TableNotesRichTextItem.AppendText ContractNotesViewEntry.Document_
			    .GetItemValue("PostedDate")(0)
            TableNotesRichTextItem.EndInsert
            ‘添加文档链接
            TableNotesRichTextNavigator.FindNextElement
            TableNotesRichTextItem.BeginInsert TableNotesRichTextNavigator  
            Call TableNotesRichTextItem.AppendDocLink ( ContractNotesViewEntry.Document,_
			    ContractNotesViewEntry.Document.GetItemValue("Subject")(0))
            TableNotesRichTextItem.EndInsert 
        End If 
        
        Set ContractNotesViewEntry = ContractNotesViewNavigator_
		    .GetNextDocument(ContractNotesViewEntry)  
    Wend
    
    Call   MailDoc.Send(False)    
    
End Sub
图 9. 月度统计邮件
图 9. 月度统计邮件
图 9. 月度统计邮件

添加用户定义的图标

前面我们讲到了对 _ViewIcon 字段进行赋值,相应图标所对应的数字编号可以由下表查到。

图 10. 系统图标对照表
图 10. 系统图标对照表
图 10. 系统图标对照表

如果发现所提供的系统图标不能满足当前的需求,你可以增加用户自定义图标到邮件模板中。这样,当使用如下代码时就可以使用自定义图标来标识邮件:

…
    Set itemA = doc.ReplaceItemValue( "_ViewIcon", "accept.gif" ) 	
…

需要注意的是尽量不要在图标名称中使用下划线,在一些系统中会引起这样的图标不可见。

调试代理以提高问题修复的效率

在使用代理所提供丰富功能的同时,需要使用最有效的工具来调试代理以提高问题修复的效率。可以使用的工具包括:

  • 代理日志。可以查看代理日志以获得关于代理的关键信息,例如代理启动的最后时间和日期、有多少文档经过了处理、代码运行的类型 ( 如 LotusScript) 以及代理完成的最后时间和日期等。要想查看代理的代理日志,请在 Lotus Domino Designer 中选定代理并从菜单中依次选择“代理”“日志”。
  • LotusScript 调试程序。使用 LotusScript 调试程序调试用 LotusScript 编写的代理,它允许跟踪代理过程及代理范围内的变量值和对象。要想使用 LotusScript 调试程序,请从菜单中依次选定文件工具  调试 LotusScript,并运行代理。
  • 服务器控制台调试。Domino Server 控制台提供了 3 种命令,Tell Amgr Schedule 、Tell Amgr Status 和 Tell Amgr Debug,他们可以显示预定在当天运行所有代理的时间安排表、Agent Manager 代理队列状态和代理调试设置状态的信息。
  • NotesLog 类。 NotesLog 类是方便且动能强大的工具类、用来跟踪过程,并报告发生在使用 LotusScript 编写的代理和后台工作的 Java 代理中的活动信息。可以在代理运行时打印调试信息。如果使用 LotusScript 或 Java 代理,就可以在 Notes Log 数据库或文件中记录日志信息。

小结

本文讲述了对 IBM Lotus Domino/Notes 中的邮件模板进行二次开发的相关经验。这里的案例只是基于一些简单的需求,通过这些案例,我们希望能够达到举一反三、抛砖引玉的目的。在实际环境中,用户可能有特定的需求,可以针对实际情况对邮件模板进行定制,从而来实践和优化这些经验。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=492928
ArticleTitle=对 Lotus Notes 邮件模版进行二次开发的最佳实践
publish-date=05272010