Перебор всех писем во всех папках MS Outlook

Программирование на Visual Basic for Applications
LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 06.01.2009 (Вт) 15:39

Господа, подскажите плз как перебрать (на VBA) все письма во всех папках в pst файле (кроме sent items - нужны только входящие письма)?
Из каждого входящего письма нужно взять имя отправителя.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Перебор всех писем во всех папках MS Outlook

Сообщение alibek » 11.01.2009 (Вс) 9:46

Буквально две недели назад RayShade уже отвечал на подобный вопрос.
Lasciate ogni speranza, voi ch'entrate.

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 11.01.2009 (Вс) 14:26

Ответа двухнедельной давности я не нашел, нашел вот эту тему от июля прошлого года.
Однако в той теме нет ответа на мой вопрос.

Следующим кодом можно перебрать папки в текущем pst файле:
Код: Выделить всё
Public Sub ListFolders()
    Dim oOutlook As New Outlook.Application
    Dim oNamespace As Outlook.NameSpace
    Dim oChildFolder As Outlook.MAPIFolder
    Set oNamespace = oOutlook.GetNamespace("MAPI")
    Dim oFolder As Outlook.MAPIFolder
   
    Set oFolder = Application.Session.GetDefaultFolder(olFolderInbox)
   
    For Each oChildFolder In oFolder.Parent.Folders
        DoFolder oChildFolder
    Next
End Sub

Public Sub DoFolder(ByVal oFolder As MAPIFolder)
    Dim oChildFolder As Outlook.MAPIFolder
    For Each oChildFolder In oFolder.Folders
      Debug.Print oChildFolder.Name & " - " & oChildFolder.Parent
      DoFolder oChildFolder
    Next
End Sub


Но как сделать то же самое со всеми pst файлами (и не включать другие папки типа Public Folders)?

Кстати, как определить имя pst файла, где находится текущая папка oChildFolder?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Перебор всех писем во всех папках MS Outlook

Сообщение RayShade » 11.01.2009 (Вс) 15:14

Не надо определять имен файлов. Надо просто перебирать коллецию фолдеров. Не хочешь смотреть паблик фолдеры, смотри имя и тип конкретной папки и на основании этого делай что надо. Можно получать не просто список всех папок в inbox, можно просто получать список всех подключенных папок, и у же в них смотреть что внутри.
I don't understand. Sorry.

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 14.01.2009 (Ср) 10:45

а вот еще вопрос -
Как при переборе писем определить входящее ли письмо или исходящее (не прибегая к проверке имен папок и поля отправителя)? И как при переборе писем исключить из обработки meeting requests, сообщения сервера (типа письмо не доставлено) и т.п.?
Где-то вроде видел решение, но почему-то не могу его больше найти.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Перебор всех писем во всех папках MS Outlook

Сообщение RayShade » 14.01.2009 (Ср) 12:57

Проверяй typeof. Это должен быть olmailitem. А насчет входящего - так собственно, типа парента и определяет, какое это письмо или нет :) Ну еще можно проверять проперть sent, - если true то было отправлено :)
I don't understand. Sorry.

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 14.01.2009 (Ср) 14:23

а каков синтаксис использования typeof?
попробовал
Код: Выделить всё
If TypeOf oMailItem Is olMailItem Then

не работает.
В справке тоже информацию не нашел.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Перебор всех писем во всех папках MS Outlook

Сообщение RayShade » 14.01.2009 (Ср) 15:22

Приведенное тобой выражение всегда вернет true :)
Надо вот так:

Код: Выделить всё
dim myvar as object
myvar = application.session.getdefaultfolder(olfolderinbox).items(0)
if typeof myvar is mailitem then msgbox("Oh fuck, it's an email!")
I don't understand. Sorry.

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 14.01.2009 (Ср) 16:07

хм. мой код не будет всегда возвращать true, т.к. oMailItem - это объект, который определен как
Код: Выделить всё
For Each oMailItem In oChildFolder.Items

т.е. получается, что я делаю то же самое. ошибка была в другом. тип письма - mailitem, а я написал olMailItem

только вот даже с такой проверкой код не работает корректно. останавливается на meeting request'e c ошибкой о несовпадении типов в строке
Код: Выделить всё
Debug.Print oMailItem.Subject & " / " & oMailItem.SenderName & " (" & oChildFolder.Name & " - " & oChildFolder.Parent & ")"

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 16.01.2009 (Пт) 9:52

господа, помогите плз...

LA_
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 10.10.2008 (Пт) 13:14

Re: Перебор всех писем во всех папках MS Outlook

Сообщение LA_ » 16.01.2009 (Пт) 12:20

вроде разобрался..
ошибка была в этом коде:
Код: Выделить всё
Dim oMailItem As Outlook.MailItem
...
For Each oMailItem In oChildFolder.Items

oChildFolder.Items возвращает не только объекты типа MailItem, а все объекты, включая meeting invitations.
Заменил этот код на следующий
Код: Выделить всё
Dim oMailItem As Object
...
For Each oMailItem In oChildFolder.Items
  If TypeOf oMailItem Is MailItem And Not oMailItem Is Nothing Then

теперь вроде все работает

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Перебор всех писем во всех папках MS Outlook

Сообщение RayShade » 16.01.2009 (Пт) 13:01

If TypeOf oMailItem Is MailItem And Not oMailItem Is Nothing Then - выделенная жирным часть кода лишняя.
I don't understand. Sorry.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49

    TopList