2010-02-18 116 views
2

我正在設置Lotus Notes帳戶以接受來自客戶端的電子郵件,並自動將每封電子郵件另存爲純文本文件以供其他應用程序處理。Lotus Notes - 將電子郵件導出爲純文本文件

因此,我試圖在Lotus中創建我的第一個Agent,以自動將電子郵件導出爲文本。

有沒有一個標準的,最佳實踐的方式來做到這一點?

我創建了一個幾乎可以工作的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獲得額外的回車。

回答

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 
+0

謝謝你。順便說一下,你有沒有遇到過一個在線示例腳本來保存電子郵件到文本文件?我發現的所有示例都涉及將附件保存到文件,而不是電子郵件的正文。 – mbeckish 2010-02-18 20:19:16

+0

我沒有,但我只是做了一個快速搜索,發現了幾個例子。一個看起來像使用Notes的DXL功能:http://tech.niques.info/projects/lotus-notes-email-export/另一個是用Perl編寫的,但可能有一些邏輯可以提取http:// www.perlmonks.org/?node_id=136382 – 2010-02-19 14:34:06

3

至於32kB的事情,而不是這樣的:

Set bodyRichText = doc.GetFirstItem("Body") 

...你可能要考慮的電子郵件文檔中遍歷所有「身體」領域。處理大量富文本時,Domino「塊」將內容說成多個富文本字段。檢查一下您正在處理的文檔:查看文檔屬性時,您可能會看到「正文」字段的多個實例。

+0

謝謝本 - 我會檢查出來的。 – mbeckish 2010-02-19 19:12:07

1

外部電子郵件很可能以MIME形式出現。所以你可以檢查document.hasMime,然後使用MIME類來獲取內容。那麼你沒有64k的限制。示例在幫助中 - 或者如果您需要代碼,請回復。

相關問題