Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/149: Рейтинг темы: голосов - 149, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31

Обработка документов и перенос в другую папку на PHP

04.08.2008, 10:29. Показов 27593. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Свела судьба с Лотусом ... учусь разбирать почту.
В папку spider\atm\upc с помощью правил в Notes переносятся пришедшие документы.

Используя COM (скрипт на PHP, но это не имеет значения в данном случае) подключаюсь к базе, просматриваю эту папку, обрабатываю каждый документ и переношу его в архивную папку.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 $n_session = new COM("Lotus.NotesSession");
$n_session->initialize($conf->get(notes_password)); // Подключаемся ...
$n_dir = $n_session->GetDbDirectory($conf->get(notes_server))->
OpenMailDatabase()->
GetView(spider\atm\upc); // получаю объект папки
$n_doc = $n_dir->GetFirstDocument();
while(is_object($n_doc)){
/* здесь была обработка документа ... она работает нормально */
$n_doc_next = $n_dir->GetNextDocument($n_doc); // получаем объект следующего док.
$n_doc->PutInFolder(spider\arh\atm-upc); // копируем в архив
$n_doc->RemoveFromFolder($n_dir->name); //удаляем текущий док из рабочей папки !!!!! ПРОБЛЕМА
print_r($n_doc->GetItemValue(Subject)); //отладочная штука - дабы видеть, сколько доков обработали
$n_doc = $n_doc_next; //Следующий док становится текущим.
}
echo "End of script.\n";
В папке имею пять док. При запуске скрипта сперва обрабатывается три, при следующем - два.
Если убрать строку удаления документа - все пять при первом запуске.

Документы приходили на ящик тоже сперва два, потом (через пару часов) три - так "группами" и обрабатываются.

Откройте секрет ... в чем загвоздка ... понимаю, что теряется ссылка на след. документ ... но как исправить - не могу придумать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.08.2008, 10:29
Ответы с готовыми решениями:

Как скопировать папку с файлами в другую папку с заменой средствами php?
Как скопировать папку с файлами в другую папку с заменой средствами php? Из "Z:/home/post.ru/www/style/" в...

Перенос Документов Из Одной Бд В Другую
Всем привет! Есть несколько БД с одинаковой структурой (дизайн обновляется из одного шаблона), задача в следущем: Необходимо...

Перенос Wordpress в другую корневую папку
Здравствуйте. Не давно нужно было перенести сайт в другой корневой каталог. Был он к примеру с адресом - http://site.com.ua, а стал с -...

14
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
04.08.2008, 10:37
Я бы взял коллекцию записей в папке с помощью NotesViewEntryCollection. И обрабатывал бы эту коллекцию.
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
04.08.2008, 13:52
метод NotesDataBase->Search() -- возвращает коллекцию документов по ВСЕЙ базе ... в том числе и с уже обработанными доками в папке архива. (как бы отобрать только нужное ...)

метод NotesView->GetAllDocumentsByKey() -- массив поиска задавать ... как?
Под каждое поле View задаем элемент таблицы соответствующего типа и с нужной маской?
Представление ($inbox) - шесть полей ... но скрипт не ругается только при двух элементах в таблице... видать полей много, но индексированные только два (догадка ) .. как узнать, что это за поля?
маски поиска .. стандартные * ?

Может есть более элегантное решение?
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
04.08.2008, 14:28
Я предлагал что-то типа этого:

Code
1
2
3
4
5
6
7
8
9
10
11
12
...
Set vc = NotesView.AllEntries
Set ve = vc.GetFirstEntry( )
While Not (ve is Nothyng)
If ve.IsDocument Then
Set doc = ve.Document
...
Call doc.PutInFolder(...)
Call doc.RemoveFormFolder(...)
End If
Set ve = vc.GetNextEntry(ve)
Wend
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
04.08.2008, 16:46
Спасибо! Заработало ... всё забрало с первого прохода.

Если не лень ... можете пояснить в двух словах, что такое Entry и в чем отличие от Document?
И почему первый вариант не работал?

Глубоко и серьезно Лотус я изучать не собираюсь (просто столкнулся с ним) но в общих чертах узнать бы, что за беда была...
___
P.S. Вдруг кому интересно будет ...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 $n_session = new COM("Lotus.NotesSession");
$n_session->initialize($conf->get(notes_password));
$n_list = $n_session
->GetDbDirectory($conf->get(notes_server))
->OpenMailDatabase()
->GetView(spider\atm\upc)
->AllEntries;
echo "Docs: ".$n_list->Count."\n";
$n_entry = $n_list->GetFirstEntry();
while(is_object($n_entry)){
if($n_entry->IsDocument){
$n_doc = $n_entry->Document;
echo  Date: .$n_doc->GetFirstItem("PostedDate")->text."\n";
$n_doc->PutInFolder(spider\arh\atm-upc);
$n_doc->RemoveFromFolder(spider\atm\upc);
}
$n_entry = $n_list->GetNextEntry($n_entry);
}
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
04.08.2008, 17:26
Цитата Сообщение от AndryG
Если не лень ... можете пояснить в двух словах, что такое Entry и в чем отличие от Document?
Entry - строка в представлении. Может быть как документом, так и категорией, например.



Цитата Сообщение от AndryG
И почему первый вариант не работал?
Нужно было использовать обновление(notesView.Refresh), чтобы получать актуальное состояние папки после удаления. Но при этом кем-нибудь в папку могли бы добавляться/удаляться документы. Да и медленнее это. Поэтому лучше взять коллекцию и обработать её.
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
10.08.2008, 17:10
Понятно ... понятно, что "поверхам" не осилить

Ее вопрос небольшой - третий день не могу пометить письмо как прочитанное :(
Где этот флаг в документе прячется? Или он вне документа живет?
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
10.08.2008, 17:24
этот флаг прячется в спец. таблице вне базы... если то, что я знаю - правда, то эта таблица на самом клиенте строится...
попробуйте метод notesDocument.Save( force, createResponse [, markRead ] )
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
10.08.2008, 19:53
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 $n_entry = $n_list->GetFirstEntry();
while(is_object($n_entry)){ //проходим по докам в папке ящика
if($n_entry->IsDocument){
$n_doc = $n_entry->Document;
...
while($n_doc->HasItem($FILE)){//проходим по всем аттачам письма
...
$n_filenameitem->Remove;
} // while по $FILE
$n_doc->Save(true,false,true);   // СОХРАНЕНИЕ С СНЯТИЕМ МЕТКИ О ПРОЧТЕНИИ
$n_doc->PutInFolder(spider\arh\atm-upc);
$n_doc->RemoveFromFolder(spider\atm-upc);
} // if IsDoc
$n_entry = $n_list->GetNextEntry($n_entry);
} // while по entry
При таком раскладе из писем благополучно исчезают вложения (от этого нужно избавится), что означает, что документ сохраняется ... но "признак прочтения" не изменяется никак.
Пробовал и false и true третим параметром для прочтенных и новых писем -- признак прочтения не изменяется.
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
11.08.2008, 11:41
подожди
признак прочтения где не меняется? у какого пользователя? где и от чьего имени выполняется вышеуказанный код?
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
11.08.2008, 12:53
У меня на компе стоит LotusNotes.
PHP cкрипт через COM подключается под моей же (я так думаю) учетной записью и шерстит почту.
подключение

Code
1
2
3
4
5
6
 $n_session = new COM("Lotus.NotesSession"); // создаем объект сессии
$n_session->initialize($conf->get(password,notes)); // подключаемся
 
//Через кучу методов/свойств получаем объект "вхождений" указанной папки почты
$n_list = $n_session->GetDbDirectory($conf->get(server,notes))->OpenMailDatabase()->GetView(spider\atm-upc)->AllEntries;
//дальше идет код с поста выше
Ложу в папку пару "прочтенных" и "непрочтенных" доков с вложениями - запускаю скрипт.
Документы перекладываются в другую папку, из них удаляются вложения (временный глюк), статус прочтения не изменяется.

Сам я админом сей системы не являюсь и о работе ее знаю .. ровно сколько в COM-интерфейсе разобрался.
Лень заставила взяться за написание скрипта
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
11.08.2008, 13:00
хм... чесгря, не знаю, работает ли через КОМ этот параметр...
а без ПХП, эту обработку никак? в смысле, в самом клиенте нельзя сделать?
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
11.08.2008, 14:57
Меня бы устроил агент, дабы при попадании писем в папку "ABC" они превращались в прочитанные, но я обладаю минимумом прав ... и не могу создать агента.
А больше вариантов у меня нет в голове.
Если через COM добраться до этого флага нельзя - значит придется смириться.
0
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
11.08.2008, 15:56
я имел ввиду вообще сделать все то, что ты делаешь не через внешнюю программу, а с помощью средств лотуса
если нету прав на конкретную базу, то можно сделать свою локальную в которой будет нужный код, обрабатывающий доки в другой базе...
0
0 / 0 / 0
Регистрация: 12.07.2008
Сообщений: 31
11.08.2008, 16:08
Это сильно круто

Спасибо за помощь. Будем считать вопрос закрытым.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2008, 16:08
Помогаю со студенческими работами здесь

Webbrowser перенос кэша в другую папку и загрузка от туда
Нужна помощь помогите, как можно реализовать так, чтобы кэш грузился в "свою" нужную мне директорию и после этого подгружался от...

Поиск и перенос файлов *.jpeg *.png *.jpg в другую папку
Get-ChildItem e:\img -Recurse -include *png,*jpg,*bmp,*jpeg После этого находит все файлы с указанным расширением в папке, но не могу...

Обработка. Поиск дублей и перемещение в другую папку(корзина)
1С:Предприятие 8.3 (8.3.10). В 1с совсем недавно, помогите пожалуйста. Есть справочник Номенклатура, в этом справочнике есть большое...

Поиск одинаковых файлов в папке и перенос копий в другую папку (оптимизация кода)
Программа ищет одинаковые файлы в папке где сама находится(по маске или расширению), по хэшу, и перемещает все копии в отдельную папку. ...

PHP перенос проекта на другую ОС
Здравствуйте. Писал проект на виндовс с PHP,JS. Без использования каких либо фреймворков. Решил перенести проект на ubuntu. Вообщем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru