Centrum Skrypciarzy - Microsoft Office

Czy można napisać skrypt łączący się z wszystkimi podfolderami skrzynki odbiorczej programu Outlook?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Czy można napisać skrypt łączący się z wszystkimi podfolderami skrzynki odbiorczej programu Outlook?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Czy możliwe jest napisanie skryptu łączącego się ze wszystkimi podfolderami programu Outlook?

-- MB

Cześć Skrypciarze! Odpowiedź

Cześć, MB. Szczerze mówiąc, jeśli przez niemal dwa lata pisze się codzienny artykuł skrypciarski, nie sposób nie zauważyć, że niektóre tematy są tabu. Czy można tu omawiać kwestie religijne? Kiepski pomysł. Polityczne? W żadnym razie. Sprawy kulinarne? Jak np. konieczność wprowadzenia całkowitego zakazu kładzenia lodów na szarlotkę? Nie ma mowy. To zbyt kontrowersyjne.

Gdybyśmy chcieli być sprytni, dorzucilibyśmy do tej listy funkcje i podprogramy rekursywne, które są zbyt trudne do wyjaśnienia. Ale z drugiej strony, zaczęliśmy już pisać ten skrypt, więc bez sensu byłoby, gdyby dotychczasowa praca poszła na marne. No cóż. Przedstawimy zatem skrypt mogący się połączyć z wszystkimi folderami zawartymi w skrzynce odbiorczej programu Outlook, ale nie obiecujemy, że będziemy dziś w stanie wyjaśnić wszystkie szczegóły jego działania.

Uwaga. Krótki wstęp do funkcji rekursywnych można znaleźć w przewodniku Microsoft Windows 2000 Scripting Guide (j.ang.).

Zaczyna się łatwo (stosunkowo). Oto skrypt, który po prostu wyświetla nazwy wszystkich folderów i podfolderów zawartych w skrzynce odbiorczej programu Outlook:

Const olFolderInbox = 6



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")



Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)



Wscript.Echo objInbox.Name



GetSubfolders(objInbox)



Sub GetSubfolders(objParentFolder)

    Set colFolders = objParentFolder.Folders

    For Each objFolder in colFolders

        Set objSubfolder = objParentFolder.Folders(objFolder.Name)

        Wscript.Echo objFolder.Name

        GetSubfolders objSubfolder

    Next

End Sub
Uwaga. Zwracamy uwagę, że powyższy skrypt zakłada, iż program Microsoft Outlook jest już uruchomiony. Jeśli tak nie jest (albo nie można zakładać, że tak jest), w artykule Office Space (j.ang.) opisano skrypt uruchamiający Outlook.

No cóż, zaczyna się łatwo: definiujemy zmienną o nazwie olFolderInbox i ustawiamy jej wartość na 6; dzięki niej poinstruujemy skrypt, z którym folderem chcemy się połączyć. Poniższe dwa wiersze kodu posłużą nam do utworzenia wystąpienia obiektu Outlook.Application i połączenia z przestrzenią nazw MAPI (jest to zresztą jedyna przestrzeń nazw, z którą się możemy połączyć):

Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Po połączeniu z MAPI wywołujemy metodę GetDefaultFolder i łączymy się ze skrzynką odbiorczą:

Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)

A następnie wyświetlamy nazwę skrzynki odbiorczej:

Wscript.Echo objInbox.Name

Łatwizna.

Niestety w tym momencie zaczynają się kłopoty. W kolejnym kroku wywołujemy podprogram rekursywny GetSubfolders, jako parametr podając odwołanie do skrzynki odbiorczej (obiekt Inbox):

GetSubfolders(objInbox)

Podprogram GetSubfolders wygląda tak:

Sub GetSubfolders(objParentFolder)

    Set colFolders = objParentFolder.Folders

    For Each objFolder in colFolders

        Set objSubfolder = objParentFolder.Folders(objFolder.Name)

        Wscript.Echo objFolder.Name

        GetSubfolders objSubfolder

    Next

End Sub

Przed wykonaniem kolejnego kroku zauważmy, że oprócz odwołania objInbox, podprogram GetSubfolders korzysta z czegoś o nazwie objParentFolder. Nie ma się czym martwić – to nazwa zmiennej używanej na określenie danych przekazywanych do podprogramu. (Mówiliśmy, że niełatwo to wyjaśnić.) Jeśli was to ciekawi, nie martwcie się – w artykule Functions, Subroutines, and How to Call Them From Other Scripts (j.ang.) z serii Sesame Script można znaleźć dodatkowe szczegóły.)

Wewnątrz podprogramu używamy poniższego wiersza kodu, by utworzyć kolekcję podfolderów pierwszego rzędu znajdujących się w skrzynce odbiorczej:

Set colFolders = objParentFolder.Folders

Czy ważne jest zwrócenie uwagi, że chodzi o podfoldery „pierwszego rzędu”, a nie po prostu podfoldery? Owszem. Załóżmy, że skrzynka wygląda tak:

Które z powyższych folderów należą do kolekcji Folders? No właśnie – jedynie Sample i Test; tylko one są podfolderami pierwszego rzędu. Co z Test 2? Jako pod-podfolder, należy on do kolekcji Folders folderu Test: aby się dostać do pod-podfolderów, musimy się połączyć z kolekcją Folders pierwszego rzędu. Dlatego używamy funkcji rekursywnej – zaglądamy do folderu, potem do podfolderów, które się w nim znajdują, a potem do folderów znajdujących się w podfolderach.

Po uzyskaniu kolekcji Folders, możemy uruchomić pętlę For Each, która przejdzie przez wszystkie jej elementy. Wewnątrz pętli zaczynamy od utworzenia odwołania do pierwszego folderu w naszej kolekcji:

Set objSubfolder = objParentFolder.Folders(objFolder.Name)

Po połączeniu się z tym folderem, możemy wywołać echo jego nazwy. Możemy też zrobić coś takiego:

GetSubfolders objSubfolder

No tak, wywołujemy podprogram GetSubfolders z programu GetSubfolders. Dlaczego? Otóż pierwszy folder w naszej kolekcji to Sample; chcemy sprawdzić, czy ma on jakieś pod-podfoldery. W tym momencie ludzie zaczynają się gubić, więc informujemy – zaufajcie nam, że to zadziała. Całość wygląda na bardzo skomplikowaną i taka też jest. Na szczęście najtrudniejsze problemy rozwiązuje za nas VBScript.

Kiedy skończymy, uzyskujemy listę wszystkich folderów i podfolderów znajdujących się w skrzynce odbiorczej:

Inbox

Test

Test 2

Sample

Rzecz jasna, nie chodziło nam o same nazwy folderów, ale o możliwość dostępu do ich zawartości. Teraz to już żaden problem. Poniższego skryptu nie będziemy opisywać; zwróćmy tylko uwagę, że za pomocą kolekcji Items pobieramy wszystkie elementy zawarte w folderze, a wyświetlamy właściwość Subject (temat) każdego z nich. Oczywiście skrypt ten można dowolnie zmodyfikować i wyświetlać za jego pomocą nazwę nadawcy, tekst wiadomości czy cokolwiek innego.

A oto i skrypt:

Const olFolderInbox = 6



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")



Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)



Wscript.Echo objInbox.Name



Set colItems = objInbox.Items



For Each objItem in colItems

    Wscript.Echo objItem.Subject

Next



GetSubfolders(objInbox)



Sub GetSubfolders(objParentFolder)

    Set colFolders = objParentFolder.Folders

    For Each objFolder in colFolders

        Set objSubfolder = objParentFolder.Folders(objFolder.Name)

        Wscript.Echo objFolder.Name



        Set colItems = objFolder.Items



        For Each objItem in colItems

            Wscript.Echo objItem.Subject

        Next



        GetSubfolders objSubfolder

    Next

End Sub

OK. Nie było tak źle, jak się obawialiśmy. Ośmieleni tym sukcesem, być może już jutro przejdziemy do jeszcze trudniejszych pytań: czy Bóg istnieje?

Chociaż, z drugiej strony, może lepiej nie.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Microsoft Office