Centrum skryptów - Microsoft Office

Jak losowo wybrać wiadomość e-mail z folderu poczty 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.

Jak losowo wybrać wiadomość e-mail z folderu poczty programu Outlook?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak losowo wybrać wiadomość e-mail z folderu poczty programu Outlook?

-- TV

Cześć Skrypciarze! Odpowiedź

Cześć, TV. Jakież przykre jest dla nas rozczarowanie, kiedy wydaje nam się, że jesteśmy dla kogoś kimś bardzo wyjątkowym, a tu nagle okazuje się, iż wcale tak nie jest. Co gorsza, czasem nawet bywa wręcz przeciwnie, ale o tym innym razem. Piszący te słowa Skrypciarz przez chwilę czuł się tak, jakby spełniło się jego ojcowskie marzenie. Kiedy wracał ze swoim synem z siłowni, syn powiedział: „Tato, a czy mogę cię o coś spytać? Chodzi o moją pracę domową”. Na te słowa piszący te słowa Skrypciarz przybrał poważną minę (chociaż w środku nie posiadał się ze szczęścia), przypomniawszy sobie, że praca domowa to wypracowanie na temat „Kto jest moim największym bohaterem?” Oczywiście, według mniemania piszącego te słowa Skrypciarza, jasnym było, kto jest tym bohaterem dla jego syna: własny ojciec.

„Jasne” – odpowiedział próbując powstrzymać wzbierający się w nim głęboki uśmiech – „Pytaj o co tylko chcesz”.

„Dobra” – powiedział Syn Skrypciarza –„Którą książkę Stephena Kinga lubisz najbardziej?”

„Kinga? No nie wiem, chyba Zieloną Milę.”

„Dzięki”

I to wszystko. Jak się okazuje, Syn Skrypciarza myślał nad inną pracą domową, w której chodzi o statystyki i opinie. Potrzebował pomocy piszącego te słowa Skrypciarza jedynie dlatego, że musiał spytać 100 osób o ulubioną książkę Kinga.

Powiedzcie, że to nieprawda.

W tamtej pracy, w wypracowaniu na temat bohatera, Syn Skrypciarza wybrał na swojego bohatera Chucka Norrisa (szlachetny facet, ale nie żeby go od razu na bohatera?). I to przed piszącym te słowa Skrypciarzem!

Chodzi o to, że okazało się, że piszący te słowa Skrypciarz nie jest bohaterem dla swojego syna. (A przecież to nie Chuck Norris kupił mu ostatnio nowe adidasy.) Ale może być Twoim bohaterem, TV. Prawdopodobnie nie da Ci kasy na nowe buty, ale za to dostaniesz skrypt pozwalający losowo wybrać wiadomość e-mail z folderu poczty programu Outlook:

Const olFolderInbox = 6



Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)



strFolderName = objInbox.Parent



Set objMailbox = objNamespace.Folders(strFolderName)

Set objFolder = objMailbox.Folders("2007 Scripting Games")



Set colItems = objFolder.Items

intHighNumber = colItems.Count



intLowNumber = 1



Randomize

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

    

Wscript.Echo colItems(intNumber).SenderName

Może to i nie wygląda jak jakiś heroiczny wyczyn, ale to nic; prawdopodobnie zmienicie zdanie, kiedy tylko wyjaśnimy, jak ten skrypt działa. Na początek definiujemy stałą o nazwie olFolderInbox i nadajemy jej wartość 6; to powie skryptowi, z którym folderem programu Outlook chcemy się połączyć. (Więcej na ten temat za chwilę.) Następnie zastosujemy poniższy fragment kodu w celu utworzenia wystąpienia obiektu Outlook.Application:

Set objOutlook = CreateObject("Outlook.Application")

Set objNamespace = objOutlook.GetNamespace("MAPI")

Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)

Ktoś mógłby się zastanawiać, dlaczego połączyliśmy się z folderem Inbox, a nie Mailbox; w końcu w wielu przypadkach foldery poczty programu Outlook nie są podfolderami folderu Inbox, a podfolderami folderu Mailbox. Przykładowo, przypuśćmy, że chcemy zastosować następujące ustawienia programu Outlook i pracować z folderem 2007 Scripting Games:

Jak widzimy, 2007 Scripting Games to podfolder folderu Mailbox, a nie Inbox. Dlaczego więc połączyliśmy się z folderem Inbox?

Mnie nie pytajcie, ale Chuck Norris na pewno będzie wiedział.

Nie, zaraz, Chuck wam tego nie powie. Połączyliśmy się z folderem Inbox po prostu dlatego, że nie możemy połączyć się z folderem Mailbox bez określania nazwy folderu. Z tym jest pewien problem, ponieważ ten folder właściwie nie nazywa się Mailbox; w tym przypadku ma na przykład nazwę Mailbox – Greg Stemp. Mogliśmy uwzględnić tę nazwę w naszym skrypcie, ale wtedy każdy, kto chciałby skorzystać z naszego skryptu, musiałby zmieniać tę wartość tak, aby odzwierciedlała właściwą nazwę folderu Mailbox. To może wcale nie być zabawne, wiec zdecydowaliśmy się połączyć z folderem Inbox, a następnie zastosować poniższy wiersz kodu w celu uzyskania nazwy macierzystego folderu (Parent):

strFolderName = objInbox.Parent

Jak można się spodziewać, folderem macierzystym dla folderu Inbox jest folder Mailbox.

Kiedy już mamy nazwę folderu Mailbox bezpiecznie zachowaną w zmiennej strFolderName, wykonujemy poniższe dwa wiersze kodu:

Set objMailbox = objNamespace.Folders(strFolderName)

Set objFolder = objMailbox.Folders("2007 Scripting Games")

Przy pomocy pierwszego wiersza łączymy się z folderem Mailbox; używając drugiego tworzymy połączenie (poprzez odwołanie obiektu objFolder) z naszym docelowym folderem: 2007 Scripting Games. I teraz możemy zacząć działać.

Aby losowo wybrać wiadomość e-mail, wybieramy liczbę z przedziału od 1 do liczby elementów znajdujących się w folderze. (To naprawdę ma sens; jeżeli mamy 77 elementów w folderze, to nie możemy losowo wybrać elementu o numerze 1918.) Żeby określić liczbę elementów w folderze 2007 Scripting Games, użyjemy następujących dwóch wierszy kodu do pobrania kolekcji wszystkich tych elementów i zachowamy wartość we właściwości kolekcji Count w zmiennej o nazwie intHighNumber:

Set colItems = objFolder.Items

intHighNumber = colItems.Count

Po raz kolejny przypuśćmy, że w folderze znajduje się 77 elementów. W takim przypadku, losowo wybierzemy numer z przedziału od jakiejś liczby do 77. Jakiej liczby? No cóż, najprawdopodobniej będzie to 1 ( w ten sposób wybieramy z przedziału od 1 do 77). Mając to na uwadze, przypisujemy wartość 1 do zmiennej o nazwie intLowNumber:

intLowNumber = 1

Po ustaleniu numerycznego zakresu wywołujemy funkcję Randomize, co uruchomii nasz generator numeru losowego. Następnie stosujemy ten dziwnie wyglądający wiersz kodu w celu wygenerowania przypadkowej liczby całkowitej z przedziału pomiędzy od 1 do 77 (lub ile tylko elementów mamy w folderze):

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

Uwaga. Nie możemy dziś szczegółowo wyjaśnić tego wiersza kodu. Więcej informacji na temat wyszukiwania przypadkowych numerów znajduje się w tym artykule rubryki Cześć Skrypciarze!

Co zatem robimy, kiedy już mamy ten losowo wybrany numer? Cóż, możemy użyć go jako wskaźnika dla naszej kolekcji wszystkich elementów znajdujących się w folderze 2007 Scripting Games (kolekcji o nazwie colItems). Załóżmy, że nasz losowy numer to 13. Oznacza to, że poniższy wiersz kodu wywoła echo wartości właściwości SenderName dla elementu 13 w kolekcji:

Wscript.Echo colItems(intNumber).SenderName

Zauważmy, że z racji tego, że mamy do czynienia z właściwością SenderName, program Outlook wyświetli okienko dialogowe bezpieczeństwa i będziemy musieli wyraźnie przyznać skryptowi dostęp do tej właściwości. Niektóre właściwości (jak i SenderName wszystkie reprezentujące adres e-mail) wymagają przejścia przez tę procedurę bezpieczeństwa. Inne właściwości (takie, jak Subject) mogą być uzyskiwane automatycznie. Więcej na ten temat można znaleźć w witrynie Office Space w artykule na, hmm, ten temat (j.ang.).

Tak na marginesie, to Zieloną Milę naprawdę napisał King?

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office