На работе у меня в качестве системы документооборота используется связка Lotus Domino+Notes, написанная на Java. В основном мне приходится пользоваться ее почтовым клиентом. И возникла потребность автоматизировать довольно рутинную операцию, заключающуюся в том чтобы из последних пришедших от рекламного агентства писем копировать в рабочий каталог почтовые вложения.
Для решения этой задачи программным путем я решил использовать Lotus Script. Это BASIC-подобный язык, довольно хорошо
документированный. После недолгого изучения документации я создал простой Агент (Создание - Агент) и задал ему такие параметры:
Собственно, код:
Sub Initialize
Dim session As NotesSession 'определяем среду текущего скрипта, обеспечивающую доступ к переменным окружения и различной информации
Dim db As NotesDatabase 'определяем базу данных Notes
Dim dc2 As NotesDocumentCollection 'определяем коллекцию документов из базы данных, выбранных с определенным критерием
Dim doc2 As NotesDocument 'определяем документ в базе данных
Dim body As NotesRichTextItem 'определяем объект форматированного RTF текста (тело письма)
Dim rtnav As NotesRichTextNavigator 'определяем объект навигатора по RTF содержимому
Dim att As NotesEmbeddedObject 'определяем встроенный объект для аттачмента
Set session = New NotesSession 'получаем доступ к текущей сессии (поскольку для одного скрипта возможна только одна сессия)
Set db = session.CurrentDatabase 'текущая база данных
REM Ищем все документы со словами тнт, нтв, монтаж, полоса за сегодняшнюю дату
Dim searchFor As String
Dim createDate As Variant
Dim nowDate As Variant
nowDate = Day(Now)
searchFor = "тнт"
Set dc2 = db.FTSearch(searchFor, 0) 'поиск по ключевой фразе среди всех документов
If dc2.count > 0 Then
Call ProcessFoundedDocs(dc2)
End If
searchFor = "нтв"
Set dc2 = db.FTSearch(searchFor, 0) 'поиск по ключевой фразе среди всех документов
If dc2.count > 0 Then
Call ProcessFoundedDocs(dc2)
End If
searchFor = "монтаж"
Set dc2 = db.FTSearch(searchFor, 0) 'поиск по ключевой фразе среди всех документов
If dc2.count > 0 Then
Call ProcessFoundedDocs(dc2)
End If
searchFor = "Полоса"
Set dc2 = db.FTSearch(searchFor, 0) 'поиск по ключевой фразе среди всех документов
If dc2.count > 0 Then
Call ProcessFoundedDocs(dc2)
End If
End Sub
Sub ProcessFoundedDocs(dc2 As notesDocumentCollection)
REM перебираем циклом найденные документы
Dim x As Integer
Dim filepath As String
For x% = 1 To dc2.count
Set doc2 = dc2.GetNthDocument(x%) 'берем N-й документ из коллекции
createDate = Day(doc2.Created) 'получаем дату его создания
If nowDate = createDate Then 'если документ сегодняшний
If doc2.HasEmbedded Then 'если документ имеет вложение
Set body = doc2.GetFirstItem("Body") 'тело документа
Set rtnav = body.CreateNavigator 'создаем объект навигатора по RTF содержимому
REM Получаем вложения
Set att = rtnav.GetFirstElement(RTELEM_TYPE_FILEATTACHMENT) 'первое вложение
filepath$ = "C:\Files\" & att.Source 'определяем куда копировать
Call att.ExtractFile("F:\POLOSA__NEW__\polosa__9\polosa_rtf" & att.Source) 'копируем
Do
Set att = rtnav.GetElement
filepath$ = "F:\POLOSA__NEW__\polosa__9\polosa_rtf" & att.Source 'определяем куда копировать
Call att.ExtractFile(filepath$) 'копируем
Loop While rtnav.FindNextElement(RTELEM_TYPE_FILEATTACHMENT)
End If
End If
Next
End Sub