Centrum skryptów - Microsoft Outlook

Jak można usunąć starsze niż sześciomiesięczne, nie przeczytane wiadomości e-mail?

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 można usunąć starsze niż sześciomiesięczne, nie przeczytane wiadomości e-mail?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Wielu użytkowników boryka się z problemem wciąż narastającej liczby nie przeczytanych wiadomości e-mail w skrzynce odbiorczej programu Outlook. Czy istnieje jakiś skrypt, który umożliwiałby automatyczne usuwanie nie przeczytanych wiadomości, które mają więcej niż sześć miesięcy?

-- ST

Cześć Skrypciarze! Odpowiedź

Cześć, ST. Doprawdy, czasem trudno być Skrypciarzem. Ludzie nie przychodzą przecież do Centrum Skryptów, aby uzyskać poradę w sprawach stricte skrypciarskich. Chodzi im głównie o inspirację, o podniesienie na duchu. Nawet takie sławy jak Oprah Winfrey czy Dr. Phil nie muszą trudzić się już w dopomaganiu ludziom. Wystarczy im jedno zdanie: „Potrzebujesz inspiracji? Zaczynaj każdy dzień od artykułu Skrypciarzy!”

Zastrzeżenie: OK, właściwie to ani Oprah Winfrey, ani Dr Phil nigdy niczego chociażby zbliżonego do powyższego nie powiedzieli. Kiedy jednak przyjrzeć się bacznie ich mowie ciała, to oczywiste jest chyba, do czego nawiązują.

Jak powszechnie wiadomo, Skrypciarze bardzo chętnie biorą na swe barki ciężar szerzenia radości i szczęścia na całym świecie. Czasem jednak bycie taką dobrą wróżka jest dość trudne. Szczególnie w takim tygodniu jak ten. A co takiego przydarzyło się w Centrum Skryptów? Lista kolejnych usterek w skrypciarskim wozie, która jest jednak zbyt zabawna jak na warunki tego artykułu, a nie możemy sobie pozwolić, żeby czytelnik skupiał się na anegdotach, a nie na naszym fascynującym skrypcie.

Co jeszcze? TechNet planuje jakieś zmiany wydawnicze, więc one zapewne… ułatwią… nasza pracę. Najwyraźniej fakt, że tylko dwie osoby zajmują się pisaniem, publikowaniem i utrzymywaniem Centrum Skryptów nie wydaje się TechNetowi wystarczającym wyzwaniem dla nas. Poprzeczka została podniesiona. Teraz będziemy jeszcze zajmować się dodatkowo oceną wydajności dla firmy Microsoft. W sumie chyba nie powinniśmy dzielić się tą informacją, ale poniżej podajemy zeszłoroczną ocenę wydajności dla obecnie piszącego to Skrypciarza:

  • Osiagniecia i wkład pracy: Brak
  • Zdolnosci i umiejętnści: Brak
  • Oczekiwania: Brak

Szkoda tylko, ze nie ma kategorii „konsekwencja”, bo tej aż zanadto. Dlatego też i dziś nie zostawimy Was bez skryptu, sami bowiem znamy lament zawalonej skrzynki odbiorczej. Aby usunąć nie przeczytane wiadomości starsze niż sześć miesięcy, można posłużyć się poniższym skryptem:

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 i = colFilteredItems.Count to 1 Step - 1

    If DateDiff("m", colFilteredItems(i).ReceivedTime, Now) > 6 Then

        colFilteredItems(i).Delete

    End If

Next

Mamy nadzieję, że czytelnicy są usatysfakcjonowani. Jednak, jako że Centrum Skryptów uwielbia uszczęśliwiać, a nie tylko satysfakcjonować, świadomi jesteśmy, że będziecie jeszcze szczęśliwsi, jeżeli wytłumaczymy, jak ten skrypt działa. Wasze dobre wróżki służą pomocą.

Czary wyglądają następująco: Najpierw należy zdefiniować stałą olFolderInbox, potem przyporządkować jej wartość 6. Tej stałej będziemy używać, aby poinstruować skrypt, z którym folderem programu Outlook chcemy pracować. Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Outlook.Application, a następnie za pomocą metody GetNamespace łączymy się z obszarem nazw MAPI. Jest to krok niezbędny, chociaż obszar nazw MAPI jest jedynym, z którym możemy się połączyć. Wreszcie, aby powiązać to ze skrzynką odbiorcza programu Outlook, używamy metody GetDefaultFolder:

Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

Po połączeniu pobieramy kolekcję wszystkich elementów (tzn. wiadomości e-mail) znalezionych w skrzynce odbiorczej za pomocą poniższego wiersza kodu:

Set colItems = objFolder.Items

Teraz należy się zastanowić, interesuje nas przecież usunięcie jedynie nie przeczytanych wiadomości e-mail. Tworzymy zatem podkolekcję o nazwie colFilteredItems, która zawiera jedynie nie przeczytane wiadomości e-mail.

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

Nie będziemy tu omawiać filtrowania wiadomości e-mail, jeżeli jednak interesuje Was to, zapraszamy do artykułu Office Space (j.ang.). Na tym etapie wystarczy jedynie powiedzieć, że ograniczamy kolekcję do elementów, w których właściwość Unread ma wartość True. Jak zapewne się domyślacie, jeżeli właściwość Unread ma wartość True, oznacza to, że wiadomość nie została jeszcze przeczytana.

Następnym krokiem w naszych czarach jest uruchomienie pętli, która przejdzie przez całą kolekcję nie przeczytanych wiadomości, które mają więcej niż sześć miesięcy. Teoretycznie, mogliśmy rozbudować nasz filtr, ograniczając wyszukiwanie do wiadomości, które są nie przeczytane i starsze niż sześć miesięcy, ale wtedy byłby on zanadto skomplikowany. Naszym sposobem umieścimy w pętli wszystkie nie przeczytane wiadomości, sprawdzając każdą z nich, czy oblega nasza skrzynkę dłużej niż sześć miesięcy. Jeżeli tak, usuniemy ją.

Z uwagi na to, że będziemy usuwać elementy, pętla musi zostać uruchomiona od dołu, to jest od ostatniej wiadomości e-mail w kolekcji. Pętla przechodzi potem w górę, aż do pierwszej wiadomości e-mail w danej kolekcji. Dlatego nasza pętla For Next zaczyna się od ostatniego elementu (którego numer porządkowy można zdefiniować za pomocą właściwości Count) i kończy się na pierwszym elemencie o numerze 1:

For i = colFilteredItems.Count to 1 Step -1

Teraz zapewne nurtują Was dwa pytania, więc odpowiadamy. Co do pytania pierwszego („Dlaczego parametr Step -1?”), to prościzna – dzięki parametrowi Step-1 cała pętla uruchamiana jest odwrotnie. Powiedzmy, że w kolekcji mamy 100 elementów. Zmienna licznika i ma na początku wartość 100 i przy pierwszym uruchomieniu pętli będziemy pracować z elementem 100. Następnie chcemy przejść do elementu 99. Jak tego dokonać? Bingo! Poprzez proste działanie matematyczne, jakim jest odejmowanie. Odejmujemy zatem 1 od aktualnej wartości naszego licznika. Zagadka rozwikłana, po to był nasz Step -1.

Jeżeli chodzi o drugie, nurtujące was pytanie („Dlaczego usuwanie elementów następuje w kierunku „góra-dół”?) spójrzmy co na ten temat mówi archiwalny artykuł z serii Cześć, Skrypciarze.

W pętli musimy sprawdzić każdą wiadomość e-mail pod katem tego, czy ma więcej niż sześć miesięcy. Używamy do tego nastepującego wiersza kodu:

If DateDiff("m", colFilteredItems(i).ReceivedTime, Now) > 6 Then

Do określenia liczby miesięcy (parametr „m”), jaka upłynęła od daty i godziny otrzymania wiadomości (colFilteredItems(i).ReceivedTime) do teraz (Now) używamy funkcji VBScript’s DateDiff. Jeżeli liczba miesięcy jest większa niż 6, to poniższym wierszem kodu usuwamy ją ze skrzynki:

colFilteredItems(i).Delete

Jeżeli zaś nie jest większa niż 6, nie robimy nic.

A to, jak spojrzeć na naszą ocenę wydajności, wychodzi nam najlepiej.

W tym momencie uruchamiamy pętlę i powtarzamy cały proces w następnej wiadomości e-mail z danej kolekcji. Po zakończeniu pętli, nasza skrzynka odbiorcza programu Outlook będzie wolna od wszystkich nie przeczytanych zarazków starszych niż 6 miesięcy.

Mamy nadzieję, ze ten artykuł był równie inspirujący, jak programy Oprah Winfrey. Pamiętaj, możesz na nas zawsze liczyć.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Outlook