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, 4 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();" )


    'Call uidoc.GoToField("Body2")
    'Macro$ = { @Command ( [EditInsertFileAttachment ], "C:\\XML\\exel.xlsx" ) }
    'result = Evaluate(Macro$, doc)
    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 )

Поделиться