内容


在 Lotus Notes 中创建标准回复文档

一般的答复带有邮件数据库中的一些新设计元素

Comments

在许多公司,当同一电子邮件回复与同一产品或技术支持问题有关时,会多次发送该回复。通过对 Notes 邮件模板进行少量更改,Lotus Notes 可以存储这些回复并将其连接到标准回复电子邮件中。该功能通过简单的选择框和单击按钮,可以将预先确定的消息添加到电子邮件消息中。通过向邮件模板添加一些新的设计元素,可以从标准回复的自制列表中选择要添加到消息中的回复。

有两种方法实现该解决方案:

  • 使用 @formulas 和非富文本文档(用于版本 3 及更高版本)
    Memo 表单中的表单按钮执行该 @formula。该按钮将选择的文本添加到电子邮件消息中。
  • 使用 LotusScript 和富文本文档(用于版本 5 及更高版本)
    邮件视图中的共享操作按钮包含 LotusScript,其创建电子邮件消息并添加选择的回复文档。LotusScript 代码使用动态数组和 Domino Designer 的版本 5 及更高版本中可以使用的新 Prompt 方法。

本文说明了这两种解决方案,适用于 Notes 应用程序开发人员。具有 Notes 公式语言和/或 LotusScript 的知识会有所帮助,但不是必要的。

可以从 Sandbox 下载包含标准回复文档的 sample Notes mail templates (release 5 and later),然后替代现有邮件数据库的设计。请参见 SRTReadMeFirst.txt 和示例模板。本文描述了修改邮件模板以包含该解决方案所需的设计工作。

注意:要进行应用程序展示,请从 Sandbox 下载或展开 Standard Response Text Flash demo

开发设计元素

下面概述了使用添加到标准邮件模板的所有伴随的设计元素来实现解决方案所需的步骤:

  1. 设计标准回复文档所基于的新表单。
  2. 创建显示标准回复文档的视图。
  3. 创建操作按钮来运行该应用程序。
    • 对于纯文本文档,在 Memo 表单上创建操作按钮,以将标准回复文档中的文本添加到当前电子邮件消息中。
    • 对于富文本文档,创建视图操作按钮,执行查找以及将回复连接到单个消息中。
  4. 更改所有邮件视图选择公式,避免显示标准回复文档。
  5. 在 Lotus Notes 中创建标准回复文档。
  6. 检查最终设计。

设计表单

使用两个字段设计表单。第一个字段是用于主题的纯文本字段。主题字段将包括标准回复文档的简短描述。第二个字段是 LotusScript 解决方案的富文本字段或 @formula 解决方案的纯文本字段。该字段包含整个标准回复。表单不需要进行其他任何编码。

创建视图

创建视图以显示标准回复文档和主题列。这是邮件数据库中的新视图,视图选择公式应该仅用于标准回复文档:

SELECT Form = "ResponseForm"

对于视图名称,可以使用以 Admin 为顶层的层次结构,例如 Admin\StandRespText。邮件文件中该视图的用途是使您可以查看、编辑和创建标准回复。对于查找标准回复文档的代理,将标题按升序排列,如 Admin\StandRespText 视图中所示。

图 1. 标准回复文档
标准回复文档
标准回复文档

创建操作按钮

对于富文本解决方案,视图操作使您可以对 Inbox 视图中的所选电子邮件进行回复。在 Domino Designer 中打开($Inbox)文件夹,并选择 Create - Action - Action。在编程器的面板中,选择 LotusScript,然后添加“相关内容”列表里的文件“Standard response document code example”中的 LotusScript 按钮代码。要将该按钮添加到邮件数据库中的所有邮件视图中,则创建共享操作。

使用视图操作按钮可以选择要一起放入单个电子邮件消息中的回复文档,但是真正的意义并不在此。下列代码段对文档进行计数,并将文档主题存储在 LotusScript 中 @Prompt_OKCancelListMult 等同项的变维数组中。

i =1
	Nod = 0 ' Number of documents in response view (initialize)
	While (i < 3)
		Set view=db.getview("Admin \ StandRespText")
		Set curdoc1=view.getfirstdocument 'Line 50
		Set curdoc2 = curdoc1
		j=0
		While Not (curdoc2 Is Nothing)
			Set curdoc2 = view.GetNextDocument(curdoc1)
			If ( i > 1) Then
				If ( j = 0) Then
					' ReDim only once when i =2 and j = 0
					RDim=Nod - 1 ' Dimension starts at zero, 
					' so dimension number is one less than 
					' the number of documents
					Redim StanResD(RDim) As Notesdocument
					Redim itms(RDim) As String 'Line 60
				End If
			'---------------------------------------------------------------
			' First loop of I does not get field from documents; 
			' counts the documents
				If curdoc1.HasItem("Subject") Then
					Set item = curdoc1.GetFirstItem("Subject")
					itmv = curdoc1.GetItemValue("Subject")
					itms(j) = Cstr(itmv(0)) 
					j=j+1
				End If
		'--------------------------------------------------------------------
		'Line 70
			End If
			Set curdoc1 = curdoc2
			If ( i = 1) Then
				Nod = Nod+1 ' Count the number of documents (nod) 
				' in this view for the first loop of I only
			End If
		Wend
		i = i +1
	Wend

下一代码段在提示框中显示每个回复文档的主题,以便于用户选择任何组合。在显示框中的显示顺序就是每个富文本正文字段回复连接到新电子邮件中的顺序。

	Set curuidoc = workspace.CurrentDocument
	userchuz = workspace.Prompt(PROMPT_OKCANCELLISTMULT,_
	"Standard ResponseText List", "Please select the response text _
	to use from the list","", itms)  'Line60
	If (userchuz(0) <> "") Then
		'Continue
		Goto Cont01
	Else
	'No Choice was made
		Exit Sub
	End If  'Line 90
Cont01:

现在代码在所有回复文档中循环,以复制所选的富文本字段。回复存储在内存的富文本项变量中。

	K=0
	upperBound = Ubound(userchuz)
	While (K <= upperbound)
		Set view=db.getview("Admin \ StandRespText")
		Set curdoc1=view.getfirstdocument
		Set curdoc2 = curdoc1  'Line100
		j=0
		While Not (curdoc2 Is Nothing)
			Set curdoc2 = view.GetNextDocument(curdoc1)
			If curdoc1.HasItem("Subject") Then
				Set item = curdoc1.GetFirstItem("Subject")
				itmv = curdoc1.GetItemValue("Subject")
				itms(j) = Cstr(itmv(0))
			' y is set to "0" if the following string does compare
				y = Strcomp(itms(j),userchuz(k), 5)
				If (y = 0) Then  'Line110
					Goto Cont03 ' Choice is found; proceed to copy it
				Else
			' Choice is not found; keep looking
				End If
				j=j+1
			End If
			Set curdoc1 = curdoc2
		Wend
	' Choice not found
		Exit Sub 'Line110
Cont03:
		Set StanResD(k) = curdoc1 ' StanResD is now the standard_
		' response document selected for copy
		If (k < 1) Then
			Set ritmv0 = StanResD(k).GetFirstItem("RBody")
		Else
			Set ritmv1 = StanResD(k).GetFirstItem("RBody")
			Call ritmv0.AddNewLine( 1 )
			Call ritmv0.AppendRTItem(ritmv1)
		End If
		k=k+1 'Line 120
	Wend

然后它确定便签是新的、是一个回复,还是带有原电子邮件的回复,并添加该信息。

Dim repcol As NotesDocumentCollection
	Dim repdoc As NotesDocument
	Dim ritmv3 As NotesRichTextItem
	Dim itmst As String
	Set db = session.CurrentDatabase
	Set repcol = db.UnprocessedDocuments    
	Set repdoc = repcol.GetFirstDocument
	Set item = repdoc.GetFirstItem("Subject")
	itmv = repdoc.GetItemValue("Subject")
	itmst = Cstr(itmv(0))
	message$ = " " & cr$ _
	& " Current document in Inbox view = " + itmst + cr$ _
	& "" + cr$_
	& "New memo - Click Cancel" + cr$_
	& "Reply To Cur Doc - Click Yes" + cr$_
	& "Reply with History to Cur Doc - Click No"
	boxType& = 19 ' MB_YESNOCANCEL + MB_ICONStop
	answer% = Messagebox(message$, boxType&, _ 
	"Inbox Highlighted Document!")
	If(answer% = 2) Then
		Call ritmv0.CopyItemToDocument(maildoc, "Body")
		Goto ContResI ' Cancel - Continue with new e-Mail
	Elseif(answer% = 6) Then
	' Yes = Create a Reply Memo (No History)
		Set item = repdoc.GetFirstItem("From")
		Call item.CopyItemToDocument(maildoc, "SendTo")
		Set item = repdoc.GetFirstItem("Subject")
		itmv = repdoc.GetItemValue("Subject")
		itmst = Cstr(itmv(0)) 
		itmst = "RE:" + itmst
		Set item = repdoc.ReplaceItemValue("Subject", itmst )
		Call item.CopyItemToDocument(maildoc, + "Subject")
		Call ritmv0.CopyItemToDocument(maildoc, "Body")
	Elseif(answer% = 7) Then
		' No Create a Reply Memo with History
		Set item = repdoc.GetFirstItem("From")
		Call item.CopyItemToDocument(maildoc, "SendTo")
		Set item = repdoc.GetFirstItem("Subject")
		itmv = repdoc.GetItemValue("Subject")
		itmst = Cstr(itmv(0)) 
		itmst = "RE:" + itmst
		Set item = repdoc.ReplaceItemValue("Subject", itmst )
		Call item.CopyItemToDocument(maildoc, "Subject")
		Call ritmv0.AddNewLine( 2 )
		Call ritmv0.AppendText _
		( "Your E-mail: ")
		Call ritmv0.CopyItemToDocument(maildoc, "Body")
		Set ritmv3 = repdoc.GetFirstItem("Body")
		Call ritmv3.CopyItemToDocument(maildoc, "Body")
	Else		
		Exit Sub ' Cancel so quit out.
	End If
ContResI:

最后,它在新电子邮件中保存所选的回复,并以编辑模式打开电子邮件以添加其他文本或备注。这里惟一要警告的是,如果此时取消便签,由于使用了后台 LotusScript 类,所以仍将保存草稿副本。删除任何不必要的消息。

	Call maildoc.save(False,False) ' Save Doc
	Set curuidoc = workspace.EditDocument( False,maildoc,False) 
	' The EditDocument method brings the back-end document into the front end.
	Goto TEnd

备选的 @formula 解决方案(纯文本标准回复)

如果使用纯文本字段而不是富文本字段创建了表单,对于标准回复文本,需要使用 @formulas。比较简单但是功能非常强大的 @formula 命令使用 @DBColumn 和 @DBLookup 来将标准回复纯文本添加到电子邮件消息中。@Prompt 列表框显示 @DBLookup 命令选择的回复并将该文本插入电子邮件正文字段中。要使用 @formula 解决方案,需要创建代理。在“When should the agent run?”字段中,选择“Manually from the agent list”。在“Which documents should it act on?”字段中,选择“Run once (@commands may be used)”。在编程器的面板中,选择 Formula,然后添加下列代码:

ltroptions := @DbColumn("Notes" : "NoCache" ; "" : "" ; "ResponseView"; 1);
ltrdefault := @Subset(ltroptions; 1);
ltr := @Prompt([OKCANCELLIST]; "Standard ResponseText List";_
"Please select the response text to use from the list."; ltrdefault; ltroptions);
ltrtext := @DbLookup("Notes":"NoCache";"":"";"ResponseView"; ltr;"RBody");
@Command([EditGotoField]; "Body");
@Command([EditInsertText]; ltrtext);
@Command([EditInsertText]; @Char(0) + @Char(0));
@All

注意:必须使用在 @DBLookup 公式的关键字中所使用的值来对列进行排序。如果该列未进行排序,将返回空值,代理中的 @formulas 将不再继续执行。在下面的屏幕截图中,包含主题(如 Opening Comment 和 Closing Comment)的非富文本回复的视图中的列必须进行排序(升序或降序);否则,添加到电子邮件中的行将为空白。

图 2. 版本 5 邮件数据库中纯文本解决方案的结果
版本 5 邮件数据库中纯文本解决方案的结果
版本 5 邮件数据库中纯文本解决方案的结果

在调用该公式代理的 Memo 表单中创建表单操作按钮。在编程器面板中,选择 Simple Action(s),然后添加该操作以运行上面创建的代理。在 Lotus Notes 5 中,使用 Add Action 对话框在 Action 字段中选择 Run Agent,然后选择代理名称。

为操作选择适当的图标。在 Action Pane,选择 Create - Action。输入操作名称 StandRespText,然后选择位置,例如,在列表的顶层显示位置 1。通过关闭面板保存操作。

以下各部分适用于 LotusScript 富文本和纯文本 @commands 公式解决方案。

修改 All Documents 和 Draft 视图

这些文档既不是接收邮件,也不是发送邮件,且没有相同字段,可以将它们存放在普通邮件视图之外。在 Domino Designer 中,打开($All)视图。在 Objects 选项卡中,选择 View Selection。默认视图选择公式是:

SELECT @IsNotMember("A";ExcludeFromView)

将下列行添加到公式中,防止标准回复文档显示在视图中:

& !@Contains(Form;"ResponseForm")

保存视图修改

也可以对 Draft 文档视图执行相同操作。在 Domino Designer 中,打开($Drafts)视图。在 Objects Tab 中,选择 View Selection 来查看下列公式:

SELECT PostedDate = "" & $MessageType = "" & @IsNotMember("D";ExcludeFromView) & ISMAILSTATIONERY != 1

将下列行添加到公式中,防止标准回复文档显示在视图中:

& !@Contains(Form;"ResponseForm")

创建标准回复文本文档

在 Lotus Notes 中,打开新视图 Admin \ Standard Response Text,从 Create 菜单创建 Standard Response Text 文档。要使用户更加方便进行该操作,可以添加视图操作按钮来创建标准回复文档。如果正文字段是富文本,可以向回复中添加富文本元素,如图像。至少要创建一个文档,否则将发生错误(Error 184: Variant does not contain a container)。如果使用示例数据库模板,可在 Lotus Notes 中打开模板并复制示例标准回复文本文档。检查这些文档并进行编辑或删除。

最终设计检查

作为最终检查以确保所有修改的设计元素都继承了新模板数据库(SRTMDB.ntf)中的设计,打开每个修改的或新的设计元素的 Design Properties 框,选择“Prohibit design refresh or replace to modify”选项。这允许数据库从新的模板继承更改,而其他更改则从标准邮件模板继承。否则,您的更改可以放入所有用户的邮件模板中。

下面是更改的设计元素的列表:

  • Form Document - Standard Response Text
  • View - Admin \ StandRespText
  • View - ($All)
  • View - ($Drafts)
  • Folder - ($Inbox)
  • Memo 表单(仅使用公式命令的非富文本解决方案)

更改设计属性后,可以将设计元素从示例数据库复制并粘贴到邮件数据库中,或用 Sandbox 中示例邮件模板的相应版本替代邮件数据库的设计。

使用新应用程序(富文本解决方案)

单击前面创建的视图操作按钮时,标准回复文档会出现在一个对话框中。从该对话框可以选择多个回复文档,Lotus Notes 将创建包含选择的所有回复的电子邮件消息。

图 3. 从列表中选择回复文档
从列表中选择回复文档
从列表中选择回复文档

注意:文档以数字开头,该数字用来创建这些文档添加到电子邮件中的顺序。例如,如果新文档主题的开头是 40(Closing Comment),则该文档将在主题行中为 20(Face1-Face of Frustration)的文档之后插入。

视图操作使您可以选择新的便签、回复消息或带有原消息的回复。请仔细阅读该消息。Domino Designer 无法生成具有多个应用程序设计按钮的弹出框,所以选择该方法来使回复更加容易,仅需单击一次按钮。可以设计具有答复 1、2 或 3 以及其他任何输入错误数据的错误代码的弹出框,而不是具有 Yes、No 和 Cancel 按钮的弹出框。这种输入比仅单击按钮更加具有交互性。在我们的例子中,这些按钮表示下列意思:

  • 要创建新便签,单击 Cancel。
  • 要回复当前文档,单击 Yes。
  • 要回复当前文档且附带原文,单击 No。
图 4. 弹出框
弹出框
弹出框

可以通过创建其他回复文本文档来使用许多不同的电子邮件签名。您可能想对内部邮件使用一个签名,对外部邮件使用另一个签名。

下面是一个电子邮件消息的例子。在图 5 中,从单独的回复文档,在消息中创建了正文文本、按钮、图像和签名。

图 5. 具有回复文档的电子邮件消息
具有回复文档的电子邮件消息
具有回复文档的电子邮件消息

记住,当通过 Internet 向其他电子邮件系统发送 Notes 富文本字段时,富文本字段被转换为 HTML,但是在大多数更新的电子邮件程序(尤其是 Web 邮件客户机)中仍可以正常显示。

结束语

正如您可以看到的,这是对任何标准 Notes 邮件模板的非常强有力的增强。可以通过从示例下载文件中选择一个适当的版本 5、版本 6 或版本 6.5 模板,并替代邮件文件设计,从而快速添加这个定制功能。当 Lotus Notes/Domino 7 可以使用时,可以在 Domino Designer 7 中打开版本 6.5 示例模板,并复制本文中讨论的所有设计元素,以便为用户创建 Notes 7 邮件模板!许多回复文本文档都可以将其富文本或纯文本正文字段附加到电子邮件消息后。在发送之前,可以对消息进行进一步编辑以使用定制回复。无论您喜欢什么,都由您自己决定!


相关主题


评论

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=58567
ArticleTitle=在 Lotus Notes 中创建标准回复文档
publish-date=02082005