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

Тема в разделе "Lotus - Программирование", создана пользователем AndryG, 5 авг 2008.

  1. AndryG

    AndryG Гость

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

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

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я бы взял коллекцию записей в папке с помощью NotesViewEntryCollection. И обрабатывал бы эту коллекцию.
     
  3. AndryG

    AndryG Гость

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

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я предлагал что-то типа этого:
    Код (Text):
    ...
    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
     
  5. AndryG

    AndryG Гость

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

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Entry - строка в представлении. Может быть как документом, так и категорией, например.

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

    AndryG Гость

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    этот флаг прячется в спец. таблице вне базы... если то, что я знаю - правда, то эта таблица на самом клиенте строится...
    попробуйте метод notesDocument.Save( force, createResponse [, markRead ] )
     
  9. AndryG

    AndryG Гость

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    подожди :)
    признак прочтения где не меняется? у какого пользователя? где и от чьего имени выполняется вышеуказанный код?
     
  11. AndryG

    AndryG Гость

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    хм... чесгря, не знаю, работает ли через КОМ этот параметр...
    а без ПХП, эту обработку никак? в смысле, в самом клиенте нельзя сделать?
     
  13. AndryG

    AndryG Гость

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    я имел ввиду вообще сделать все то, что ты делаешь не через внешнюю программу, а с помощью средств лотуса
    если нету прав на конкретную базу, то можно сделать свою локальную в которой будет нужный код, обрабатывающий доки в другой базе...
     
  15. AndryG

    AndryG Гость

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

    Спасибо за помощь. Будем считать вопрос закрытым.
     
Загрузка...
Похожие Темы - Обработка документов перенос
  1. kolka
    Ответов:
    6
    Просмотров:
    254
  2. anna
    Ответов:
    9
    Просмотров:
    885
  3. FaRReLL
    Ответов:
    0
    Просмотров:
    869
  4. crow1986
    Ответов:
    8
    Просмотров:
    1.875
  5. Dazzel
    Ответов:
    1
    Просмотров:
    948

Поделиться этой страницей