Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Java в Domino. Сохранение файлового потока в документе Notes

Николай Норкин

г. Киров

nickanor@mail.ru

В предыдущих частях (здесь и здесь) стояла задача получить хранящиеся в приложении Notes файлы в виде потока для их дальнейшей обработки (ну, потому что просто сохранить присоединённый файл в файловую систему в большинстве случаев задача тривиальная, хорошо решаемая стандартными классами LotusScript или java-пакетом lotus.domino)

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

Автор предлагает на этот раз использовать для вывода потока в документ Notes классы, работающие с MIME (Multipurpose Internet Mail Extensions). Решение будет проиллюстрировано созданием и отправкой по почте текстового файла Здравствуй,мир!.txt (а давайте уж сразу усложним жизнь кириллицей), содержащий текстовую строку - настолько же оригинальную

Предварительным шагом создаётся поток с содержимым файла

       java.io.ByteArrayOutputStream stream = new java.io.ByteArrayOutputStream();
       stream.write("Здравствуй,мир!".getBytes());
На следующих шагах пойдёт обращение к методам классов Memo и MIMEFile, которые полностью прилагается к данной статье (Memo.java, MIMEFile.java)

Итак,

Шаг первый. Создание документа в mail.box почтового сервера, заданного в качестве почтового сервера клиента (если код выполняется на клиенте), или в mail.box самого сервера (если код выполняется на сервере). Этот приём отправки почтовых сообщений описан ранее в материале

ru.medkirov.mail.Memo memo = new ru.medkirov.mail.Memo(session);
memo.createMemo();

public Memo(lotus.domino.Session session) {
try {
this.session = session;
this.session.setConvertMIME(false); // установить файл работы с MIME
this.initMailbox();
}
catch (Exception ex) {}
}
private void initMailbox() {
try {
lotus.domino.Database database = null;
if (!this.session.isOnServer()) { // код работает на клиенте
lotus.domino.DbDirectory directory = this.session.getDbDirectory(null);
try {
database = directory.openMailDatabase(); // почтовая база пользователя
}
catch (Exception ex) {
database = this.session.getCurrentDatabase(); // при ошибке - текущая база, в которой работает код
}
String server = database.getServer(); // имя сервера
this.mailbox = this.session.getDatabase(server, "mail.box", false); // системная почтовая база, если их несколько, возвращается рандомная, например, mail3.box
return;
}
try { // код работает на сервере
database = this.session.getDatabase("", "mail.box", false); // router работает с одной системной почтовой базой
if (database == null)
database = this.session.getDatabase("", "mail1.box", false); // или снесколькими
}
catch (Exception ex) {}
this.mailbox = database;
}
catch (Exception ex) {}
}
public lotus.domino.Document createMemo() {
try {
this.memo = this.mailbox.createDocument();
this.memo.replaceItemValue("Form", "Memo");
// this.memo.replaceItemValue("RoutingState", "HOLD"); // использовать для отладки
this.memo.replaceItemValue("Precedence", "normal");
this.memo.replaceItemValue("Auto-submitted", "auto-generated");
this.mime = this.memo.createMIMEEntity("Body"); // создание поля Body
lotus.domino.MIMEHeader header = this.mime.createHeader("charset");
header.setHeaderVal("windows-1251");
header = this.mime.createHeader("MIME-Version");
header.setHeaderVal("1.0");
header = this.mime.createHeader("Content-Type");
header.setHeaderVal("multipart/related;boundary=\"=NextPart_-\"");
}
catch (Exception ex) {}
return null;
}
Шаг второй. Заполнение атрибутов письма. По большому счёту, в классе Memo предусмотрены методы setItemValue(String itemname, Object value), при помощи которого можно установить значения полей документа, но также предусмотрены и методы для установки конкретных полей

       memo.setSubject("Здравствуй, мир!");
       memo.setSender("Почта сервисов/Почта", "CN=Почта сервисов/O=Почта@Acme", "Агент интеграции<services-mail@acme.corp>", "services-mail@acme.corp");
java.util.Vector recipients = new java.util.Vector();
recipients.add("nick@acme.corp");
memo.setAllRecipientsItems(recipients);

public void setSubject(String subject) {
try {
this.memo.replaceItemValue("Subject", subject);
}
catch (Exception ex) {}
}
public void setSender(String sender, String principal, String inetFrom, String SMTPOriginator) {
try {
this.memo.replaceItemValue("From", sender);
this.memo.replaceItemValue("Principal", principal);
this.memo.replaceItemValue("InetFrom", inetFrom);
this.memo.replaceItemValue("SMTPOriginator", SMTPOriginator);
}
catch (Exception ex) {}
}
public void setAllRecipientsItems(java.util.Vector recipients) {
try {
this.memo.replaceItemValue("Recipients", recipients);
this.memo.replaceItemValue("SendTo", recipients);
}
catch (Exception ex) {}
}
Шаг третий. Добавление файла

       byte[] bytes = stream.toByteArray();
       String base64 = javax.xml.bind.DatatypeConverter.printBase64Binary(bytes);
       memo.println("Здравствуй, мир!");
       memo.addFile(base64, "Здравствуй, мир!.txt", "text/plain");

// предварительное формирование тела письма
public void println(String text) {
try {
this.print(text.concat("\n"));
}
catch (Exception ex) {}
}
public void print(String text) {
try {
if (this.plaintext == null) this.plaintext = this.session.createStream();
this.plaintext.writeText(text);
}
catch (Exception ex) {}
}
public void print(String text, boolean eof) {
try {
if (this.plaintext == null) this.plaintext = this.session.createStream();
this.plaintext.writeText(text);
if (eof) {
lotus.domino.MIMEEntity child = this.mime.createChildEntity();
child.setContentFromText(this.plaintext, "text/plain;charset=UTF-8", lotus.domino.MIMEEntity.ENC_IDENTITY_8BIT);
this.plaintext.close();
this.plaintext = null;
}
}
catch (Exception ex) {}
}

// для аттача файлов - отдельный класс (см. MIMEFile)
public void addFile(String base64, String filename, String filetype) {
try {
ru.medkirov.mail.MIMEFile file = new ru.medkirov.mail.MIMEFile(this.session, base64, filename, filetype);
if (this.files == null) this.files = new java.util.ArrayList();
this.files.add(file);
}
catch (Exception ex) {}
}

package ru.medkirov.mail;

public class MIMEFile {
protected lotus.domino.Stream content = null;
protected String filename = "";
protected String filetype = "";
protected int encoding = 0;
public MIMEFile (lotus.domino.Session session, String base64, String filename, String filetype) {
try {
this.content = session.createStream();
this.init(this.content, base64, filename, filetype);
}
catch (Exception ex) {}
}
public MIMEFile (lotus.domino.Stream content, String base64, String filename, String filetype) {
this.content = content;
this.init(this.content, base64, filename, filetype);
}
protected void init(lotus.domino.Stream content, String base64, String filename, String filetype) {
try {
content.writeText(base64);
this.filename = filename;
this.filetype = filetype;
this.encoding = lotus.domino.MIMEEntity.ENC_BASE64;
}
catch (Exception ex) {}
}
public lotus.domino.Stream getContent() {
return this.content;
}
public String getFilename() {
try {
String encoding = javax.xml.bind.DatatypeConverter.printBase64Binary(this.filename.getBytes("UTF-8"));
return "=?UTF-8?B?".concat(encoding).concat("?=");
}
catch (Exception ex) {}
return this.filename;
}
public String getFiletype() {
return this.filetype;
}
public int getEncoding() {
return this.encoding;
}
}
Заключительный шаг. Отправка сообщения

       memo.send();
// дооформить MIME и сохранить письмо
public void send() {
try {
lotus.domino.MIMEEntity child = null;
if (!this.memo.hasItem("PostedDate"))
this.memo.replaceItemValue("PostedDate", this.memo.getCreated()); // установить дату отправки
if (this.plaintext != null) { // создать MIME-секцию для текста сообщения
child = this.mime.createChildEntity();
child.setContentFromText(this.plaintext, "text/plain;charset=UTF-8", lotus.domino.MIMEEntity.ENC_IDENTITY_8BIT);
this.plaintext.close();
}
if (this.files != null) { // вставить файловые сообщения
for (int i = 0; i < this.files.size(); i++) {
ru.medkirov.mail.MIMEFile file = (ru.medkirov.mail.MIMEFile) this.files.get(i);
this.addFile(file);
}
this.files.clear();
this.files = null;
}
this.memo.closeMIMEEntities(true, "Body");
this.memo.save();
this.memo = null;
}
catch (Exception ex) {}
}
protected void addFile(ru.medkirov.mail.MIMEFile file) {
try {
lotus.domino.Stream content = file.getContent();
lotus.domino.MIMEEntity child = this.mime.createChildEntity();
child.setContentFromText(content,
"application/".concat(file.getFiletype()).concat(";filename=\"").concat(file.getFilename()).concat("\""),
file.getEncoding());
lotus.domino.MIMEHeader header = child.createHeader("Content-Disposition");
header.setHeaderVal("attachment; filename=\"".concat(file.getFilename()).concat("\""));
header = child.createHeader("Content-Description");
header.setHeaderVal(file.getFilename());
content.close();
}
catch (Exception ex) {}
}
Результат

Subject: =?KOI8-R?B?8NLJ18XULCDNydIh?=
Sender: =?KOI8-R?B?4cfFztQgyc7UxcfSwcPJyQ==?=<services-mail@acme.corp>
From: =?KOI8-R?B?8M/e1MEg08XS18nTz9cv8M/e1ME=?= <0xL5CFEEF7F2E0z_0xL5F1E5F0E2E8F1EEE2z/0xL5CFEEF7F2E0z%Acme@Work.Local>
Date: Wed, 20 Jan 2021 10:04:33 +0300
charset: windows-1251
MIME-Version: 1.0
X-MIMETrack: Itemize by Agent Manager on SiteReserve/Internet/ACME/RU(Release
8.5.3|September 15, 2011) at 20.01.2021 10:04:33,
Serialize by Notes Client on Nick A Norkin/VIT/RU(Release 7.0.3|September
26, 2007) at 23.01.2021 11:07:11
Content-Type: multipart/related;
boundary="=NextPart_-"


--=NextPart_-
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: quoted-printable

=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D1=8B =D0=B4=D0=B0=D0=BD=D0=BD=
=D1=8B=D0=B5=0A=

--=NextPart_-
Content-Type: application/text/plain;filename="=?UTF-8?B?0J/RgNC40LLQtdGCLCDQvNC40YAhLnR4dA==?="
Content-Disposition: attachment;
 filename="=?UTF-8?B?0J/RgNC40LLQtdGCLCDQvNC40YAhLnR4dA==?="
Content-Description: =?UTF-8?B?0J/RgNC40LLQtdGCLCDQvNC40YAhLnR4dA==?=
Content-Transfer-Encoding: base64

0JfQtNGA0LDQstGB0YLQstGD0Lks0LzQuNGAIQ==


--=NextPart_---

Ссылки

Java в Domino. Вывод в поток присоединённых файлов

Java в Domino. Получение файловых элементов дизайна приложений Domino в виде потоковых данных

Как заменить адрес отправителя в письме, отправляемом программно

Код класса Memo.java

Код класса MIMEFile.java

Java в Domino. Библиотека Memo

Код библиотеки Memo

Пример обработки файловых потоков. Работа с бланком Microsoft Excel
 
  Опубликовано — 01/23/2021 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU