2

我正在设置一个 Lotus Notes 帐户来接受来自客户端的电子邮件,并自动将每封电子邮件保存为纯文本文件以供另一个应用程序处理。

因此,我正在尝试在 Lotus 中创建我的第一个代理,以自动将电子邮件导出为文本。

是否有标准的最佳实践方法来做到这一点?

我创建了一个非常有效的 LotusScript 代理。但是,有一个错误 - 一旦备忘录的正文超过 32K 个字符,它就会开始插入额外的 CR/LF 对。

我正在使用 Lotus Notes 7.0.3。

这是我的脚本:

 Sub Initialize
 On Error Goto ErrorCleanup
 Dim session As New NotesSession
 Dim db As NotesDatabase
 Dim doc As NotesDocument
 Dim uniqueID As Variant 
 Dim curView As NotesView
 Dim docCount As Integer
 Dim notesInputFolder As String 
 Dim notesValidOutputFolder As String
 Dim notesErrorOutputFolder As String 
 Dim outputFolder As String
 Dim fileNum As Integer
 Dim bodyRichText As NotesRichTextItem
 Dim bodyUnformattedText As String
 Dim subjectText As NotesItem

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''
 'INPUT OUTPUT LOCATIONS 
 outputFolder = "\\PASCRIA\CignaDFS\CUser1\Home\mikebec\MyDocuments\"
 notesInputFolder = "IBEmails" 
 notesValidOutputFolder = "IBEmailsDone"
 notesErrorOutputFolder="IBEmailsError"
 '''''''''''''''''''''''''''''''''''''''''''''''''''''''

 Set db = session.CurrentDatabase
 Set curview = db.GetView(notesInputFolder ) 
 docCount = curview.EntryCount
 Print "NUMBER OF DOCS "  & docCount
 fileNum = 1
 While (docCount > 0)
  'set current doc to 
  Set doc = curview.GetNthDocument(docCount)

  Set bodyRichText = doc.GetFirstItem( "Body" )
  bodyUnformattedText = bodyRichText.GetUnformattedText()
  Set subjectText = doc.GetFirstItem("Subject")
  If subjectText.Text = "LotusAgentTest" Then
   uniqueID = Evaluate("@Unique")
   Open "\\PASCRIA\CignaDFS\CUser1\Home\mikebec\MyDocuments\email_" & uniqueID(0) & ".txt" For Output As fileNum
   Print #fileNum, "Subject:" & subjectText.Text
   Print #fileNum, "Date:" & Now
   Print #fileNum, bodyUnformattedText
   Close fileNum
   fileNum = fileNum + 1
   Call doc.PutInFolder(notesValidOutputFolder)
   Call doc.RemoveFromFolder(notesInputFolder)
  End If
  doccount = doccount-1
 Wend
 Exit Sub
    ErrorCleanup: 
     Call sendErrorEmail(db,doc.GetItemValue("From")(0))
     Call doc.PutInFolder(notesErrorOutputFolder)
     Call doc.RemoveFromFolder(notesInputFolder)
    End Sub

更新 显然 32KB 问题并不一致 - 到目前为止,它只是一个在 32K 之后开始获得额外回车的文档。

4

3 回答 3

3

关于 32Kb 的东西,而不是这个:

Set bodyRichText = doc.GetFirstItem( "Body" )

...您可能需要考虑迭代电子邮件文档中的所有“正文”字段。在处理大量富文本时,Domino 将所说的内容“分块”成多个富文本字段。检查您正在处理的一些文档:当您查看文档属性时,您可能会看到“正文”字段的多个实例。

于 2010-02-19T17:05:41.877 回答
2

我不确定是什么导致了 32K 错误,但我知道 Lotus Notes 中 32K 或 64K 的顺序有很多限制,所以也许您遇到了其中之一。我无法想象什么会增加额外的 CR/LF。也许您可以尝试在 NotesRichTextItem 类上使用 GetFormattedText 方法,看看效果是否更好?

它更复杂,但您也可以使用 NotesRichTextNavigator 类来遍历备忘录中的所有段落,一次输出一个。以这种方式分解输出可能会消除 CR/LF 问题。

最后,我总是建议使用 Midas 的 LSX 来处理 Lotus Notes 中的富文本。他们出售一个插件,可以让您更好地控制富文本字段。

至于最佳实践,当我阅读您的代码时,我想到的是循环结构。获取视图中的第一个文档,处理它,然后获取下一个文档并检查它是否等于 Nothing,效率更高。这将循环设置为按索引顺序遍历视图,并且无需每次都搜索索引以查找第 N 个文档。它还使您免于维护计数器。要点如下:

Set doc = curview.GetFirstDocument()
While Not (doc Is Nothing)

    'Do processing here...

    Set doc = curview.GetNextDocument(doc)
Wend
于 2010-02-18T18:58:36.710 回答
1

外部电子邮件很可能以 MIME 形式出现。因此,您可以检查 document.hasMime,然后使用 mime 类来获取内容。那么你没有64k的限制。示例在帮助中 - 如果您需要代码,请回复。

于 2010-03-16T13:34:55.387 回答