Centrum skryptów - Microsoft office

Jak zapisać wiadomości e-mail starsze niż jeden miesiąc?

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ć wiadomości e-mail starsze niż jeden miesiąc?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak zapisać wszystkie elementy starsze niż jeden miesiąc, znajdujące się w folderze Elementy Wysłane?

-- RS

Cześć Skrypciarze! Odpowiedź

Cześć, RS. Wiesz, chciałbym odpowiedzieć na to pytanie, naprawdę. Jednak jutro wyjeżdżam na urlop, co oznacza, że – z racji bycia niemal niezastąpionym pracownikiem firmy Microsoft Corporation – muszę zrobić całą masę rzeczy, zanim będę mógł się ulotnić. Muszę na przykład – cóż, zresztą nieważne, i tak tego nie zrobię. Ale przynajmniej powinienem załatwić – tego też na pewno nie zrobię. Nie mam aż tyle czasu. Wobec tego wystarczy mi czasu, żeby odpowiedzieć na zadane pytanie:

On Error Resume Next



Const olFolderSentMail = 5

Const olMSG = 3



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objFolder = objNamespace.GetDefaultFolder(olFolderSentMail)



dtmTargetDate = Date - 30



Set colItems = objFolder.Items

Set colFilteredItems = colItems.Restrict("[CreationTime] <'" & dtmTargetDate & "'")



For Each objMessage In colFilteredItems

    strName = objMessage.Subject

    strName = Replace(strName, ":", "")

    strName = Replace(strName,"/","")

    strName = Replace(strName,"\","")

    strName = Replace(strName,",","")

    strName = Replace(strName, Chr(34),"")

    strName = Replace(strName,Chr(39),"")

    strName = Replace(strName,"?","")



    strName = "C:\Test\" & strName & ".msg"

    objMessage.SaveAs strName, olMSG  

Next

Zobaczmy więc, jak ten skrypt działa. (Nawiasem mówiąc, skrypt nie jest nawet w połowie tak skomplikowany, na jaki wygląda. Nie martwcie się: zaraz dowiecie się dlaczego wygląda właśnie tak.)

Jak widać, zaczynamy od zdefiniowania dwóch stałych: stałej olFolderSentMail (która reprezentuje folder skrzynki pocztowej do którego chcemy uzyskać dostęp, folder Elementy Wysłane) oraz stałej olMSG (która reprezentuje format pliku – format wiadomości programu Outlook, który wykorzystamy podczas zapisywania każdego elementu w folderze). Następnie tworzymy wystąpienie obiektu Outlook.Application, łączymy się z przestrzenią nazw MAPI i stosujemy poniższy wiersz kodu w celu połączenia się z folderem Elementy Wysłane:

Set objFolder = objNamespace.GetDefaultFolder(olFolderSentMail)

Wow!

Naszym celem jest przejście przez folder Elementy Wysłane i zapisanie kopii każdej wiadomości starszej niż jeden miesiąc. (Czyli mającej więcej niż 30 dni.) A skąd mamy wiedzieć, że dana wiadomość ma więcej niż jeden miesiąc? W zasadzie to jest całkiem proste do stwierdzenia: wystarczy porównać właściwość wiadomości CreationTime z datą sprzed miesiąca.

Oczywiście, żeby to zrobić, musimy dokładnie wiedzieć, jaką mieliśmy datę 30 dni temu. Na szczęście możemy to określić po prostu odejmując 30 dni od bieżącej daty, co robimy właśnie teraz:

dtmTargetDate = Date - 30

Teraz jesteśmy gotowi pobrać kolekcję wszystkich wysłanych wiadomości starszych niż 30 dni. Pierwszym krokiem w tym procesie jest zastosowanie poniższego wiersza kodu do pobrania kolekcji wszystkich elementów znajdujących się w folderze Elementy wysłane:

Set colItems = objFolder.Items

W tym momencie stosujemy filtr (Filter), ograniczając dane do elementów, których właściwość CreationTime jest wcześniejsza (mniejsza niż) wartość zmiennej dtmTargetDate:

Set colFilteredItems = colItems.Restrict("[CreationTime] <'" & dtmTargetDate & "'")

Oczywiście nie mamy zamiaru spędzać teraz dużo czasu na rozprawianiu na temat filtrów programu Outlook; więcej informacji na ten temat znajduje się w naszym artykule Filtering Email Messages in Microsoft Outlook (j.ang.). Musimy jednak zwrócić uwagę na rzeczy istotne: trzeba umieścić nazwę właściwości w nawiasach kwadratowych ([CreationTime]) i chociaż zmienna dtmTargetDate jest wartością daty i czasu, musimy potraktować ją jak wartość ciągu, stąd te dziwne cudzysłowy:

"[CreationTime] <'" & dtmTargetDate & "'"

W tym momencie moglibyśmy już zakończyć, ale jest jeszcze jedna rzecz, którą należy załatwić. Zdecydowaliśmy się zastosować wartość właściwości Subject jako nazwę pliku dla każdego zapisywanego pliku. Wszystko pięknie, tylko niekiedy wiersz tematu (Subject) zawiera znaki (takie jak przecinki), które nie mogą być częścią nazwy pliku:

  • RE: The TechNet Script Center

Z tego powodu nie będziemy mogli zapisać wiadomości, dopóki nie usuniemy wszystkich nieprawidłowych znaków.

Na początek, uruchamiamy pętlę For Each, która przejdzie przez wszystkie elementy znajdujące się w naszej kolekcji; wewnątrz tej pętli przypisujemy wartość właściwości Subject do zmiennej o nazwie strName. Do tego posłużą nam poniższe dwa wiersze kodu:

For Each objMessage In colFilteredItems

    strName = objMessage.Subject

Następnie stosujemy serię poleceń Replace w celu zastąpienia nieprawidłowych znaków, dla naszych potrzeb, „niczym”. Na przykład poniższe polecenie usuwa wszystkie dwukropki ze zmiennej strName:

strName = Replace(strName, ":", "")

Jeżeli przyjrzymy się bliżej pętli For Each, zobaczymy że mamy podobne polecenia usuwające kropki, przecinki, apostrofy (chr(39)) oraz cudzysłowy (chr(34)). Oczywiście może zajść potrzeba usunięcia także innych znaków w celu utworzenia prawidłowych nazw plików; w takim przypadku – no cóż – to zostawiliśmy dla Was, sami możecie wstawić dodatkowe polecenie Replace według własnych potrzeb.

Po oczyszczeniu wartości zmiennej strName stosujemy poniższy wiersz kodu w celu utworzenia ścieżki dostępu do naszego nowego pliku:

strName = "C:\Test\" & strName & ".msg"

Dzięki temu otrzymamy ścieżkę pliku podobną do poniższej (zauważmy, że usunięty został dwukropek znajdujący się po RE):

  • C:\Test\RE The TechNet Script Center.msg

Teraz możemy zapisać plik wywołując metodę SaveAs, przekazując ścieżkę pliku i typ pliku (stałą olMSG) jako dwa parametry:

objMessage.SaveAs strName, olMSG

Następnie wracamy na początek pętli, gdzie powtarzamy proces dla następnego elementu w kolekcji.

To powinno wystarczyć, RS. A teraz żarty na bok, czas żebym zrobił to, co zrobić muszę, a mianowicie poszedł ze Skrypciarzami na lunch. To ciężka praca, a robię to codziennie, no ale cóż – ktoś to w końcu musi robić.

Uwaga. Tak à propos, to nie tylko takie wyrażenie, naprawdę ktoś musi to robić. Albo przynajmniej ktoś musi chodzić na lunch ze Skrypciarzem Deanem Tsaltasem, który zawsze zapomina swojego identyfikatora albo drogi do kantyny, a czasem, co gorsza, jednego i drugiego.

Sami widzicie, że to nie takie proste.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft office