2

クライアントからの電子メールを受信するように Lotus Notes アカウントを設定しています。各電子メールはプレーン テキスト ファイルとして自動的に保存され、別のアプリケーションで処理されます。

そのため、ロータスで最初のエージェントを作成して、電子メールを自動的にテキストにエクスポートしようとしています。

これを行うための標準的なベストプラクティスの方法はありますか?

ほとんど機能する 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 の後に余分なキャリッジ リターンが発生し始めるのは 1 つのドキュメントだけです。

4

3 に答える 3

3

これの代わりに、32Kbのものに関して:

Set bodyRichText = doc.GetFirstItem( "Body" )

...電子メールドキュメントのすべての「本文」フィールドを繰り返すことを検討することをお勧めします。大量のリッチテキストを処理する場合、Dominoはコンテンツを複数のリッチテキストフィールドに「チャンク」します。処理しているいくつかのドキュメントを確認してください。ドキュメントのプロパティを見ると、「Body」フィールドの複数のインスタンスが表示される場合があります。

于 2010-02-19T17:05:41.877 に答える
2

32K のバグの原因はわかりませんが、Lotus Notes 内で 32K または 64K の順序で多くの制限があることはわかっています。余分な CR/LF を追加するものは想像できません。NotesRichTextItem クラスで GetFormattedText メソッドを使用してみて、うまくいくかどうかを確認してみてはいかがでしょうか。

もっと複雑ですが、NotesRichTextNavigator クラスを使用して、メモのすべての段落を繰り返し処理し、一度に 1 つずつ出力することもできます。このように出力を分割すると、CR/LF の問題が解消される場合があります。

最後に、Lotus Notes でリッチ テキストを処理するには、Midas の LSX を常にお勧めします。彼らは、リッチ テキスト フィールドをより細かく制御できるアドオンを販売しています。

ベスト プラクティスとして、あなたのコードを読んだときに思い浮かぶのは、ループ構造です。ビュー内の最初のドキュメントを取得して処理し、次のドキュメントを取得してそれが 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 に答える