powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
4 сообщений из 4, страница 1 из 1
Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
    #40011576
Chula
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Уважаемые!

Столкнулся со следующей проблемой.
Из общего пула входящей почтовой информации (подчеркиваю, именно почтовой) кодом макроса, анализируя последовательно все содержимое в папке "Входящие" каким-то удивительным образом вычисляю сообщения, которые требуют определенной обработки.
Успешно произведя экзекуции над этим сообщением, формирую ответ (именно ответ, а не создаю новое сообщение) и отправляю адресату.
Теперь лишь хочу это полученное почтовое сообщение и сформированный и отправленный программным путем свой ответ на него перенести в специально созданные хранилища информации, например, полученное письмо переместить в папку "Входящие" -> "Тема" -> "Обработанные", а ответ в папку "Входящие" -> "Тема" -> "Отвечено" программным методом.
Поскольку эти взаимосвязанные почтовые сообщения я воспринимаю как беседа, то для идентификации этих сообщений я использую свойство ConversationID.
Осознавая, что появление ответа в папке "Отправленные" занимает некоторое количество времени, специально ввожу бесконечный цикл, предусматривая принудительный выход из него при выполнении определенных условий, важнейшим из которых является обнаружение сообщения с нужным свойством ConversationID.
И Outlook прекрасно меня понимает, чего я от него хочу, когда я пошагово прохожу по коду, но стоит это запустить на автомате, он зацикливается, пока не приобретает истинность условия превышения заданного лимита времени.
При тестировании сам на себе, обратил внимание, что пока я не получу системного уведомления, что поступило письмо в виде ответа, то макрос, код которого привожу ниже, входит в состояние рекурсии.

Помогите, люди добрые, разобраться с проблемой. Объясните, чего я недопонимаю и/или не догоняю для решения своей задачи.
Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Sub Testing()
Dim oOutlook As New Outlook.Application
Dim oNamespace As Outlook.NameSpace
Dim myFolder As Outlook.Folder
Dim oItem As Object
Dim oMailReply As MailItem
Dim I As Integer, J As Integer, IDConversatMsg As String
dim StartTimer as Single, NextValTimer as Single

Set oNamespace = oOutlook.GetNamespace("MAPI")
Set myFolder = oNamespace.GetDefaultFolder(olFolderInbox)
Set myFolderSend = oNamespace.GetDefaultFolder(olFolderSentMail)
Set myFolderArhiveIn = oNamespace.GetDefaultFolder(olFolderInbox).Folders("Тема").Folders("Обработанные")
Set myFolderArhiveTo = oNamespace.GetDefaultFolder(olFolderInbox).Folders("Тема").Folders("Отвечено")
Set oItem = myFolder.Items
Set oItemReply = myFolderSend.Items
          
For I = oItem.Count To 1 Step -1
    Set oMailReply = oItem(I).Reply
    oMailReply.HTMLBody = "Спасибо! Получено и обработано. " & vbCrLf & oMailReply.HTMLBody
    oMailReply.Save 'сохранение созданного ответного сообщения
    IDConversatMsg = oItem(I).ConversationID
    oMailReply.Send
    'Отслеживание появления ответного почтового сообщения в папке "Отправленные"
    StartTimer = Timer
    Do While True
        DoEvents
        For J = oItemReply.Count To 1 Step -1
            If oItemReply(J).ConversationID = IDConversatMsg Then
                oItemReply(J).Move myFolderArhiveTo
                oItem(I).Move myFolderArhiveIn
                GoTo 1:
            End If
        Next
        NextValTimer = Timer
        If (NextValTimer - StartTimer) / 60 > 3 Then
            MsgBox "ПРОБЛЕМЫ!!!"
            GoTo 1:
        End If
    Loop
Next
1: Set oOutlook.ActiveExplorer.CurrentFolder = myFolderArhiveTo
End Sub
...
Рейтинг: 0 / 0
Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
    #40011939
ldfanate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а там разве нельзя для отправляемого ответного сообщения программно проверить свойство .Sent ?
...
Рейтинг: 0 / 0
Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
    #40015813
Chula
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И снова здравствуйте!
Всем, кто просмотрел проблему, спасибо!
Блуждая по бесконечным просторам инета в поисках подсказок к решению своей задачи, я наткнулся на статью одного исследователя, которая и подсказала практически весь код (дай бог автору здоровья и детишек побольше).

Ежели кому интересно, делюсь законченным решением данной задачи.
Итак, есть первоначальный код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Sub Testing()
Dim oOutlook As New Outlook.Application
Dim oNamespace As Outlook.NameSpace
Dim myFolder As Outlook.Folder
Dim oItem As Object
Dim oMailReply As MailItem
Dim I As Integer, J As Integer, IDConversatMsg As String
dim StartTimer as Single, NextValTimer as Single

Set oNamespace = oOutlook.GetNamespace("MAPI")
Set myFolder = oNamespace.GetDefaultFolder(olFolderInbox)
Set myFolderSend = oNamespace.GetDefaultFolder(olFolderSentMail)
Set myFolderArhiveIn = oNamespace.GetDefaultFolder(olFolderInbox).Folders("Тема").Folders("Обработанные")
Set myFolderArhiveTo = oNamespace.GetDefaultFolder(olFolderInbox).Folders("Тема").Folders("Отвечено")
Set oItem = myFolder.Items
Set oItemReply = myFolderSend.Items
          
For I = oItem.Count To 1 Step -1
    Set oMailReply = oItem(I).Reply
    oMailReply.HTMLBody = "Спасибо! Получено и обработано. " & vbCrLf & oMailReply.HTMLBody
    oMailReply.Save 'сохранение созданного ответного сообщения
    IDConversatMsg = oItem(I).ConversationID
    oMailReply.Send
Next
Set oOutlook.ActiveExplorer.CurrentFolder = myFolderArhiveTo
End Sub



Перед вызовом этого кода формируем новый класс:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private WithEvents olSentItems As Items

Private Sub Class_Initialize()
'Объявление и создание объекта отправленное почтовое сообщение
Dim olSentItemsFolder As MAPIFolder
Set olSentItemsFolder = Application.Session.GetDefaultFolder(olFolderSentMail)
Set olSentItems = olSentItemsFolder.Items
End Sub

Private Sub olSentItems_ItemAdd(ByVal Item As Object)
    'Если в папке "Отправленные" обнаружено потовое сообщение с проверяемой Id беседой, переносим ее в директория хранения
    If Item.Class = olMail Then
        If Item.ConversationID = IDConversatMsg Then
            Item.Move Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Folders("Папка хранения, определяемая пользователем")
    End If
End Sub



Результатом метода Send является создание объекта почтового сообщения в папке "Отправленные", ввиду чего срабатывает код обработки события создания нового объекта в этой папке. Далее просто по коду...
...
Рейтинг: 0 / 0
Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
    #40015814
Chula
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, забыл указать маленький нюанс
Чтобы почтовые сообщения - входящие и исходящие себя друг друга находили по ID беседы, необходимо не забыть связующий идентификатор публично объявить в каком-либо модуле:
Код: vbnet
1.
Public IDConversatMsg As String
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Outlook. Перенос обработанного сообщения и ответа на него из одних папок в другие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]