Lotus Notes - Экспорт писем в текстовый файл - PullRequest
2 голосов
/ 18 февраля 2010

Я настраиваю учетную запись Lotus Notes для приема писем от клиента и автоматически сохраняю каждое письмо в виде простого текстового файла для обработки другим приложением.

Итак, я пытаюсь создать самого первого агента в Lotus, который автоматически экспортирует электронные письма в текст.

Существует ли стандартный, передовой метод для этого?

Я создал агент LotusScript, который в значительной степени работает. Тем не менее, есть ошибка - как только размер заметки превышает 32 тыс. Символов, он начинает вставлять дополнительные пары 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

Обновление По-видимому, проблема в 32 КБ не является последовательной - пока это только один документ, который начинает получать дополнительные возвраты каретки после 32 КБ.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Что касается 32Кб, вместо этого:

Set bodyRichText = doc.GetFirstItem( "Body" )

... вы можете рассмотреть возможность итерации всех полей "Body" в документе электронной почты.При работе с большим количеством расширенного текста Domino «разбивает» содержимое на несколько полей расширенного текста.Проверьте некоторые документы, которые вы обрабатываете: вы можете увидеть несколько экземпляров поля «Тело» при просмотре свойств документа.

2 голосов
/ 18 февраля 2010

Я не уверен, что является причиной ошибки 32 КБ, но я знаю, что существует множество ограничений порядка 32 КБ или 64 КБ в Lotus Notes, поэтому, возможно, вы столкнулись с одним из них. Я не могу себе представить, что бы добавить дополнительные CR / LFs. Возможно, вы могли бы попробовать использовать метод GetFormattedText в классе NotesRichTextItem и посмотреть, будет ли он лучше?

Это более сложно, но вы также можете использовать класс NotesRichTextNavigator для перебора всех абзацев в заметке, выводя их по одному за раз. Распределение выходных данных таким образом может устранить проблему CR / LF.

Наконец, я всегда предлагаю Midas LSX для работы с форматированным текстом в Lotus Notes. Они продают надстройку, которая дает вам гораздо больший контроль над полями расширенного текста.

Что касается лучших практик, то, когда я читаю ваш код, мне приходит в голову конструкция цикла. Более эффективно получить первый документ в виде, обработать его, а затем получить следующий документ и проверить, равен ли он Ничему. Это заставляет цикл проходить через представление в порядке индекса и устраняет необходимость поиска в индексе, чтобы каждый раз находить N-й документ. Это также спасает вас от ведения счетчика. Суть заключается в следующем:

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

    'Do processing here...

    Set doc = curview.GetNextDocument(doc)
Wend
1 голос
/ 16 марта 2010

Внешняя электронная почта, скорее всего, приходит как MIME. Таким образом, вы можете проверить document.hasMime, а затем использовать классы mime для доступа к содержимому. Тогда у вас нет ограничения в 64 КБ. Образцы в помощь - или ответьте, если хотите код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...