1

Тема: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Хочу программно на лотус-скрипт (LotusScript) прикреплять в поле файлы, но чтобы при этом не исчезала иконка.
Для этого попробовать использовать класс NotesMIMEEntity (Multipurpose Internet Mail Extensions - многоцелевое расширение интерне почты)


MIME - это API-объект, который позволяет читать, изменять, создавать и удалять MIME-содержимое внутри письма или любого документа, где поле хранится в MIME-формате.

doc.CreateMIMEEntity("Body") — создаёт MIME-представление в поле Body вместо RichTextItem.
Заголовки (Content-Type, Content-Disposition, Content-Transfer-Encoding) задаются вручную.


multipart/mixed              ← Корневой MIME-узел (письмо целиком)

├─ multipart/alternative     ← Варианты отображения тела письма
│  ├─ text/plain              ← Версия письма в чистом тексте (на случай старых клиентов)
│  └─ text/html               ← HTML-версия письма (ссылки на картинки через CID)

├─ multipart/related          ← Блок HTML + встроенные картинки
│  ├─ text/html               ← HTML-код письма
│  ├─ image/png (Content-ID: <img1>) ← Встроенная картинка
│  └─ image/jpeg (Content-ID: <img2>)← Ещё картинка

└─ application/pdf            ← Обычное вложение (файл.pdf)


Каждый блок MIME (multipart/…, text/html, application/pdf) — это отдельный объект NotesMIMEEntity.
У каждого есть заголовки (NotesMIMEHeader) и тело (данные в NotesStream).
Чтобы пройти по всей структуре, используют:
.GetFirstChildEntity — первый "вложенный" MIME-блок
.GetNextSiblingEntity — соседний MIME-блок
.GetParentEntity — родительский блок.


Хочу вложить файл в поле attach через MIMEEntity:

Примерный код, кнопка test1.

 

Sub Click(Source As Button)
    Sub Click(Source As Button)
    On Error Goto ErrH
    
    Dim ses As New NotesSession, ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim uidoc As NotesUIDocument
    
    ses.ConvertMIME = False
    Set db = ses.Currentdatabase
    Set doc = ws.CurrentDocument.Document
    Set uidoc=ws.CurrentDocument
    
    Dim body As NotesMIMEEntity, header As NotesMIMEHeader ,  child As NotesMIMEEntity  '  body  child  неисп пока
    
    Dim mime As NotesMIMEEntity
    Set mime = doc.CreateMIMEEntity("attach")
    
    Set header = mime.CreateHeader("Content-Type")    '   создали хедер штмл
    Call header.SetHeaderVal("application/vnd.ms-excel")
    Call header.SetHeaderValAndParams({multipart/alternative;charset="UTF-8"})
    
' Открываем файл
    Dim Stream As NotesStream
    Set Stream = ses.Createstream()
    Call Stream.Open("С:/Temp/excel.xlsx", "UTF-8") 
    
' Записываем содержимое в MIMEEntity
    Call mime.SetContentFromBytes(Stream, "application/vnd.ms-excel", ENC_BASE64)
    
 ' Сохраняем документ
    Call doc.Save(True, False)
    
    ses.ConvertMIME = True
    Call Stream.Close()
    
    Call uidoc.Close
    Call ws.EditDocument(True, doc)  '  False - чтение
    
    Exit Sub
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Но!
Set mime = doc.CreateMIMEEntity("attach")
не работает, так как в документе уже есть такое поле, на форме например.

Поделиться

2

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

doc.Save уничтожает mime объект, как и написано в документации.
В коде есть Set mime = doc.CreateMIMEEntity("attach")
и поле attach - вообще нету ни в uidoc  ни в doc.

При этом после сохранения дока -     Call doc.Save(True, False)
у дока появляется поле "Body" с MIME содержимым - но отображается на форме  как пустое.

Post's attachments

Mime.JPG, 80.65 kb, 934 x 675
Mime.JPG 80.65 kb, 10 downloads since 2025-08-12 

Поделиться

3

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Эксперименты с NotesMIMEEntity в УИ интерфейсе юзера.
Вот еще пытаюсь просто текст засунуть в поле - по идее в боди (на форме есть это поле с параметром хранить штмл как миме)

Sub Click(Source As Button)
    On Error Goto ErrH
    Dim uidoc As NotesUIDocument
    Dim ses As New NotesSession, ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set uidoc =ws.CurrentDocument
    Set doc =uidoc.Document
    Dim html As Variant
    ses.convertmime=False
    Dim stream As NotesStream
    Set stream = ses.CreateStream
    Call stream.WriteText("ПРИМЕР <b>как можно</b> использовать <font color=red>HTML</font>")
    Dim mime As NotesMIMEEntity
    Set mime = doc.CreateMIMEEntity
    Dim header As NotesMIMEHeader
    Set header = mime.CreateHeader("headermime")
    Call header.SetHeaderVal("text Header")
    Call mime.SetContentFromText (stream, "text/plain;charset=UTF-8", ENC_BASE64)
    
    
    Call doc.Save(True, True)
    doc.body2= doc.body
    
    ses.ConvertMIME = True
    Call Stream.Close()
    
    Exit Sub
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub

Поделиться

4

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Пока что получается создать поле Body, оно и по умолчанию будет при вызове doc.CreateMIMEEntity()
и закопировать его содержимое в Body2.
Но на форме не отображается корректно, в свойствах дока у поля - есть миме контент.


Sub Click(Source As Button)
    On Error Goto ErrH
    Dim uidoc As NotesUIDocument
    Dim ses As New NotesSession, ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set uidoc =ws.CurrentDocument
    Set doc =uidoc.Document
    
    Call uidoc.Close
    
    Dim html As Variant
    ses.convertmime=False
    Dim stream As NotesStream
    Set stream = ses.CreateStream
    Call stream.WriteText("ПРИМЕР <b>как можно</b> использовать <font color=red>HTML</font>")
    Dim mime As NotesMIMEEntity
    Set mime = doc.CreateMIMEEntity("Body")
    Dim header As NotesMIMEHeader
    Set header = mime.CreateHeader("headermime")
    Call header.SetHeaderVal("text Header")
    Call mime.SetContentFromText (stream, "text/plain;charset=UTF-8", ENC_BASE64)
    Call doc.Save(True, True)
    ses.ConvertMIME = True
    Call Stream.Close()
    doc.body2= doc.Body
    doc.RemoveItem("Body")
    Call doc.Save(True, True    )
    
    'Call ws.EditDocument(True, doc)  '  False - чтение
    Print "OK"
    Exit Sub
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Поделиться

5

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Вот рабочий код на собаках, ратает с псевдонимом прикрепленных файлов, цепляет переименованный файл в поле Body2.

vAttachList := @AttachmentNames;

vStop := @If(@Attachments=0;"1";"0");

@If(vStop="0";

@Do(vSourceName:=@If(@Attachments>1; @Prompt([OkCancelList];"Выбрать файл";"Выбор файла для переименования";"";vAttachList);vAttachList);

vNewName:=@Prompt([OkCancelEdit];"Новое имя";"Новое имя";vSourceName);
vNewName:="C:\\XML\\" + vNewName;

@Command([EditDetach];vSourceName; vNewName);



@Command([EditGotoField];"Body2");
@Command([EditInsertFileAttachment] ; vNewName ; "1")
);


@Prompt([Ok];"Action - File rename - cancelled!";"The document does not contain any attachments!"))

Поделиться

6

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Такой лотус скрипт выдает ошибку на result =.
EditInsertFileAttachment  - Прикрепляет файл к документу.
Evaluate-  вызов альфа команд с лотус скрипта.

Dim result As Variant
    Call uidoc.GoToField("Body2")
    Macro$ = " @Command ( [EditInsertFileAttachment ] ) "
    result = Evaluate(Macro$, doc)
    Print "OK"
    Exit Sub

Поделиться

7

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Этот код на лотус скрипте создает временный документ docR , в него с помощью миме крепится файл excel.xlsx
и потом этот файл копируется в основной документ в поле Body.
Но проблема - во временном документе крепиться только иконочка экселя, 0 байт.

Sub Click(Source As Button)
    On Error Goto ErrH
    Dim uidoc As NotesUIDocument
    Dim session As New NotesSession, ws As New NotesUIWorkspace, CurDataBase As NotesDataBase
    Dim doc As NotesDocument
    Set uidoc =ws.CurrentDocument
    Set doc =uidoc.Document
    Set CurDataBase=session.CurrentDataBase
    
    Dim docR As NotesDocument'документ TMP'
    Set docR = New NotesDocument( CurDataBase ) ' создали новый док в базе роутер
    docR.Form="outgoing"
    docR.header ="TEST TMP"
    docR.adresed = "1"
    docR.isp = "1"
    
    session.ConvertMIME = False
    Dim streamIn As NotesStream
    Set streamIn =  session.CreateStream 
    Call streamIn.Open("C:\XML\excel.xlsx",  "UTF-8")
    Call streamIn.Truncate
    
    Dim body As NotesMIMEEntity, header As NotesMIMEHeader ,  child As NotesMIMEEntity
    Set body = docR.CreateMIMEEntity("Body")
    Set header = body.CreateHeader("Content-Type")
    Call header.SetHeaderValAndParams({multipart/alternative;charset="UTF-8"})
    Set child = body.createChildEntity() 'ChildEntities are containers
    
    Set header = child.CreateHeader("Content-Type")
    Call header.SetHeaderVal("vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    
    Set header = child.CreateHeader("Content-Disposition")
    Call header.SetHeaderVal("attachment; filename=excel.xlsx")
    
    
    Set header = child.CreateHeader("Content-ID")
    Call header.SetHeaderVal("excel.xlsx")
    
    Call child.SetContentFromBytes(streamIn, "attachment; filename=excel.xlsx", ENC_BASE64)
    
    'Call child.setContentFromText(streamIn, {"application/octet-stream"}, ENC_IDENTITY_BINARY)     ENC_BASE64   ENC_EXTENSION    ENC_NONE
    
    
    Call docR.Save(True, True    )
    Call streamIn.Close()
    Call docR.Closemimeentities(True)
    
    
    Call ws.EditDocument(True, docR)  '  False - чтение
    Print "OK"
    
    'Dim ftuidoc As NotesUIDocument
    'Set ftuidoc = ws.EditDocument( True, docR , True ,  , True, False )
    'Call ftuidoc.GoToField( "Body" )
    'Call ftuidoc.SelectAll
    'Call ftuidoc.Copy
    'Call ftuidoc.Close(True)
    
    'Call uidoc.GoToField( "Body" )    
    'Call uidoc.Paste
    'Call uidoc.Refresh    
    
    'Call ftuidoc.Close
    
    Print "USE"
    
    Exit Sub
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Поделиться

8

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Кнопка 1 - лотус скрипт.  вызывается с javascript кнопка 2.  При этом лоусскрипт не ждет окончания яваскрипта.

Sub Click(Source As Button)
    On Error Goto ErrH
    Dim uidoc As NotesUIDocument
    Dim ses As New NotesSession, ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Set uidoc =ws.CurrentDocument
    Set doc =uidoc.Document
    
    Call ses.SetEnvironmentVar( "OutFiles", "C:\\XML\\exel.xlsx" )
    Call ws.URLOpen( "javascript: document.forms[0].testkn.click();" )

    Print "ОК"
    Exit Sub
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Кнопка 2 - альфа команды.  EditInsertFileAttachment крепит  файл "C:\XML\excel.xlsx" . В свойствах кнопки в нейм пишем "testkn" - имя.

Files := @Text(@Environment("OutFiles"));
@Prompt([Ok];"OutFiles"; @Text( Files ) );
@Command([EditGotoField];"Body2");
@Command([EditInsertFileAttachment] ; Files )

Поделиться

9

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Попытка использовать агент, вместо вызова кнопки с альфа-командой не увенчалась успехом.
Агент с панельки клиента отрабатывает, а с лотус-скрипта - не запускается.

            Call session .SetEnvironmentVar( "OutFiles", datapatch$ & new_nameobj )
                '    Call ws.URLOpen( "javascript: document.forms[0].testkn.click();" )
                Dim agent As NotesAgent    
                Set agent = db.GetAgent("test2")
                If agent.Run = 0 Then
                    Print "agent  ОК"
                Else
                    Print "agent  ОШИБКА."
                End If

Агент test2, но у агентов не отрабатывает @Command в УИ.

Files := @Text(@Environment("OutFiles"));
@Prompt([Ok];"OutFiles"; @Text( Files ) );
@Command([EditGotoField];"Body2");
@Command([EditInsertFileAttachment] ; Files );
@Command([Execute]; "cmd.exe"; "/C  del " + Files);

Поделиться

10

Re: Программное прикрепление файла с иконкой в рич поле на LotusScript.

Вот итоговый рабочий код, когда лотус-скриптом для прикрепления файла дергаем ява-скриптом скрытую кнопку с альфа командами + cmd для удаления файла с диска:

Sub Click(Source As Button)
    On Error Goto ErrH
    Dim session As New NotesSession, ws As New NotesUIWorkspace, db As NotesDatabase, sview As NotesView, dc As NotesDocumentCollection
    Dim uidoc As NotesUIDocument, doc As NotesDocument, templdoc As NotesDocument, DocTemp As NotesDocument
    Dim picklist As Variant, mes As String
    Dim rtitem As NotesRichTextItem
    Dim rtitem2 As NotesRichTextItem
    Dim Name_Stncl_List()  As Variant, Name_Stncl_List_matr() As Variant  ' все имена вложений
    
    Set doc = ws.CurrentDocument.Document
    Set uidoc=ws.CurrentDocument
    Call uidoc.save
    
    Set rtitem = doc.GetFirstItem("attach")
    
    Dim xxxx As  Integer
    i=0
    If ( rtitem.Type = RICHTEXT ) Then 
        If Not Isempty(rtitem.EmbeddedObjects) Then  
            Forall obj In rtitem.EmbeddedObjects
                If obj.Type = EMBED_ATTACHMENT Then   ' шаг 1 имена вложений в массив
                    If obj.FileSize=0 Then
                        xxxx =     Messagebox     ({"Приложение:  } & obj.Source & { имеет размер 0 байт.} & Chr(13) & Chr(13)   & {Удалить?"}, 1 , "Удаление нулевого вложения." ) 
                        If xxxx = 1 Then
                            doc.history= Cstr(Now)   + " "+ session.CommonUserName + " удалено приложение размером 0 байт ("  + obj.Source + ") "   &Chr(13) & " "&Chr(13) &  doc.history(0)
                            Call  obj.Remove
                            doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
                            Call doc.save (True,False)
                            Call uidoc.Close
                            Call ws.EditDocument(True, doc)  '  False - чтение
                            Exit Sub
                        End If
                        
                    Else
                        Redim Preserve Name_Stncl_List(i)        
                        Name_Stncl_List(i)=    obj.Source    &  {|}&   obj.Name '    в Name_Stncl_List вносим имена вложений (Source) и   альясы (Name)
                        
                        i=i+1
                    End If
                End If                
            End Forall
        End If
    End If        
    
    If i>0 Then        'есть  хоть одно вложение в поле атач
        Set DocTemp = doc.ParentDatabase.CreateDocument
        DocTemp.ReplaceItemValue  "Name_ListAttach", Name_Stncl_List   ' скрытое поле Name_ListAttach на диалог формне с  Source   |  Name
        
        If Not    ws.DialogBox("ChooseDlg",True,True,False,False,False,False,"Переименовать ",doctemp, True) Then Exit Sub
        
        nameobj2 =  doctemp.ListAttach(0)
        Print "---"
        Print nameobj2         '  псевдоним Name
    End If
    
    datapatch$ = "C:\XML\"
    If  Dir$ (datapatch$ ,16 )="" Then 
        Mkdir datapatch$
    End If
    
    i=1 
    Forall obj In rtitem.EmbeddedObjects
        If obj.Name = nameobj2  Then   ' nameobj2 - ямя выбранного вложения (псевдоним)
            Dim object3 As NotesEmbeddedObject
            Set object3 =     rtitem.GetEmbeddedObject(nameobj2)
            Print "object3.Source " object3.Source
            new_nameobj=Trim(Inputbox$("Введите новое имя приложения "  & i ,"Ввод названия приложения",Strleftback(object3.Source,".")   ))       '  строка слева от первой точки ( без расширения)
            If new_nameobj="" Then Exit Sub
            
            new_nameobj = new_nameobj & "." & Strrightback (object3.Source,".")    '   имя + расширение файла
            
            If new_nameobj<>nameobj2 Then   '  надо переименовать
                Call obj.ExtractFile( datapatch$ & nameobj2) 
                Name datapatch$ & nameobj2   As  datapatch$ & new_nameobj   '  переименовать файл nameobj на диске в new_nameobj
                'Call rtitem.EmbedObject ( EMBED_ATTACHMENT, "", datapatch$ & new_nameobj)
                Call session .SetEnvironmentVar( "OutFiles", datapatch$ & new_nameobj )
                Call ws.URLOpen( "javascript: document.forms[0].testkn.click();" )
                
                Call  obj.Remove
                Call uidoc.Refresh
            '    Kill  datapatch$ & new_nameobj
            End If
            
        End If
        i=i+1 
    End Forall
    
    Call    doc.Save(1,0)
    Print "Сохранили."
    doc.history= Cstr(Now)      + " "+  session.CommonUserName + " переименовано  приложение ("  + new_nameobj  + ") "   &Chr(13) & " "&Chr(13) &  doc.history(0)
    
    doc.ReplaceItemValue({SaveOptions},{0}).SaveToDisk=False
    Call doc.save (True,False)
    Call uidoc.Close
    Call ws.EditDocument(True, doc)  '  False - чтение
    
    
    Exit Sub
    
ErrH:
    Print "Ошибка " & Error(Err) & " в строке " & Erl    
    Exit Sub
End Sub

Скрытая кнопка testkn, во вкладке кнопки HTML/Name - "testkn"

Files := @Text(@Environment("OutFiles"));
@Command([EditGotoField];"attach");
@Command([EditInsertFileAttachment] ; Files );
@Command([Execute]; "cmd.exe"; "/C  del " + Files)

Поделиться