1

Тема: Работа с MIME в Lotus

Есть у  меня кнопка для переименования вложений, которая дергает мою функцию GetEmbedObject - в которой я хочу переименовать вложение с помощью NotesMIMEEntity.

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 Name_Stncl_List()  ' все имена вложений
    
    
    
    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    GetEmbedObject ("attach",   datapatch$ & new_nameobj, doc )
                
            '    Msgbox object.Name 
            '    Call  object.Remove
                Kill  datapatch$ & new_nameobj
            End If
            
        End If
        i=i+1 
    End Forall
    
    Call doc.ComputeWithForm(False, False)
    
    Call    doc.Save(1,0)
    Call uidoc.save
    Print "11."
'    Set rtitem = doc.GetFirstItem("attach")
'    Forall obj In rtitem.EmbeddedObjects
'        Print  object.Source
'        For i = 1 To Len(object.Source)
'            ch = Mid$(object3.Source, i, 1)
'            Print "Символ=" & ch & ",  Код(Asc)=" & Asc(ch)
'        Next    
'    End Forall
    
    
    Print "Сохранили."
'    doc.history= Cstr(Now)      + " "+  session.CommonUserName + " переименовано  приложение ("  + 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

Поделиться

2

Re: Работа с MIME в Lotus

Вот сама функция GetEmbedObject, которая пытается сделать следующее:
в коде - fName2 - это имя файла с путем  к нему на винте, выгрузили на диск в основной кнопке.
docR - временный документ по форме "work form" у которой обязательно наличие поля "Body".


Функции и свойства, которые по факту никак не влияют на работу NotesMIMEEntity, но в документации указаны.
session.ConvertMIME = False

Любая NotesMIME запись состоит из трех заголовков.

Content-Type:  text/plain  текст, image/jpeg - картинка, application/msword -.doc, PDF - application/pdf. multipart/mixed - несколько частей,
application/octet-stream (универсальный бинарный)., application/vnd.openxmlformats-officedocument.wordprocessingml.document, -  DOCX. итд.

Content-Disposition: attachment; filename="file.docx"  работает с АНГЛ файлами!  form-data - используется в HTTP.
Content-Disposition может содержать параметры, чаще всего:
filename Имя файла в простой кодировке (ASCII или quoted-printable).   
пример filename="report.pdf"
filename* RFC 5987 — имя файла в расширенной кодировке (UTF-8, URL-encoded),
пример filename*="UTF-8''%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80.docx"   

Чтобы иконка вложения отображалась — всегда используй attachment!

Content-Transfer-Encoding




Call child.SetContentFromBytes(streamIn, |application/msword; name="| & b64Text$ & |"|, ENC_IDENTITY_BINARY)
параметры
поток / Content-Type / Content-Transfer-Encoding ENC_IDENTITY_BINARY)   ' ENC_IDENTITY_BINARY  ENC_BASE64  ENC_NONE ENC_QUOTED_PRINTABLE


При этом можно указывать
Set header = child.CreateHeader("Content-Type")
Set header = child.CreateHeader("Content-Transfer-Encoding")
Call child.EncodeContent (ENC_BASE64)

но нет смысла, так как эти же заголовки указано в SetContentFromBytes






Function GetEmbedObject(FieldName  As String,    fName As String, doc As NotesDocument)
     ' получаем FieldName - поле на лотус-форме , fName - путь к файлу+ имя файла с расширением
    On Error Goto ErrH    
    Print "Start GetEmbedObject  "  + FieldName  +"  "  + fName 
    Dim session As New NotesSession, ws As New NotesUIWorkspace, CurDataBase As NotesDataBase
    Dim body As NotesMIMEEntity, header As NotesMIMEHeader ,  child As NotesMIMEEntity
    Dim fName2 As String
    Dim uidoc As NotesUIDocument
    Set CurDataBase=session.CurrentDataBase
    Dim docR As NotesDocument'документ TMP'
    Set uidoc =ws.CurrentDocument
    Set docR = New NotesDocument( CurDataBase ) ' создали новый док в базе роутер
    
    docR.Form="work form"   '    временная форма
    docR.header ="TEST TMP"
    docR.adresed = "1"
    docR.isp = "1"
    
    
    fName2 =  Strrightback (fName,"\") 
    fName2 = Replace(fName2, Chr(5), "")      '  попытка убадить спецсимвол &#5; с русских имен файла после прикрепления.
    Print "fName2:" fName2    '   имя файла без пути к файлу
    
    file_ext$ =  Strrightback (fName2,".")       ' расширение файла
    file_name$ =  Strleftback (fName2,".")      'имя файла
    
    session.ConvertMIME = False   ' будет ли Domino автоматически конвертировать MIME в RichText и обратно
    Dim streamIn As NotesStream
    Set streamIn =  session.CreateStream 
    Call streamIn.Open(fName,  "KOI8-R")    '    KOI8-R   
    
    Set body = docR.CreateMIMEEntity("Body")
    
    Dim b64 As New CBase64()  
    b64Text$ =  b64.encodeString (fName2)       '  КОДИРУЕМ В64  имя файла
    Print "//" + b64Text$  + "//"
    b64Text$  = "=?KOI8-R?B?" + b64Text$   +  "?="                 '  обернуть   имя файла с расширением   в  =?UTF-8?B?...?=       =?windows-1251?B?
     'b64Text$  = "=?KOI8-R?B?" + b64Text$   +  "?="  
    Print b64Text$ 
    
     '                           -------------------------------------------------------------   МИМЕ
    Set header = body.CreateHeader("Content-Type")
    Call header.SetHeaderVal({"multipart/mixed";}) 
    
    'Dim textPart As NotesMIMEEntity
    'Set textPart = body.CreateChildEntity()
    
    Dim stream As NotesStream
    Set stream = session.CreateStream
    'Call stream.WriteText("Text of message. 123 ПРОВЕРКАААА!")
    'Call textPart.SetContentFromText(stream, {text/html; charset="windows-1251"},ENC_NONE)  '  KOI8-R
    
    Set child = body.CreateChildEntity()       '  ФАЙЛ
    ' SetContentFromBytes - поток / Content-Type / Content-Transfer-Encoding ENC_IDENTITY_BINARY)   ' ENC_IDENTITY_BINARY  ENC_BASE64  ENC_NONE ENC_QUOTED_PRINTABLE 
    
    
    
    Set header = child.CreateHeader("Content-Disposition")     
    Call header.setHeaderVal( |attachment; filename="| & b64Text$ & |"|        )       ' ПРАВИЛЬНЫЙ ВАРИАНТ
    
    
'        Set header = child.CreateHeader("Content-Type")      '   ВТОРОЙ ПАРАМЕТР SetContentFromBytes - не надо менять
'        Call header.SetHeaderVal(|"application/octet-stream; name="| & b64Text$ & |"|)   
    
    Set header = child.CreateHeader("Content-Description")       '   дополнительно, не обязательно
    Call header.setHeaderVal( fName2 )
    
    Call child.SetContentFromBytes(streamIn, |application/msword; name="| & b64Text$ & |"|, ENC_IDENTITY_BINARY)
    
'    Set header = child.CreateHeader("Content-Transfer-Encoding")     ' — как закодированы данные ТРЕТИЙ  ПАРАМЕТР SetContentFromBytes - не надо менять
'    Call header.setHeaderVal( "binary")    'base64
    
      'Call child.EncodeContent (ENC_BASE64)      ' меняет заголовок Content-Transfer-Encoding , отрабатывает в ТРЕТЬЕМ ПАРАМЕТРЕ SetContentFromBytes 
    Messagebox child.Headers
    
    session.ConvertMIME = True
    flag = docR.Closemimeentities(True)
    Print  "flag " flag
    Call docR.Save(True, True    )
    
    Call streamIn.Close()
    
    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(FieldName )    
    Call uidoc.Paste
    Call uidoc.Refresh    
    Call uidoc.Save
    
    
    Print "GetEmbedObject Конец"
    
    Exit Function
ErrH:
    Print "Ошибка GetEmbedObject" & Error(Err) & " в строке " & Erl    
    Exit Function
End Function

Поделиться

3

Re: Работа с MIME в Lotus

Вот как лотус хранит вложение абв.doc, если его прикрепить в рич-поле с включенным МИМЕ.

Field Name: $FILE
Data Type: Attached Object
Object Type: File
File Name: абв.doc
Host: MSDOS/OS2
Compression Type: LZ1 2
Encoding Type:

Field Name: Body
Data Type: MIME Part

"--=_mixed 0045D271C2258D09_=
Content-Type: application/octet-stream; name="=?KOI8-R?B?wcLXLmRvYw==?="
Content-Disposition: attachment; filename="=?KOI8-R?B?wcLXLmRvYw==?="
Content-Transfer-Encoding: binary

абв.doc"

Поделиться

4

Re: Работа с MIME в Lotus

А вот что получается при программном прикреплении файла с помощью NotesMIMEEntity в лотус 9.

Field Name: $FILE
Data Type: Attached Object
Object Type: File
File Name: 00000


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

"
--==IFJRGLKFGIR17547UHRUHIHD
Content-Type: application/msword; name="=?KOI8-R?B?MAQwBDAEMAQwBDAEMAQwBDAEMAQwBCAAIAAgADEEMQQxBDEEMQQxBDEEMQQxBDEEMQQxBCAAIAAg
Content-Disposition: attachment;
  filename="=?KOI8-R?B?MAQwBDAEMAQwBDAEMAQwBDAEMAQwBCAAIAAgADEEMQQxBDEEMQQxBDEEMQQxBDEEMQQxBCAAIAAgACAAMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgQyBDIEMgQgACAAIAAzBDMEMwQzBDMEMwQzBDMEMwQzBDMELgBkAG8AYwA=?="
Content-Description:.doc

0000

Поделиться

5

Re: Работа с MIME в Lotus

В лотус клиенте 14 иконка отображается, но имя файла только в варианте
0╙0┘ 1╙1┘ 2╙2┘ 3╙3┘ 4╙4┘.doc

Такие символы  характерны для случая, когда KOI8-R или UTF-8 байты интерпретируются как CP866 (DOS) или CP437.

Двойное указание имени в Content-Disposition не помогло.

Set child = body.CreateChildEntity()       '  ФАЙЛ
    
Set header = child.CreateHeader("Content-Disposition")     
Call header.setHeaderVal( |attachment; filename*="UTF-8''| & UrlEncodeUTF8(fName2) & |"; filename="| & b64Text$ & |"|       )   
    
Set header = child.CreateHeader("Content-Description")       '   дополнительно, не обязательно
Call header.setHeaderVal( fName2 )
    
' SetContentFromBytes - поток / Content-Type / Content-Transfer-Encoding ENC_IDENTITY_BINARY)   
Call child.SetContentFromBytes(streamIn, |application/msword; name="| & fName2 & |"|, ENC_NONE)
    

Messagebox child.Headers

Поделиться

6

Re: Работа с MIME в Lotus

Остается попробовать изменить поле $FILE в лотус документе, имя File Name: 00 DD ....doc.
Имя файла в $FILE  берётся из заголовков Content-Disposition / Content-Type.
Например, экспортировать документ в DXL, заменить имя файла там, и импортировать обратно.

Поделиться

7

Re: Работа с MIME в Lotus

вариант под лотус 14. UTF-8

Function GetEmbedObject(FieldName  As String,    fName As String, doc As NotesDocument)
     ' получаем FieldName - поле на лотус-форме , fName - путь к файлу+ имя файла с расширением
    On Error Goto ErrH    
    Print "Start GetEmbedObject  "  + FieldName  +"  "  + fName 
    Dim session As New NotesSession, ws As New NotesUIWorkspace, CurDataBase As NotesDataBase
    Dim body As NotesMIMEEntity, header As NotesMIMEHeader ,  child As NotesMIMEEntity
    Dim fName2 As String
    Dim uidoc As NotesUIDocument
    Set CurDataBase=session.CurrentDataBase
    Dim docR As NotesDocument'документ TMP'
    Set uidoc =ws.CurrentDocument
    Set docR = New NotesDocument( CurDataBase ) ' создали новый док в базе роутер
    
    docR.Form="work form"   '    временная форма
    docR.header ="TEST TMP"
    docR.adresed = "1"
    docR.isp = "1"
    
    
    fName2 =  Strrightback (fName,"\") 
    fName2 = Replace(fName2, Chr(5), "")      '  попытка убадить спецсимвол &#5; с русских имен файла после прикрепления.
    Print "fName2:" fName2    '   имя файла без пути к файлу
    
    file_ext$ =  Strrightback (fName2,".")       ' расширение файла
    file_name$ =  Strleftback (fName2,".")      'имя файла
    
    session.ConvertMIME = False   ' будет ли Domino автоматически конвертировать MIME в RichText и обратно
    Dim streamIn As NotesStream
    Set streamIn =  session.CreateStream 
    Call streamIn.Open(fName,  "UTF-8")    '    KOI8-R   
    
    Set body = docR.CreateMIMEEntity("Body")
    
    Dim b64 As New CBase64()  
    b64Text$ =  b64.encodeString (fName2)       '  КОДИРУЕМ В64  имя файла
    Print "//" + b64Text$  + "//"
    b64Text$  = "=?UTF-8?B?" + b64Text$   +  "?="                 '  обернуть   имя файла с расширением   в  =?UTF-8?B?...?=       =?windows-1251?B?
     'b64Text$  = "=?KOI8-R?B?" + b64Text$   +  "?="  
    Print b64Text$ 
    
     '                           -------------------------------------------------------------   МИМЕ
    Set header = body.CreateHeader("Content-Type")
    Call header.SetHeaderVal({"multipart/mixed";}) 
    
    'Dim textPart As NotesMIMEEntity
    'Set textPart = body.CreateChildEntity()
    
    Dim stream As NotesStream
    Set stream = session.CreateStream
    'Call stream.WriteText("Text of message. 123 ПРОВЕРКАААА!")
    'Call textPart.SetContentFromText(stream, {text/html; charset="windows-1251"},ENC_NONE)  '  KOI8-R
    
    Set child = body.CreateChildEntity()       '  ФАЙЛ
' ENC_IDENTITY_BINARY  ENC_BASE64  ENC_NONE ENC_QUOTED_PRINTABLE  ENC_IDENTITY_8BIT
    
    
    
    Set header = child.CreateHeader("Content-Disposition")     
    Call header.setHeaderVal( |attachment; filename*="UTF-8''| & UrlEncodeUTF8(file_name$ )   & "."  &  file_ext$   & |"; filename="| & b64Text$ & |"|       )       ' ПРАВИЛЬНЫЙ ВАРИАНТ  b64Text$
    'Call header.setHeaderVal( |form-data; filename*="UTF-8''| & UrlEncodeUTF8(file_name$ )   & "."  &  file_ext$  & |"|       )       ' тест
    
'        Set header = child.CreateHeader("Content-Type")      '   ВТОРОЙ ПАРАМЕТР SetContentFromBytes - не надо менять
'        Call header.SetHeaderVal(|"application/octet-stream; name="| & b64Text$ & |"|)   
    
    Set header = child.CreateHeader("Content-Description")       '   дополнительно, не обязательно
    Call header.setHeaderVal( fName2 )
    
        ' SetContentFromBytes - поток / Content-Type / Content-Transfer-Encoding ENC_IDENTITY_BINARY)   
    Call child.SetContentFromBytes(streamIn, |application/msword; name="| & fName2 & |"|, ENC_NONE)
    
'    Set header = child.CreateHeader("Content-Transfer-Encoding")     ' — как закодированы данные ТРЕТИЙ  ПАРАМЕТР SetContentFromBytes - не надо менять
'    Call header.setHeaderVal( "binary")    'base64
    
      'Call child.EncodeContent (ENC_BASE64)      ' меняет заголовок Content-Transfer-Encoding , отрабатывает в ТРЕТЬЕМ ПАРАМЕТРЕ SetContentFromBytes 
    Messagebox child.Headers
    
    Call streamIn.Close()
'    session.ConvertMIME = True
'    flag = docR.Closemimeentities(True)
'    Print  "flag " flag
    Call docR.Save(True, True    )
    
    ' ================== DXL РЕДАКТИРОВАНИЕ $FILE ==================
    ' ---------------- DXL: экспортим, подменим "битое" имя и импортируем обратно ----------------
    Dim exporter As NotesDXLExporter
    Dim importer As NotesDXLImporter
    Dim dxl As String
    
    Set exporter = session.CreateDXLExporter()
    dxl = exporter.Export(docR) ' получаем DXL как строку
    Msgbox dxl
    ' --- найдём первое вхождение name="..." и подменим его на fName2 ---
    Dim pos1 As Long, pos2 As Long, badName As String
    pos1 = Instr(1, dxl, "name=""")
    If pos1 > 0 Then
        pos1 = pos1 + 6 ' позиция начала имени
        pos2 = Instr(pos1, dxl, """")
        If pos2 > pos1 Then
            badName = Mid$(dxl, pos1, pos2 - pos1)
            Print "Найдено в DXL имя: " & badName
            dxl = Replace(dxl, "name=""" & badName & """", "name=""" & fName2 & """")
        End If
    Else
        Print "В DXL не найдено— ничего не заменяю"
    End If
    
    ' --- создаём импортера с DXL-строкой как входом и текущей базой как целью ---
    Set importer = session.CreateDXLImporter(dxl, CurDataBase)
    
    ' НЕ трогаем дизайн; заменяем сам документ (если совпадает)
    importer.DesignImportOption = DXLIMPORTOPTION_IGNORE
    importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_CREATE
    importer.ReplaceDbProperties = False ' по желанию
    
    ' запускаем импорт
    Call importer.Process
    
    ' ==============================================================
    
    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(FieldName )    
    Call uidoc.Paste
    Call uidoc.Refresh    
    Call uidoc.Save
    
    
    Print "GetEmbedObject Конец"
    
    Exit Function
ErrH:
    Print "Ошибка GetEmbedObject" & Error(Err) & " в строке " & Erl    
    Exit Function
End Function

Опции для importer  (CreateDXLImporter)

Значение    Поведение
DXLIMPORTOPTION_CREATE    Всегда создаёт новый документ, даже если такой уже существует. Риск дубликатов.
DXLIMPORTOPTION_REPLACE_ELSE_IGNORE    Если документ найден → заменяет его. Если нет → ничего не делает.
DXLIMPORTOPTION_REPLACE_ELSE_CREATE    (твоя опция): если найден → заменяет, если не найден → создаёт новый.
DXLIMPORTOPTION_UPDATE_ELSE_IGNORE    Если найден → обновляет только изменённые поля (не удаляя остальные). Если не найден → игнорирует.
DXLIMPORTOPTION_UPDATE_ELSE_CREATE    Если найден → обновляет. Если не найден → создаёт новый документ.
DXLIMPORTOPTION_IGNORE    Полностью игнорирует все документы в DXL (ничего не делает с документами).

Поделиться

8

Re: Работа с MIME в Lotus

Кому интересно.
Кнопочка."DXL экспорт"

Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument
    Dim exporter As NotesDXLExporter
    Dim stream As NotesStream
    
    Set doc = ws.CurrentDocument.Document
    
    ' создаем поток и экспортер
    Set stream = session.CreateStream
    Set exporter = session.CreateDXLExporter()
    
    ' (опционально) настраиваем экспорт
      ' exporter.OmitRichtextAttachments = False
'    exporter.OutputMIME= True
    
    Dim dxl As String
    dxl = exporter.Export(doc) ' получаем DXL как строку
    
    Call stream.open ("C:\XML\DXL1111.xml")
    Call stream.Truncate()
    stream.WriteText (dxl)
    Call stream.Close()
    
    
    Msgbox "Документ выгружен "
End Sub

Выгрузил в DXL вложение в обычном РичТекст  поле.

<?xml version='1.0'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_14_0.dtd'>
<document xmlns='http://_.lotus.com/dxl' version='14.0' replicaid='C2258C5E002D4839'
 form='work form'>
<noteinfo noteid='c04a' unid='6A3F077631CAE06BC2258D0E003D1F61' sequence='4'>
<created><datetime dst='true'>20250923T140737,29+03</datetime></created>
<modified><datetime dst='true'>20250923T160742,89+03</datetime></modified>
<revised><datetime dst='true'>20250923T160742,88+03</datetime></revised>
<lastaccessed><datetime dst='true'>20250923T160742,89+03</datetime></lastaccessed>
<addedtofile><datetime dst='true'>20250923T140738,63+03</datetime></addedtofile></noteinfo>
<updatedby><name>CN=admin adm/O=MZB</name></updatedby>
<revisions><datetime dst='true'>20250923T140738,62+03</datetime><datetime
 dst='true'>20250923T140739,98+03</datetime><datetime dst='true'>20250923T160726,14+03</datetime></revisions>
<item name='header'><textlist><text>TEST TMP</text></textlist></item>
<item name='isp'><textlist><text>1</text></textlist></item>
<item name='MIME_Version'><textlist><text>1.0</text></textlist></item>
<item name='$MIMETrack'><textlist><text>Itemize by NLNOTES.EXE on admin adm/MZB(Release 14.0|November 09, 2023) at 23.09.2025 14:07:38</text></textlist></item>
<item name='$NoteHasNativeMIME'><textlist><text>1</text></textlist></item>
<item name='Body'><richtext>
<pardef id='1'/>
<par def='1'><attachmentref name='ИМЯ ВЛОЖЕНИЯ.doc' displayname='ИМЯ ВЛОЖЕНИЯ.doc'><picture
 height='34px' width='131px'><notesbitmap>
lQAmAAAAAAAAAAAAAAABAAAA ИКОНКА   AAAAAAAAAAAAAA==
</notesbitmap><caption>вап вап вап вввв.doc</caption></picture></attachmentref></par></richtext></item>
<item name='$EncryptionStatus'><textlist><text>0</text></textlist></item>
<item name='$SignatureStatus'><textlist><text>0</text></textlist></item>
<item name='$FILE' summary='true' sign='true' seal='true'><object><file hosttype='msdos'
 compression='none' flags='storedindoc' encoding='none' name='вап вап вап вввв.doc'
 size='110080' storagesize='65706' desiredcompression='lz1'>
<created><datetime dst='true'>20250918T095027,54+03</datetime></created>
<modified><datetime dst='true'>20250918T095029,86+03</datetime></modified><filedata
>
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQA ВЛОЖЕНИЕ AAAAAAAAA==
</filedata></file></object></item></document>

Поделиться

9

Re: Работа с MIME в Lotus

Выгрузил в DXL вложение в MIME поле Body.

<?xml version='1.0'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_14_0.dtd'>
<document xmlns='http://_.lotus.com/dxl' version='14.0' replicaid='C2258C5E002D4839'
 form='work form'>
<noteinfo noteid='c056' unid='C9E6D6422D53F858C2258D0E0041FF40' sequence='1'>
<created><datetime dst='true'>20250923T150051,84+03</datetime></created>
<modified><datetime dst='true'>20250923T150052,95+03</datetime></modified>
<revised><datetime dst='true'>20250923T150052,94+03</datetime></revised>
<lastaccessed><datetime dst='true'>20250923T150051,84+03</datetime></lastaccessed>
<addedtofile><datetime/></addedtofile></noteinfo>
<item name='HEADER'><text>TEST TMP</text></item>
<item name='ISP'><text>1</text></item>
<item name='MIME_Version'>
<rawitemdata type='502'>
DgAKAAAAAwAMAAIABQAxLjBNSU1FLVZlcnNpb246IDEuMA0K
</rawitemdata></item>
<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgACAAAAAQBMAAAASgAAAAAAAABDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsNCglib3Vu
ZGFyeT0iPT1JRkpSR0xLRkdJUjIwOTIwVUhSVUhJSEQiDQoNCg0K
</rawitemdata></item>
<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgAPAAAAAgA7AiAA3gEAAAAAAAANCi0tPT1JRkpSR0xLRkdJUjIwOTIwVUhSVUhJSEQNCkNvbnRl
....
Z0JrQUc4QVl3QT0/PQ0KDQpADyQ/DyQ7DyQgPg8kOw8kIDsPJDsPJD4PJDsPJCBADyQ7DyQ0DyQ0
DyQ0DyQ0DyQ7DyQ7DyQ7DyQuZG9j
</rawitemdata></item>
<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgABAAAAAwAiACAAAAAAAAAAAAANCi0tPT1JRkpSR0xLRkdJUjIwOTIwVUhSVUhJSEQtLQ0K
</rawitemdata></item>
<item name='$MIMETrack'><text>Itemize by NLNOTES.EXE on admin adm/MZB(Release 14.0|November 09, 2023) at 23.09.2025 15:00:52</text></item>
<item name='$NoteHasNativeMIME'><text>1</text></item>
<item name='$FILE' summary='true' sign='true' seal='true'><object><file hosttype='msdos'
 compression='none' flags='storedindoc' encoding='unknown' name='@?; ИМЯ Краказяблами 444;;;.doc'
 size='110080'>
<created><datetime dst='true'>20250923T150052,92+03</datetime></created>
<modified><datetime dst='true'>20250923T150052,92+03</datetime></modified><filedata
>
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAA ВЛОЖЕНИЕ AAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA==
</filedata></file></object></item></document>

Base64-данные внутри <rawitemdata> - это и есть приложение.

Поделиться

10

Re: Работа с MIME в Lotus

В этом поле Body зашифровано "Content-Type: application/msword; name= имя и окончание .doc.

<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgACAAAAAQBMAAAASgAAAAAAAABDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsNCglib3Vu
ZGFyeT0iPT1JRkpSR0xLRkdJUjE1MTIzVUhSVUhJSEQiDQoNCg0K
</rawitemdata></item>

<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgAPAAAAAgDMASAAewEAAAAAAAANCi0tPT1JRkpSR0xLRkdJUjE1MTIzVUhSVUhJSEQNCkNvbnRl
bnQtVHlwZTogYXBwbGljYXRpb24vbXN3b3JkOyBuYW1lPSIF4AXgBeAF4AXgBeAF4AXgBeAF4AXg
BeAF4AXgBeAuZG9jIg0KQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsNCgkgZmlsZW5h
bWUqPSJVVEYtOCcnMCUwNDAlMDQwJTA0MCUwNDAlMDQwJTA0MCUwNDAlMDQwJTA0MCUwNDAlMDQw
JTA0MCUwNDAlMDQwJTA0JTBEJTAwJTBBJTAwLmRvYyI7DQoJIGZpbGVuYW1lPSI9P1VURi04P0I/
TUFRd0JEQUVNQVF3QkRBRU1BUXdCREFFTUFRd0JEQUVNQVF3QkRBRUxnQmtBRzhBWXdBPT89Ig0K
Q29udGVudC1EZXNjcmlwdGlvbjogPT9VVEYtOD9CP01BUXdCREFFTUFRd0JEQUVNQVF3QkRBRU1B
UXdCREFFTUFRd0JEQUVMZ0JrQUc4QVl3QT0/PQ0KDQowDyQwDyQwDyQwDyQwDyQwDyQwDyQwDyQw
DyQwDyQwDyQwDyQwDyQwDyQwDyQuZG9j
</rawitemdata></item>

<item name='Body' sign='true' seal='true'>
<rawitemdata type='19'>
AgABAAAAAwAiACAAAAAAAAAAAAANCi0tPT1JRkpSR0xLRkdJUjE1MTIzVUhSVUhJSEQtLQ0K
</rawitemdata></item>

первый блок:

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

Вот результат декодирования второго блока

--==IFJRGLKFGIR15123UHRUHIHD
Content-Type: application/msword; name=".doc"
Content-Disposition: attachment;
     filename*="UTF-8''0%040%040%040%040%040%040%040%040%040%040%040%040%040%040%04%0D%00%0A%00.doc";
     filename="=?UTF-8?B?MAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAELgBkAG8AYwA=?="
Content-Description: =?UTF-8?B?MAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAELgBkAG8AYwA=?=

0$0$0$0$0$0$0$0$0$0$0$0$0$0$0$.doc

блок 3.

--==IFJRGLKFGIR15123UHRUHIHD--

Поделиться

11

Re: Работа с MIME в Lotus

Осталось заменить содержимое второго блока Body с о следующим текстом, закодированным в формата Base64, который выгружен в DXL.


--==IFJRGLKFGIR29392UHRUHIHD
Content-Type: application/msword; name="ИМЯ ФАЙЛА.doc"
Content-Disposition: attachment;
     filename*="UTF-8''%1F%048%04A%04L%04%3C%04%3E%04-%00%11%045%005%005%005%005%005%00%0D%00%0A%00.doc";
     filename="=?UTF-8?B?HwQ4BEEETAQ8BD4ELQARBDUANQA1ADUANQA1AC4AZABvAGMA?="
Content-Description: =?UTF-8?B?HwQ4BEEETAQ8BD4ELQARBDUANQA1ADUANQA1AC4AZABvAGMA?=

ИМЯ ФАЙЛА.doc

В лотус документе это

<item name='$FILE' summary='true' sign='true' seal='true'><object><file hosttype='msdos'
compression='none' flags='storedindoc' encoding='unknown' name='000000000000000.doc'
size='110080'>

Поделиться