Centrum skryptów - Microsoft Office

Jak zapisać załączniki wszystkich nowych wiadomości w programie 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.

Jak zapisać załączniki wszystkich nowych wiadomości w programie Outlook?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Testowałem Wasz skrypt na temat zapisywania wszystkich załączników skrzynki odbiorczej programu Outlook (j.ang.) i działa naprawdę super. Czy istnieje jednak taka możliwość, żeby zapisywał załączniki tylko nowych wiadomości email?

-- CN

Cześć Skrypciarze! Odpowiedź

Cześć, CN! Witam Cię serdecznie z pięknego miasta Moscow (tak, Moskwa), tylko że… w stanie Idaho. Co zmusiło całą Skrypciarską rodzinę do tak dalekiej podróży? Otóż nic innego, jak wybujała fantazja Skrypciarskiego Syna (lub raczej kaprys) i jego (niewytłumaczalne) marzenie, żeby rozpocząć studia właśnie na Uniwersytecie Idaho. Czemu nie Alaska? Nie mam pojęcia. Czemu akurat Idaho też nie mam pojęcia, ale obiecuję, że poinformuję czytelników o powodach, jak tylko zostaną mi one wytłumaczone. Na tym etapie nie wnikam.

Jem więc swoje kontynentalne śniadanie (Idaho jest bowiem niezaprzeczalnie na kontynencie, tylko, że innym) i szykuję się powoli do zwiedzania kampusu. Zanim to jednak nastąpi, chciałbym użyć własnej wybujałej wyobraźni (tudzież kaprysu) i pokazać Ci skrypt, który zapisuje załączniki skrzynki odbiorczej programu Outlook, ale robi to tylko z nowymi wiadomościami email:

Const olFolderInbox = 6



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)



Set colItems = objFolder.Items

Set colFilteredItems = colItems.Restrict("[UnRead] = 'True'")



For Each objMessage In colFilteredItems

    intCount = objMessage.Attachments.Count

    If intCount > 0 Then

        For i = 1 To intCount

            objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" &  _

                objMessage.Attachments.Item(i).FileName

        Next

    End If

Next

Największym problemem z całym tym skryptem jest określenie, które wiadomości uważamy za „nowe”, a które utraciły już ten status i są „drugiej świeżości” (tak, wiem, coś takiego jak druga świeżość nie istnieje, chociaż patrząc na moje dzisiejsze śniadanie, może jednak zmienię zdanie w tej kwestii). Dla potrzeb niniejszego skryptu zadecydowałem, że wiadomości nowe to po prostu wiadomości, które nie zostały jeszcze przeczytane. Oczywiście można też stwierdzić, że wszystkie wiadomości nowe to te, które otrzymane były po jakiejś określonej dacie. Jeżeli wolisz tę drugą opcję i raczej ku niej się skłaniasz, to bez nerwów, i taki skrypt podamy na stole, ale to na deser…

Teraz jednak skupmy się na pliku, który zapisuje wszystkie załączniki nie przeczytanych wiadomości skrzynki odbiorczej (bez względu na datę ich otrzymania). W takim wypadku definiujemy najpierw stałą olFolderInbox i ustawiamy jej wartość na 6; używamy jej do poinstruowania programu Outlook, z którą ze skrzynek chcemy pracować. Następnie używamy poniższych trzech wierszy kodu, tworzymy wystąpienie obiektu Outlook.Application i łączymy go z obszarem nazw MAPI, po czym tworzymy odniesienie do obiektu skrzynki odbiorczej:

Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

Po połączeniu się ze skrzynką odbiorczą przy pomocy poniższego wiersza kodu pobieramy kolekcję wszystkich wiadomości email, które się w niej znajdują:

Set colItems = objFolder.Items

Po co nam kolekcja wszystkich wiadomości email? W sumie macie rację, chodzi nam przecież tylko o kolekcję nie przeczytanych wiadomości. Posłużcie się zatem raczej poniższym wierszem kodu:

Set colFilteredItems = colItems.Restrict("[UnRead] = 'True'")

Użyliśmy tu metody Restrict, która filtruje całą kolekcję otrzymanych wiadomości. W tym przypadku ograniczamy nasze wyszukiwanie do tych wiadomości, których właściwość UnRead ustawiona jest na True; co, jak się domyślacie, oznacza, że wiadomości te nie zostały jeszcze przeczytane.

Uwaga: Zastanawia Was zapewne, dlaczego nazwa właściwości ujęta jest w nawias kwadratowy. Niestety, odpowiedź jest tu taka sama jak z wyborem uniwersytetu przez Skrypciarskiego Syna: nie wiemy. Tak to po prostu jest i trzeba się z tym pogodzić.

Po otrzymaniu przefiltrowanej kolekcji (którą nazwaliśmy zaskakująco colFilteredItems) ustawiamy pętlę For Each, która przechodzi przez całą kolekcję. Wewnątrz pętli zaczynamy od pobrania liczby załączników (jeżeli są tam jakieś), które należą do pierwszej wiadomości w kolekcji:

intCount = objMessage.Attachments.Count

Jeżeli wartość właściwości Count jest równa 0, oznacza to dla nas, że w wiadomości nie ma żadnego załącznika. Jeżeli jest większa niż 0, to oczywiście dana wiadomość ma przynajmniej jeden załącznik. Następnie uruchamiamy pętlę, która przechodzi przez wszystkie załączniki danej wiadomości. Dla każdego załącznika przywołujemy metodę SaveAsFile, która zapisuje plik (używając nazwy załącznika FileName) w folderze C:\Temp

objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" &  _

    objMessage.Attachments.Item(i).FileName

Po zapisaniu wszystkich załączników z pierwszej wiadomości email, powtarzamy cały proces i puszczamy pętlę przez kolejną wiadomość w kolekcji.

Uwaga: Domyślamy się, CN, że miałeś jeszcze jedno pytanie dotyczące zmiany nazwy plików podczas ich zapisywania. Tę kwestię omówimy jednak szczegółowo kiedy indziej.

Teraz czas na deser, czyli skrypt, który przechowuje załączniki wszystkich wiadomości email otrzymanych po jakiejś określonej dacie. Oto skrypt, który zapisuje załączniki wiadomości email otrzymanych po północy 1 października 2007:

Const olFolderInbox = 6



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)



Set colItems = objFolder.Items

Set colFilteredItems = colItems.Restrict("[ReceivedTime] > '10/1/2007 12:00 AM'")



For Each objMessage In colFilteredItems

    intCount = objMessage.Attachments.Count

    If intCount > 0 Then

        For i = 1 To intCount

            objMessage.Attachments.Item(i).SaveAsFile "C:\Temp\" &  _

                objMessage.Attachments.Item(i).FileName

        Next

    End If

Next

Wygląda dość znajomo, nieprawdaż? Z jedną różnicą – użyliśmy tu bowiem innego filtra:

Set colFilteredItems = colItems.Restrict("[ReceivedTime] > '10/1/2007 12:00 AM'")

Zawężamy tu zakres zwróconych wiadomości do takich, których właściwość ReceivedTime (czyli data i czas otrzymania wiadomości) jest większa niż 10/1/2007 12:00 AM (czyli północ 01.10.2007). Czy możemy zainstalować tu filtr, który ogranicza nasze wiadomości do otrzymanych w określonym okresie? Oczywiście, że możemy. Oto filtr, który odrzuca wszystko oprócz wiadomości otrzymanych miedzy 01.10.2007 a 02.10.2007:

Set colFilteredItems = colItems.Restrict _

    ("[ReceivedTime] > '10/1/2007 12:00 AM' AND [ReceivedTime] < '10/3/2007 12:00 AM'")

Tak można oczywiście w nieskończoność, ale Skrypciarski Syn już się denerwuje i patrzy na mnie z wielkim wyrzutem. Pozwolę sobie zatem stanowczo nie dokończyć swojego śniadania kontynentalnego (drugiej, lub nawet trzeciej świeżości, ale o świeżości już się chyba kiedyś rozpisywałem…) pod pretekstem bycia pospieszanym przez syna… mam nadzieję, ze nie dogadał się z kelnerką, licząc na jakiś spadek po mojej śmierci na skutek otrucia…

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office