我正在设置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之后开始获得额外的回车。
答案 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的限制。样本在帮助中 - 或者如果您想要代码则回复。