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

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

AndryG

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

Используя COM (скрипт на PHP, но это не имеет значения в данном случае) подключаюсь к базе, просматриваю эту папку, обрабатываю каждый документ и переношу его в архивную папку.
Код:
 $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";
В папке имею пять док. При запуске скрипта сперва обрабатывается три, при следующем - два.
Если убрать строку удаления документа - все пять при первом запуске.

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

Откройте секрет ... в чем загвоздка ... понимаю, что теряется ссылка на след. документ ... но как исправить - не могу придумать.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Я бы взял коллекцию записей в папке с помощью NotesViewEntryCollection. И обрабатывал бы эту коллекцию.
 
A

AndryG

метод NotesDataBase->Search() -- возвращает коллекцию документов по ВСЕЙ базе ... в том числе и с уже обработанными доками в папке архива. :rolleyes: (как бы отобрать только нужное ...)

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

Может есть более элегантное решение?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Я предлагал что-то типа этого:
Код:
...
Set vc = NotesView.AllEntries
Set ve = vc.GetFirstEntry( )
While Not (ve is Nothing)
If ve.IsDocument Then
Set doc = ve.Document
...
Call doc.PutInFolder(...)
Call doc.RemoveFormFolder(...)
End If
Set ve = vc.GetNextEntry(ve)
Wend
 
A

AndryG

Спасибо! Заработало ... всё забрало с первого прохода.

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

Глубоко и серьезно Лотус я изучать не собираюсь (просто столкнулся с ним) но в общих чертах узнать бы, что за беда была...
___
P.S. Вдруг кому интересно будет ...
Код:
 $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);
}
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Если не лень ... можете пояснить в двух словах, что такое Entry и в чем отличие от Document?
Entry - строка в представлении. Может быть как документом, так и категорией, например.

И почему первый вариант не работал?
Нужно было использовать обновление(notesView.Refresh), чтобы получать актуальное состояние папки после удаления. Но при этом кем-нибудь в папку могли бы добавляться/удаляться документы. Да и медленнее это. Поэтому лучше взять коллекцию и обработать её.
 
A

AndryG

Понятно ... понятно, что "поверхам" не осилить :)

Ее вопрос небольшой - третий день не могу пометить письмо как прочитанное :(
Где этот флаг в документе прячется? Или он вне документа живет?
 
A

Akupaka

этот флаг прячется в спец. таблице вне базы... если то, что я знаю - правда, то эта таблица на самом клиенте строится...
попробуйте метод notesDocument.Save( force, createResponse [, markRead ] )
 
A

AndryG

Код:
 $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 третим параметром для прочтенных и новых писем -- признак прочтения не изменяется.
 
A

Akupaka

подожди :)
признак прочтения где не меняется? у какого пользователя? где и от чьего имени выполняется вышеуказанный код?
 
A

AndryG

У меня на компе стоит LotusNotes.
PHP cкрипт через COM подключается под моей же (я так думаю) учетной записью и шерстит почту.
подключение
Код:
 $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-интерфейсе разобрался.
Лень заставила взяться за написание скрипта :)
 
A

Akupaka

хм... чесгря, не знаю, работает ли через КОМ этот параметр...
а без ПХП, эту обработку никак? в смысле, в самом клиенте нельзя сделать?
 
A

AndryG

Меня бы устроил агент, дабы при попадании писем в папку "ABC" они превращались в прочитанные, но я обладаю минимумом прав ... и не могу создать агента.
А больше вариантов у меня нет в голове.
Если через COM добраться до этого флага нельзя - значит придется смириться.
 
A

Akupaka

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

AndryG

Это сильно круто :)

Спасибо за помощь. Будем считать вопрос закрытым.
 
Мы в соцсетях:

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