Lotus Notes - 将电子邮件导出为纯文本文件

时间:2010-02-18 18:21:43

标签: lotus-notes lotusscript

我正在设置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之后开始获得额外的回车。

3 个答案:

答案 0 :(得分:3)

关于32Kb的事情,而不是:

Set bodyRichText = doc.GetFirstItem( "Body" )

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

答案 1 :(得分: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

答案 2 :(得分:1)

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