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

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

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

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

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

печать документов из вида

  • Автор темы deeeman
  • Дата начала
D

deeeman

Привет!

Есть вид в почтовой бд "Входящие". В клиенте по кнопке из этого вида делается обработка коллекции имеющихся в этой папке документов и выводиться на печать документы и аттачи (если есть). одним разом нужно обработать все документы.

Затор в том, что при перебирании документов, иногда у скрипка сносит крышу и он посылает на печать не те документы.

Решал:
-дополнительными задержками (тупо цикл по всем документам базы с сохранением)
-через таймер, по 5 документов посылаю через 5 секунд

не решает проблему, она возникает непонятно от куда, закономерности нет, выводит на печать левое.

код такой:

Код:
flagP = False
Set doc = uiDoc.Document
Set doc = view.GetFirstDocument
While Not doc Is Nothing

'отправляем в другую папку
Set doc1 = db.getDocumentbyUNID(id)
If doc1 Is Nothing Then
If flagP Then
Call doc1.PutInFolder("Распечатанные")
Else
Call doc1.PutInFolder("Не распечатанные")
End If
Call doc1.RemoveFromFolder("($Inbox)")
End If

flagP = False

if (выполнены условия) then

'ставим флаг что печатаем
flagP = True

Set uidoc = ws.EditDocument(True,doc,True)

Call StopF()

Call uiDoc.Print(1)

Call StopF()

uidoc.Close True		


Call StopF()

'печатаем вложения .doc  если есть

'если не выполнены условия
Else
'что то делаем
End If		

'запоминаем документ
id = doc.UniversalID

Set doc = view.GetNextDocument(doc)
Wend
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
А что если не открывать каждый документ и сделать так:
Код:
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim doc As NotesDocument

Set uiview = ws.CurrentView
Set doc = uiview.View.GetFirstDocument()
Do Until (doc Is Nothing)
Call uiview.SelectDocument(doc)
Call uiview.Print(1)

Set doc = uiview.View.GetNextDocument(doc)
Loop

Можно было бы выделить все документы и обойтись без Call uiview.SelectDocument(doc)
 
H

hosm

странно это как-то)
If doc1 Is Nothing Then
...
Call doc1.PutInFolder("Распечатанные")
и т.д.


Добавлено: и это
Set doc = uiDoc.Document Set doc = view.GetFirstDocument

'запоминаем документ
id = doc.UniversalID
Set doc = view.GetNextDocument(doc)
получается, последний документ коллекции не попадает в нужную папку???
 
D

deeeman

Medevic

Код:
 Call uiview.SelectDocument(doc)
Call uiview.Print(1)

за это спс! но дело наверное не в этом...

OKEN
>получается, последний документ коллекции не попадает в нужную папку???

спасибо! Но фиг с ним с последним.. дело в другом...


Такая мура твориться в базе:
я тут нашел документ в котором есть аттач но в папке "Входящие" он не отображен как документ с аттачем(не показыватеся значек скрепка.)
у него есть поле $File

далее проверяю его скриптом,

-Если этот документ в виде один, то скрипт видит аттач (методы: Evaluate({@AttachmentNames},doc) и doc.HasEmbedded работают )
-Если в виде несколько документов и этот документ первый то все ок
-Если в виде несколько документов и этот документ НЕ первый то все печально! методы показывают что нет там ничего аттачного...

как быть?
 
H

hosm

мб какие-то проблемы именно с кодом, не тот doc в последнем случае получаете (если обработка ошибок есть какая-то или переходы по меткам)? Или, может, при открытии документа теряется аттач?
возможно это связанно с проверками, которые вы не указали, но я думаю, что можно перекидывать в папку (кусок 'отправляем в другую папку) сразу после получения следующего док-та из папки, перед концом цикла Wend? или сразу получать следующий док-т и перекидывать текущий doc...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
скрепка не будет отображаться на письмах с майм вложениями (индусы не знали об этом :) )
link removed
вот это может помочь
аттачнэм нужен с (0)
 
D

deeeman

lmike

странно но это не помогло... все методы перечисленные ниже показывают пусто, хотя аттач явно есть в документе. и поле $File не пусто и еще название аттача прописывается в самом конце поля Body

doc.HasEmbedded
res = Evaluate({@AttachmentNames(0)},doc)
doc.GetItemValue("$File")(0)

Даже когда документ 1 в папке

код:

Код:
Set doc = view.GetFirstDocument
While Not doc Is Nothing

res = Evaluate({@AttachmentNames(0)},doc)

Msgbox "doc.HasEmbedded=" & doc.HasEmbedded

Msgbox "$File=" & doc.GetItemValue("$File")(0)

Msgbox "Join(res)=" & Join(res)

'Нет аттачей
If Join(res) = "" Then
Msgbox "Нет аттачей"
End If		

Set doc = view.GetNextDocument(doc)

Wend
 
D

deeeman

Причем, получается такая фишка с документом:

если смотреть свойства полей из вида, то поля $File нет, если документ открыть то поле появляется. (и если документ пересохранить вручную то аттач будет нормальный)
т е по видимому документ приходит из вне в каком то непонятном для лотуса виде, и аттач не виден.

как можно это победить? пробовал сделать:

Код:
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,True)

но документ не хотит пересохраняться скриптом.
как можно превратить его в нормальный вид?
 
D

deeeman

товарисчи!

как определить что письмо типа майм?
есть какое то отличие от обычного письма??

еще когда его открываю появляется сообщение в логе:
Begin MIME to CD Conversion (Process: ? (00000E04:00000002), Database: ***.nsf, Note: 00017D62)

скрипт упорно не видит у них аттачи, приходиться открывать их в uiDoc и пересохранять(скриптом.все мелькает)... но это идиотизм... ИМХО
 
N

nvyush

deeeman Может тут что полезное найдётся:
link removed
 
D

deeeman

Мыш

поле боди содержит 4 куска текста см ниже:

Field Name: Body
Data Type: MIME Part
Data Length: 148 bytes
Seq Num: 1
Dup Item ID: 4
Field Flags: SIGN SEAL

"Content-Type: multipart/mixed;
boundary="------------050605060400090104000808"

This is a multi-part message in MIME format."


но скриптом то это не видно... а надо бы увидеть хотя бы. как мне определить скриптом, что именно этот документ содержит майм и его надо конвертнуть?


nvy

т е нужно просто все документы конвертнуть в рт? а не пофигачиться ли при этом часть инфы?
стили уже пофигачились... без этого никак? можно как то отобрать те документы которые нужно конвертить? чтобы минимизировать потери...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 927
608
BIT
150
ну яж грил - маймы, для индусов, это что-то... ;)
мобуть сделать скрипт, кот. будет дергать из маймов аттачи...?
 
D

deeeman

Господа!

помог этот волшебный код: ( link removed)
спс nvy и автор кода: ToxaRat


Код:
Function ConvertRTDoc(Doc As NotesDocument) As String ' Конверт Mime в РТ
'	ses.ConvertMIME = False
Dim mime As NotesMIMEEntity, v1 As Variant
Set mime = doc.GetMIMEEntity
v1 = ""
If Not(mime Is Nothing) Then
Call mime.DecodeContent
v1 = mime.ContentAsText
End If
If Len(v1)>64000 Then v1 = Left(v1, 64000)
Let Doc.ReplaceItemValue("Body2", v1).Issummary = False
ConvertRTDoc = v1
'	ses.ConvertMIME = True
End Function


им можно конвертить все подряд, хоть и есть потери стиля и значков аттачей, переживут, но зато документ превращается хоть во что то родное =))
 
Мы в соцсетях:

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