• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Vbscript: Обработка непрочитанных сообщений с вложениями

  • Автор темы lsv
  • Дата начала
L

lsv

Доброго времени суток.

Есть скрипт по обработке сообщений на сохранение вложений с опредлённым расширением и автоматическим ответом отправителю. В скрипте есть метод Call doc.Save( False, True, True ) для того, что бы обработанные сообщения помечались прочитанными, но сделать, что бы скрипт обрабатывал только не прочитанные не удаётся. Буду благодарен за помощь в этом вопросе.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">код</div></div><div class="sp-body"><div class="sp-content">
Код:
Dim Session 
Dim Maildb 
Dim vw 
Dim doc 
Dim Item 
Dim x 
Set Session = CreateObject("Lotus.NotesSession") 
Call Session.Initialize("password") 
Set Maildb = Session.GetDatabase("SERVER", "mail.nsf") 
If Not Maildb.IsOpen = True Then 
Call Maildb.Open 
End If 
Set vw = Maildb.GetView("($inbox)") 
With vw 
x = 0 
ReDim LmailID(x) 
ReDim HasAttach(x) 
Set doc = .GetFirstDocument 
Set Item = doc.GetFirstItem("Body") 
Do 
If Item.Type = RICHTEXT Then - это проверка на непрочитанное сообщение
fileNames = Session.Evaluate("@AttachmentNames", doc) 
For Each Filename In fileNames 
If Filename <> "" Then 
If Right(Filename, 3) = "bch" Then
Call doc.Save( False, True, True )
Set NotesEmbeddedObject = doc.GetAttachment(Filename) 
NotesEmbeddedObject.ExtractFile ("C:\" + Filename) 
Set reply = doc.CreateReplyMessage( False )
Call reply.replaceItemValue("Subject", "DONE" + subject)
Call reply.Send( False )
Set nextDoc = .GetNextDocument(doc)
Set doc = nextDoc
End If 
End If 
Next 
End If
x = x + 1 
ReDim Preserve LmailID(x) 
Set doc = .GetNextDocument(doc) 
Wscript.Sleep 500 
Loop Until doc Is Nothing 
End With 
Set Session = Nothing 
Set vw = Nothing 
Set doc = Nothing 
Set Item = Nothing 
Set Maildb = Nothing
 
M

Mitya

... что бы скрипт обрабатывал только не прочитанные ...

Код:
Dim session As New NotesSession
Dim dbCur As NotesDatabase
Dim coll As NotesDocumentCollection

Set dbCur = session.CurrentDatabase ' ссылка на текущую БД
Set coll = dbCur.GetAllUnreadDocuments ' коллекция непрочтенных док для текущего пользователя

GetAllUnreadDocuments - >

P.S. Сейчас тебе VladSh ввалит "минусов", и за spoiler, и за тему :)
 
L

lsv

Код:
Dim session As New NotesSession
Dim dbCur As NotesDatabase
Dim coll As NotesDocumentCollection

Set dbCur = session.CurrentDatabase ' ссылка на текущую БД
Set coll = dbCur.GetAllUnreadDocuments ' коллекция непрочтенных док для текущего пользователя

GetAllUnreadDocuments - >

P.S. Сейчас тебе VladSh ввалит "минусов", и за spoiler, и за тему :D
скрипт написан на основе лотус скрипта.
к сожалению, я не большой специалист по написанию программ, поэтому и обращаюсь за помощью.
GetAllUnreadDocuments - этот метод я тоже пытался использовать: "Object doesnt support this property or method 'GetAllUnreadDocuments '"
Во-вторых, в vbscript "As" в "Dim" не используется.
 
D

divankin

А почему через OLE? Просто не знаете как правильно?
Ваша задача касается только одной почтовой базы или всех баз пользователей?

Ниже рассказываю вариант, предполагающий, что с административной точки зрения вам разрешено, то что вы хотите сделать :D
В Лотусе есть свой собственный язык, похожий на VB. Он называется LotusScript. Программирование на нем осуществляется в Lotus Domino Designer. Вам нужно его установить, если его нет.

Открываете почтовую базу в Lotus Domino Designer.
Создаете нового агента.
В свойствах агента указываете, что он запускается по событию After new mail has arrived
Переносите в агента свой код.
Даете тип в Dim переменным.
Код
Код:
Set Session = CreateObject("Lotus.NotesSession") 
Call Session.Initialize("password") 
Set Maildb = Session.GetDatabase("SERVER", "mail.nsf") 
If Not Maildb.IsOpen = True Then 
Call Maildb.Open 
End If 
Set vw = Maildb.GetView("($inbox)") 
With vw
Заменяете на
Код:
Dim newDocCol as NotesDocumentCollection
set Session = new NotesSession
set mailDb = Session.CurrentDatabase
set newDocCol = mailDb.UnprocessedDocuments ' отобрали все новые документы
With newDocCol
Также рекомендуется после обработкой документа в какое-нибудь поле сохранять признак обработки, а перед обработкой наличие этого признака проверять, ибо случается, что при следующем запуске документ опять попал в коллекцию новопришедших.

Теперь о правах: вам нужно к почтовой базе иметь права Designer или Manager. Также вам нужно иметь разрешение на запуск агентов на сервере. Если администратор отказывается дать вам такие права, то он должен будет подписать агента
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
хм... lsv у вас стороннее приложение на VB.NET ?
посмотрите эту ссылку:
 
L

lsv

хм... lsv у вас стороннее приложение на VB.NET ?
посмотрите эту ссылку:
у меня обычный .vbs скрипт. отправка сообщений в скрипте успешно работает. спасибо за ссылку.

есть др. проблема: у меня в Lotus подключено два ящика. Когда я посылаю писмо с вложением сам на себя (в скрипте прописываю сервер и nsf первого пользователя) - autoreply срабатывает. Если от первого пользователя на второго, со второго autoreply не срабатывает (при этом в скрипте прописываю сервер и nsf второго пользователя, т.к. ответ на первого пользователя должен идти от второго):
Notes error: You cannot update or delete the document(s) since you are not listed as an allowable Author for this document.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Это значит второй пользователь не автор для письма...
Скрипты отправки писем посмотреть можно?
 
L

lsv

А почему через OLE? Просто не знаете как правильно?
С vbs и groovy скриптами отдалённо знаком. С LotusScript и Domino Designer нет. В работе понадобилось оптимизировать процесс, поэтому пытаюсь применить знания.
Ваша задача касается только одной почтовой базы или всех баз пользователей?
Мне создали два почтовых ящика: один - это моя рабочая почта, второй - это специальный ящик на который будут приходить письма с вложениями и именно этот ящик должен обрабатывать мой скрипт.

Ниже рассказываю вариант, предполагающий, что с административной точки зрения вам разрешено, то что вы хотите сделать :D
В Лотусе есть свой собственный язык, похожий на VB. Он называется LotusScript. Программирование на нем осуществляется в Lotus Domino Designer. Вам нужно его установить, если его нет.
О существовании такого языка я знаю, но боюсь, за любые попытки установки Designer, редактировании своего профиля, создание агента и т.п. меня не похвалят. Банк, однако. Но, права локального админа на ком-ре есть.

Код:
Set Session = CreateObject("Lotus.NotesSession") 
Call Session.Initialize("pass") 
Set Maildb = Session.GetDatabase("server", "user1.nsf") 
Set view = Maildb.UnprocessedDocuments
If Not Maildb.IsOpen = True Then 
Call Maildb.Open 
End If 
With view 
...
Подредактировал скрипт.
Ошибка: Not implemented
Code: 8004112B
Source: NotesDatabase
в строке Set view = Maildb.UnprocessedDocuments

Также рекомендуется после обработкой документа в какое-нибудь поле сохранять признак обработки
это делается методом Call doc.Save( False, False, True ) в скрипте. Обработанное письмо с вложением помечается прочитанным.

а перед обработкой наличие этого признака проверять, ибо случается, что при следующем запуске документ опять попал в коллекцию новопришедших.
поэтому надо использовать метод GetAllUnreadDocuments, но, как я и писал, там ошибка "Object doesnt support this property or method 'GetAllUnreadDocuments'

Теперь о правах: вам нужно к почтовой базе иметь права Designer или Manager. Также вам нужно иметь разрешение на запуск агентов на сервере. Если администратор отказывается дать вам такие права, то он должен будет подписать агента
Как я могу узнать свои права на сервере?

Извините, что задаю так много вопросов, но буду благодарен за любую помощь.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Код:
level% = notesDatabase.CurrentAccessLevel ' вернет цифру
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Что значат цифры</div></div><div class="sp-body"><div class="sp-content">ACLLEVEL_NOACCESS (0)
ACLLEVEL_DEPOSITOR (1)
ACLLEVEL_READER (2)
ACLLEVEL_AUTHOR (3)
ACLLEVEL_EDITOR (4)
ACLLEVEL_DESIGNER (5)
ACLLEVEL_MANAGER (6)

По идее должно вернуть 4
Ссылка поможет немного, хотя бы методы...

Версия лотуса какая?
 
L

lsv

хм... lsv у вас стороннее приложение на VB.NET ?
посмотрите эту ссылку:
весь код скрипта в шапке. на всякий случай:
Код:
'Set reply = doc.CreateReplyMessage( False )
'Call reply.replaceItemValue("Subject", "готово" + subject)
'Call reply.Send( False )
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
Погоди... 2 почтовых ящика. Две учетных записи?
Надо узнать у того, кто ящики заводил: "Какой доступ к ним". По-умолчанию Editor должен быть.
Из клиента это можно проверить так: Правой кнопкой по иконке базы -> Application(Приложение) -> Access Control(список доступа)
Далее ищешь свою учетку и смотришь справа сверху доступ.
 
L

lsv

Погоди... 2 почтовых ящика. Две учетных записи?
Надо узнать у того, кто ящики заводил: "Какой доступ к ним". По-умолчанию Editor должен быть.
Из клиента это можно проверить так: Правой кнопкой по иконке базы -> Application(Приложение) -> Access Control(список доступа)
Далее ищешь свою учетку и смотришь справа сверху доступ.
Access Control - Editor - установлен для только для пользователя имя которго соотвтетсвутет имени файла nsf, оно отлично от первого пользователя
Вручную Reply со второго почтового ящика на первый отправляется


Добавлено:
Код:
level% = notesDatabase.CurrentAccessLevel ' вернет цифру
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Что значат цифры</div></div><div class="sp-body"><div class="sp-content">ACLLEVEL_NOACCESS (0)
ACLLEVEL_DEPOSITOR (1)
ACLLEVEL_READER (2)
ACLLEVEL_AUTHOR (3)
ACLLEVEL_EDITOR (4)
ACLLEVEL_DESIGNER (5)
ACLLEVEL_MANAGER (6)

По идее должно вернуть 4
Ссылка поможет немного, хотя бы методы...

Версия лотуса какая?
8.5
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
"но сделать, что бы скрипт обрабатывал только не прочитанные не удаётся. "
повесить на агент с тригером по приходу почты
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
О существовании такого языка я знаю, но боюсь, за любые попытки установки Designer, редактировании своего профиля, создание агента и т.п. меня не похвалят. Банк, однако. Но, права локального админа на ком-ре есть.
Написать скрипт, объяснить проблему админам, дать им код и попросить, чтобы включили код в шаблон почты. Гарантии, естессно, нет, но это правильный путь.
 
L

lsv

Написать скрипт, объяснить проблему админам, дать им код и попросить, чтобы включили код в шаблон почты. Гарантии, естессно, нет, но это правильный путь.
к сожалению не удалось достучаться до админов. спасибо за рекомендации.
в скрипте так и не удалось реализовать обработку только не прочитанных сообщений, возможна ли реализация такой обработки на основе vbs-скрипта или этот метод будет работать только на LotusScript?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
возможна ли реализация такой обработки на основе vbs-скрипта или этот метод будет работать только на LotusScript?
По идее, если Клиент открыт, то vbs должен отработать также, как и код на LS.
 
L

lsv

По идее, если Клиент открыт, то vbs должен отработать также, как и код на LS.
если на раб. станции lotus не установлен, то способа установить соединение с базой для последующей работы со вложениями нет?
у меня открыт доступ на Design Folder. С помощью данной опции можно настроить правила обработки вложений?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 783
157
BIT
53
если на раб. станции lotus не установлен, то способа установить соединение с базой для последующей работы со вложениями нет?
Есть, по COM, т.е. точно также, как вы и делаете.
Но через COM многие методы не работают. Вернее они изначально не предназначались для работы через COM. В хэлпе по методам смотрите, если там вверху в перечне есть "COM", значит должно работать.

По 2-му предложению ничего не понял.
 
L

lsv

По идее, если Клиент открыт, то vbs должен отработать также, как и код на LS.
если на раб. станции lotus не установлен, то способа установить соединение с базой для последующей работы со вложениями нет?
у меня открыт доступ на Design Folder. С помощью данной опции можно настроить правила обработки вложений?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!