Notes. Com. Создаем письмо с вложениями

  • Автор темы AndryG
  • Дата начала
A

AndryG

Доброго, дамы и господа :)

Пытаемся создать новое письмо с вложением.
На PHP пробуем через COM.
Вот так пишем
Код:
 ...
$rtitem = $doc->CreateRichTextItem("Body");
$rtitem->AppendText( "Привет от PHP");
$rtitem->addNewLine();
$rtitem->appendText('Вставка вложения');
$rtitem->embedObject(1454,'','d:\MG_INST.cmd'); //Const -- ATTACHMENT
...
В итоге получаем письмо, в котором идет невзрачная иконка вложения и слева пишется полное имя файла вложения.

Когда добавляю вложение в Notes, то иконка ставится симпатичная
из привязанного к расширению приложения и под иконкой симпатично имя (только имя) файла пишется.

Как это реализуется? Подскажите направление :)

Пробовал другие константы совать в embedObject - получаю почти аналогичное при ОBJECT, ну и совсем не то при LINK
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
убого это реализутся..., пиндусы так написали :(
с иконками - морока (а уж с АктивХэ - то там покрути, то реестр почеши...)
"проще" взять всё в свои руки :). DXL монтырить, цеплять <filedata>, и по-месту вставлять пикчурес, кот. заранее заготовить (соответственно - ндергать из апликух) и заенкодить в base64
вот кусочег кода (java), в нем заэнкоденый гиф от ЗИПфайла:
[codebox]
String txtStartBitmapItem="<pardef id='1'/><par def='1'>"+
"<attachmentref name='"+zipFileName+"' displayname='"+zipFileName+"' caption='"+zipFileName+"'>"+
"<picture><gif originalformat='notesbitmap'>";
//height='47px' width='62px'
char lf=10;
String txtEndBitmapItem="</gif></picture></attachmentref></par>";
String encodedBitmap=
"R0lGODlhHwAhAIIAAQQFCAiElNqaJLvFzfz9+fwCBCfS5wRilCH5BAEAAAAA"+
"LAAAAAAfACEAAgOwSLrR/tCtSUmomIE8L6+BsH3e1w0iaVIXOmLlailuFq8B"+
"oO+wnA2vjmJHXAEphSQBcGgYnjnTcVEguIi7w/QXTHq/SsAWM65OUIKUOFgp"+
"n9PpzfrjXqDjy3G7a4fj5xx1BH5/ehR1d3ByhmddWI9abIeSM0xOUJSNPUuP"+
"RpQ3S6BknwtMADkHTHSkCqmpqJk0rD6Tm7SaILe1ubp2s72Moj7BA8XGx8jJ"+
"jI/MzTy9MgkAOw==";[/codebox]

реализуется типа (вставка строки в ДХЛ дока):
[codebox]dxlToImport.append(txtStartBitmapItem);dxlToImport.append(encodedBitmap
);dxlToImport.append(txtEndBitmapItem);[/codebox]

анкологично мона, менять прям в ДХЛ сам битмап (хоть через XSLT) в уже созданом доке
эссэсвено прийдется экспортить как ДХЛ и импортить обратно (измененный)
 
A

AndryG

Писец :cool: ... если бы я хоть чего-нить понял :)
Пока будет выглядеть убого (время поджимает), но и с этим разобраться хочется.

Если не лень ... на уровне пониже ... поведайте, пжлст, куда смотреть, дабы используя COM это реализовать?
 
A

Akupaka

на уровне COM не скажу, но общий принцип таков (для винды):
когда устанавливается приложение-"обработчик" для определенного расширения файла, оно регистрируется в нужном месте в системе (реестре).
при этом для отображения файлов в проводнике используется пиктограмма, которая находится в определенном ресурсе, как то исполняемый файл, либо библиотека, указатель на которую система находит все в том же реестре...
когда стандартный клиент Notes выполняет функцию вставки вложения в Richtext-поле, т.е. на UI, то он читает все ту же пиктограмму, преобразовывает ее сожержимое в спец. код (наверное Base64-хеш, или как-то подобно), и размещает в нужном месте Richtext-поля. паралельно при этом создается иной итем в документе, который в свою очередь хранит данные вложения! т.е. вложение не хранится в Richtext-поле! для каждого из вложений есть итем с именем $FILE, причем для каждого используется одинаковое имя! каким-то образом Notes сам связывает каждое из итемов-вложений с соотв. картинкой в Richtext-поле.

теперь, внимание, вопрос: на... зачем тебе это нужно?! :(


ЗЫ: прочитал, что написал lmike :) мысли совпали - значит пиктограмма в виде Base64-хеша хранится
 
K

Kee_Keekkenen

например вот такой код в вычисляемом поле
db:=@ReplaceSubstring(@ReplaceSubstring(@Subset(@DbName;-1);"\\";"/");" ";"+");
link:="http://"+@Left(@Name([Abbreviate];@ServerName);"/")+"/"+db+"/"+@Text(@DocumentUniqueID)+"/$File/"+@AttachmentNames+"?OpenElement\" target=\"_blank\"><img src=\""+@Right(@AttachmentNames;3)+".jpg\" width=\"17\" height=\"17\" border=\"0\">"+"описание ссылки";
link[1]
формирует нормальную ссылку только на один прикрепленный файл (на несколько аттачей иначе как-то делать нужно)
где вот эта конструкция @Right(@AttachmentNames;3)+".jpg\" указывает на картинку в ресурсах базы созданных по принципу (txt.jpg, doc.jpg, xls.jpg и.д.)
а в скрипте эначение поля добавляется Call rtitem.AppendText(Chr(10)+{<a href = "}+ doc.GetItemValue(linkField)(0) +{</a><br>})
таким образом вам нужно создать картинки для типов документов и сформировать подобные ссылки и будет вам счастье
 
A

Akupaka

зачем такой гемор? зачем делать ссылки через http, а если на сервере вообще нет задачи, то что?..
 
A

AndryG

Нужно это - красиво хотел письма генерить.

По итем $FILE - действительно ... Дабы собрать вложения из письма приходилось вот такой изврат делать
Код:
	 while($n_entry->Document->HasItem('$FILE')){//проходим по всем атачам писмьа
$n_filenameitem = $n_entry->Document->GetFirstItem('$FILE');
$n_filename = $n_filenameitem->values[0];
if(preg_match('/^[\w]+_atm[\d]{4}.a(?:rj|[\d]{2})$/i',$n_filename)){ //Имя вложения соответствует нужной маске
$n_entry->Document->GetAttachment($n_filename)->ExtractFile($dir_work.'/'.$n_filename);
echo " $n_filename\n";
}
$n_filenameitem->Remove; // ФИГНЯ ПОЛНАЯ, но иначе не добраться ко всем $FILE - имена, зараза, одинаковые
} // if $FILE
Получается нужно вложения не вкладывать в РичТекст, а наваливать отдельно.
(Это я вас не учу, просто пробую разобраться :) )
каким-то образом Notes сам связывает каждое из итемов-вложений с соотв. картинкой в Richtext-поле.
Как же это сотворить?

Надоть полазить подробней по готовому письму...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
выгружайте док в ДХЛ (Домино XML)
и смотрите его структуру
часть этой структуры и присутствует в коде, кот. я выложил выше

картинки по-любе хранить прийдется в базе (предварительно надергав их из приложений)
открыть МСпомойки файло (типа эхэ и дляля) мона PEExplorer-ом
возмите триальный - Вам хватит

без DXL Вам не обойтись (верней обойтись - но СиАПИ для Вас не проще будет)

cам файл лежит унутря <filedata></filedata>

кот. в свою очередь помещен в айтем
<item name='$FILE' summary='true' sign='true' seal='true'><object><file hosttype='msdos'
compression='none' flags='sign storedindoc' encoding='none' name='...'>
<created><datetime dst='true'>20080731T010008,01+04</datetime></created>
<modified><datetime dst='true'>20080731T010008,03+04</datetime></modified>....</item>

и связяна картинка по атрибуту name, реф на кот. и помещается в тело <richtext>...</richtext>
типа:
<attachmentref name="..."

картинки делайте ГИФ и кодируйте base64 (так и храните в базе - текстом, в поле)
 
A

Akupaka

тебе про DXL не просто так писали
выгрузи письмо в DXL-формате и посмотри что будет в Body, там будет несколько картинок-пиктограмм вложений

вложения могут быть вложены в Richtext либо в документ, но в документ - это старый способ, который уже не используется клиентом явно...
т.е. можно подцепить вложение в документ, перенеся туда итем $FILE, но это будет не корректно...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
вот иконки эхэля и ворды заэнкоденые (тока "начало" и "конец" в файлах "отрезать" надо, шобы вставлять в "строки")
 

Вложения

  • Icons.zip
    1,7 КБ · Просмотры: 146
A

AndryG

Ух! Народ .. я понимать, что Вы в Lotus "VIP" .... но я совсем по другим платформам ... Lotus - корпоративная штуковина - надоело письма слать всем каждый день руками - решил запрограммить ... не больше. Попробовал десингном открыть базу свою почтовую и посмотреть на письма -- и прав нет и загадка полная :)

Видать не судьба мне красоваться мне красивыми вложениями (всё знать и разбираться - жизнь коротка, к сожалению) будет как уже есть - корявые письма с невзрачными вложениями с дефолтным шрифтом/размером и тд.

Спасибо всем за уделенное время.

С наступающими :)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Спасибо за поздравления

там ничего сложного нет... (ПыхПых выучили и АктивХэ мацали)
можно:
-создать XSLT с секциями, содержащими код иконок, соответственно для кажного типа
-апосля выгрузить док в DXL
-наложить Трансформацию
-загрузить обратно в базу
все эти операции производятся в Нотесе 2-3 мя строками кода
задача - создать и оттестить XSL

и вот это надо не забыть:
Read-write. Indicates whether bit maps pasted in rich text items should be converted to GIF format.
Note This property is new with Release 6.5.
Defined in
NotesDxlExporter
Data type
Boolean
Syntax
To get: flag = notesDXLExporter.ConvertNotesBitmapsToGIF
To set: notesDXLExporter.ConvertNotesBitmapsToGIF = flag
Legal values
True indicates conversion of bit maps.
False (default) indicates leaving bit maps in Domino format.
Usage
Converted bit maps result in the following DXL:
<gif orignalformat='notesbitmap'>gif representation</gif>
While non-converted bit maps are:
<notesbitmap>notes representation</notesbitmap>
On import, GIF files are converted back to Notes format if the "originalformat" attribute is present.
Language cross-reference

вот др. энкодером отфигачил (даже, скрипт, на баше написал ;) )
 

Вложения

  • Icons.zip
    1,6 КБ · Просмотры: 137
A

AndryG

Спасибо, что верите в меня :) Теперь придется разбираться.

Помогите, пжлст, еще с одной фигней. Не хочет отправлять письма, если в итем SendTo запихнуть _несколько_ адресатов. Строку запихиваю ... беру из поля "кому" в notes.
Если один адресат - уходит ... два и больше Исключение получаю с текстом "Нельзя отправить почту, имя не найдено в адресных книгах" ... если каждого по очереди ставить в итем SendTo - уходит.
Код:
	//Собираем письмо покускам
$n_doc = $n_db->CreateDocument();
$n_doc->SaveMessageOnSend = true; // СОХРАНЕНИЕ ФАЙЛОВ ПРИ ОТПРАВКЕ
$n_doc->Sign();		  //ПОДПИСАТЬ
$n_doc->AppendItemValue('Subject',$subject);
$n_doc->AppendItemValue('SendTo',$send_to); //Строку ставлю из "кому" в notes
$n_rtitem = $n_doc->CreateRichTextItem('Body');
$n_rtitem->AppendText("\nДоброго времени суток.\n\n Сим письмом я посылаю Вам следующие файлы:\n\n");
//Поздоровались ... теперь складируем файлы
lotus_attach($n_rtitem,$files_del);
lotus_attach($n_rtitem,$files_nodel);
//И послений аккорд
$n_rtitem->AppendText("\n Это письмо создала утилита \"Lotus Notes Sender\" ".date('Y.m.d H:m:s'));
$n_doc->Send(false); //ПРОБОВАЛ СЮДА ВТОРЫМ ПАРАМЕТРОМ адресатов ставить - пофиг

Вы уж извините за такой вопрос идиотский ... но поиск не дал ничего и научный тык тоже

ПРОЗРЕНИЕ!!!

Массивом их надоть в итем запихивать!!!
Код:
$n_doc->AppendItemValue('SendTo',$tmp = explode(',',$send_to));
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
хотя к Домине это относится косвенно, но утиль полезная, а главное - кроссплатформенная!
в данном контексте - экспортит иконки (и вообще ресурсы) из МСявых фалов
 
A

AndryG

Проковырялся в справке еще ... научился экспортировать док в DXL.

Первые посты Akupaka и lmike приобрели совсем другой смысл ... точнее "они приобрели смысл" :D

Мне, конечно, кортит порадовать Вас моими успехами ... но и вопрос есть :wacko:
Код:
<?php
$filename = 'd:\notes_doc.xml'; //Файлик для ручной правки DXL между экспортом - импортом
//Подключаемся к Domino и стучимся к почтовой базе
$session = new COM("Lotus.NotesSession");
$session->initialize($p_pass);
$db = $session->GetDbDirectory($p_srv)->OpenMailDatabase();
$dir_test = $db->GetView('test'); //Выдернул отдельно объект вьюва. Наивный, думал в него импорт устроить - фиг там!
// Получаем подобытный документ. Это минимальный док с маленьким вложением.
$doc = $dir_test->GetFirstDocument();
// ЭКСПОРТ
$exporter = $session->CreateDXLExporter();
$dxl_data = $exporter->Export($doc);
file_put_contents($filename,$dxl_data); //Записали в файл.
// Вот здесь останавливаем выполнение. Правим DXL файл (Тема, иконки и т.д.)
// ИМПОРТ
$importer = $session->CreateDXLImporter();
$res = $importer->Import(file_get_contents($filename),$db);
//$res == NULL Метод ничего нам не вернул. Импорт успешен, ибо исключений не последовало. 
// А документ, который мы с любовью создали и нашпиговали вложениями, удрал из рук ($doc)
// Теперь лежит одиноко в огромной бочке ($db) ... как его там найти!?
echo "END";
?>
Дальше три новости:
хорошая - "Иконки поменялись и надписи симпатичные"
плохая - "документ нашелся только в Notes ПРЕДСТАВЛЕНИЯ - ВСЕ ДОКУМЕНТЫ"
очень плохая - "в своем коде я потерял переменную, указывающую на новый документ"

Вопрос. Как теперь добраться к этому документу?
Как заполучить "переменную $doc_upgrade" для дальнейшей возни с ним?

Может, конечно, опять прозрение посетит ...
 
A

Akupaka

эээ... сам не делал импорт, могу сделать предположение, что! документ будет импортирован с тем унидом, который в dxl прописан. но! если док-т с таким унидом в базе уже есть, то импортированному дадут новый!

варианты решения:
- перед импортом удалять документ с указанным унидом;
- в импортируемый док, либо перед экспортом, либо уже в dxl, добавлять итем-флаг, с каким-то значением; и сделать вид, который будет отбирать по этому флагу доки; ну и агент, который по виду шарится и знает что делать с такими доками;
- сделать агент, который обрабатывает новые и измененные доки, и по какому-то параметру (например, по флагу как в пред случае) определять, что док импортирован, и что-то делать...

думаю, что самый интересный будет первый вариатн, т.к. мы прямо в коде сможем достать этот импортированный док:
я не знаю php поэтому напишу в LS краткий пример:

Код:
' ... тут мы сделали все что нужно для экспорта
' doc - экспортируемый док
' сохраняем унид
dim docunid as string
docunid = doc.UniversalID

'... делаем экспорт
'... правим DXL
'... перед импортом удаляем doc
call doc.Remove(true)
set doc = nothing ' просто так

'... импортируем док

' и пытаемся его достать из базы по униду
set doc = db.getdocumentbyunid(docunid)

'... что-то делаем дальше


ВАЖНО! Я так не пробовал делать, поэтому не знаю как может себя повести лотус! возможно, что все будет не так радужно! а еще нужно проверить не пропадет ли этот документ, когда будут чиститься стабы удаленных...
 
A

Akupaka

ВАЖНО! Есть хороший метод и не надо париться! :wacko:

notesDXLImporter.GetFirstImportedNoteID( )

я его не знал :D
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
никто не любит хэлп читать ;)
какой проверять ЮНИД?
Legal values
DxlImporter.DXLIMPORTOPTION_IGNORE (1)
Ignores documents in the incoming DXL and leaves the documents in the output database intact.
DxlImporter.DXLIMPORTOPTION_CREATE (2)
(Default) Creates new documents from the incoming DXL, leaving existing documents in the output database intact.
DxlImporter.DXLIMPORTOPTION_REPLACE_ELSE_CREATE (6)
Replaces documents in the output database with documents in the incoming DXL that match. Adds any new documents from the incoming DXL.
DxlImporter.DXLIMPORTOPTION_REPLACE_ELSE_IGNORE (5)
Replaces documents in the output database with documents in the incoming DXL that match. Leaves non-matching documents in the output database.
DxlImporter.DXLIMPORTOPTION_UPDATE_ELSE_CREATE (10)
Replaces document items in the output database with document items in the incoming DXL that match. Adds new documents and document items from the incoming DXL.
DxlImporter.DXLIMPORTOPTION_UPDATE_ELSE_IGNORE (9)
Replaces document items in the output database with document items in the incoming DXL that match. Leaves non-matching documents and document items in the output database.
 
Мы в соцсетях:

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