Не обрабатываются все письма во входящих

Автор Тема: Не обрабатываются все письма во входящих  (Прочитано 9680 раз)

Kasher

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Добрый день!

Написала модуль, который разбирает входящие сообщения. Написан в Visual Studio 2005 на VB.NET. Планируется, что он будет запускаться автоматом через каждую минуту.
Его задача делать следующее: берет пришедшее письмо, сохраняет из него вложение (это xml-файл) в папку на компьютере, после этого перемещает данное письмо в другую папку "Loaded" в Lotus, а из Входящих удаляет.

Когда написано вот так:

If Not (nDoc1 Is Nothing) Then
                Call nDoc1.PutInFolder("Loaded", False) ' помещение письма в папку Loaded
                nDoc1.RemoveFromFolder("($Inbox)") ' удаление письма из папки Входящие
            End If

то получается, что модуль отрабатывает не больше 3 писем, хотя во Входящих может лежать 10 писем. Т.е. программа думает, что входящих больше нет и останавливается.


А если написано вот так, то отрабатываются все письма:

If Not (nDoc1 Is Nothing) Then
                nDoc1.remove(True)
            End If

но соответственно, письма не помещаются в папку "Loaded", а только удаляются из Входящих.

Подскажите пожалуйста, как нужно все-таки правильно написать это самое перемещение и при этом отработать все входящие письма?

Kasher

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
все, что удалось пока найти по своей проблеме это вот

http://web3.inttrust.ru/Site/itforum.nsf/all/33B9BACBD9E52BFAC32576E100235405?OpenDocument

но честно сказать так и не поняла, решилась там проблема эта или нет. Помогите разобраться пожалуйста.

Kasher

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Проблему решила следующим образом:

Sub Main()
Dim s As New NotesSession
        Dim db As NotesDatabase
        Dim View As Object
        Dim nDoc As Object
        Dim nDoc1 As Object
        Dim itm As Object
        Dim sPathToSave As String

sPathToSave = "C:\temp\lotus\"
        Const RICHTEXT = 1
        Const EMBED_ATTACHMENT = 1454
        s.Initialize("password")
        db = s.GetDatabase("test/test2/ru", "orders.nsf", False)
        View = db.GetView("($Inbox)")
        View.AutoUpdate = False
        nDoc = View.GetFirstDocument
        While Not (nDoc Is Nothing)
            nDoc = View.GetFirstDocument
            If nDoc.HasEmbedded Then
                itm = nDoc.GetFirstItem("Body")
                If itm.Type = RICHTEXT Then
                    Dim attch As Object
                    For Each attch In itm.EmbeddedObjects
                        If (attch.Type = EMBED_ATTACHMENT) Then

                            attch.ExtractFile(sPathToSave & attch.Name)
                           
                        End If
                    Next
                End If

            End If

            nDoc1 = nDoc
            nDoc = View.GetNextDocument(nDoc)
            'удаление письма
            If Not (nDoc1 Is Nothing) Then
                Call nDoc1.PutInFolder("Loaded", False) ' помещение письма в папку Loaded
                nDoc1.RemoveFromFolder("($Inbox)") ' удаление письма из папки Входящие
            End If

        End While

    End Sub

Т.е. продублировала строку

nDoc = View.GetFirstDocument
        While Not (nDoc Is Nothing)
            nDoc = View.GetFirstDocument

И все, проблема решилась, модуль разбирает все входящие письма.

ViV

  • Global Moderator
  • Профессионал
  • *****
  • Сообщений: 1428
  • Владимир Егоров
    • Просмотр профиля
    • lotusnotes.ru
    • E-mail
Спасибо за описание решения!

cybergeene

  • Специалист
  • ***
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Не обрабатываются все письма во входящих
« Ответ #4 : 14 Ноябрь 2011, 11:40:38 »
ИМХО может не всегда работать,  лучше как на интертастовском форуме:


Set DocNext = dc.GetFirstDocument

While Not(docnext Is Nothing)
Set doc = docNext ' получаем ссылку на doc, который нам уже не нужен,
Set docnext = dc.GetNextDocument(doc) ' т.к. следующий у нас уже есть ))
'...
Call doc.PutInFolder("Loaded", False) 'делаем с doc что угодно, да хоть  Delete doc (у нас в "буфере" docnext)
Call doc.RemoveFromFolder("($Inbox)")
'... а документик то уже тю-тю,нету его больше в коллекции, не счего уже получать GetNextDocument
 
Wend


Так что никакой мистики нет: удаляете док из коллекции с помощью Call doc.RemoveFromFolder("($Inbox)"), поэтому и не можете на основе его получить следующий документ.
« Последнее редактирование: 14 Ноябрь 2011, 11:44:54 от cybergeene »