Microsoft Outlook troubleshooting
Ustawianie pola

Ustawianie pola "Od" w nowych wiadomościach

autor CodeTwo 2006-09-18 00:00:00 w Makra

Artykuł dotyczy: Microsoft Outlook 2000/2002/2003

Wielu użytkowników tworzy w profilu Outlook'a dodatkowe foldery pocztowe w celu porządkowania przychodzących wiadomości. Za umieszczanie wiadomości w odpowiednich folderach odpowiadać mogą reguły Outlook'a. Wiadomości przydzielane mogą być do folderów na podstawie różnych właściwości: adresu nadawcy, słów kluczowych, konta pocztowego, przez które wiadomość została odebrana. Zależy to od sposobu organizacji pracy przez poszczególnych użytkowników czy firmy.

Odpowiadając na wiadomość z danego foldera, często zachodzi konieczność wstawienia w polu "Od" wiadomości wybranego adresu pocztowego, czyli wysłania jej w imieniu innego użytkownika (konta). Przykładowo na rysunku 1 widzimy trzy dodatkowe foldery pocztowe: "info", "support", "zamówienia". Wiadomości umieszczane są w nich na podstawie konta POP3, przez które zostały odebrane. Odpowiadając na wiadomości z foldera "info" użytkownik w polu "Od" chciałby zawsze wstawiać adres "info1@outlook.pl", odpowiadając na wiadomości z foldera "support" - adres "support1@outlook.pl", a na wiadomości z foldera "zamówienia" - adres "order1@outlook.pl".


Dodatkowe foldery pocztowe
Rys.1 Dodatkowe foldery pocztowe.


Jeśli adres SMTP użytkownika wysyłającego wiadomość to "jacek1@outlook.pl", a w polu "Od" wiadomości wstawi on adres "order1@outlook.pl" i wyśle wiadomość do użytkownika o adresie "jurek@poczta.com.pl", to u odbiorcy wiadomość będzie wyglądała tak jak na rysunku 2.


Wiadomość wysłana z ustawionym polem Od
Rys.2 Wiadomość wysłana z ustawionym polem "Od".


Na rysunku 1 foldery pocztowe znajdują się w pliku folderów osobistych. Jednak w wielu firmach podobną strukturę (często dużo bardziej rozbudowaną) można spotkać w folderach publicznych serwera Exchange. Tam wiadomości przetwarzane mogą być przez wielu użytkowników. Różne grupy użytkowników odpowiedzialne są za odpowiadanie na wiadomości z określonych folderów. W takim przypadku używanie odpowiedniego adresu w polu "Od" podczas odpowiadania na wiadomość może być szczególnie ważne.

Niestety Outlook nie posiada wbudowanej funkcjonalności umożliwiającej określanie, jaki adres powinien być wstawiany w pole "Od" wiadomości w zależności od tego, w jakim folderze jest ona tworzona. Ograniczona funkcjonalność podobna do tej, którą tu opisuję, istnieje tylko wtedy, gdy pracuje się w środowisku Exchange Server'a i w profilu mamy otwarte udostępnione foldery pocztowe innych użytkowników. W takim wypadku podczas tworzenia nowej wiadomości w udostępnionym folderze, Outlook automatycznie wstawia w pole "Od" nazwę skrzynki użytkownika, w której folder się znajduje. Tu jednak również nie mamy wpływu na wartość, która zostanie domyślnie wstawiona w pole "Od".

Co możemy zrobić, aby móc automatycznie ustawiać wartość pola "Od" w zależności od foldera, w którym nowa wiadomość jest tworzona? Możemy napisać makro takie jak poniższe, które automatycznie ustawia pole "Od", jeśli nowa wiadomość jest tworzona w jednym z folderów "info", "support" lub "zamówienia". Pole "Od" jest ustawiane również wtedy, gdy użytkownik przesyła dalej lub odpowiada na wiadomość znajdującą się w którymś z wymienionych folderów.

' Aby otrzymywać zdarzenia dla obiektów, musimy zadeklarować je ze słowem
' kluczowym WithEvents
Private WithEvents oInspectors As Inspectors
Private WithEvents oNewInspector As Inspector
Private WithEvents oItem As MailItem

' Ta zmienna służy nam do przechowywania informacji, czy tworzona jest nowa wiadomość,
' czy odczytywana istniejąca
Private g_bItemRead As Boolean

' Tu przechowujemy adresy odpowiadające poszczególnym folderom
Private g_settings

Private Sub Application_Startup()
   Set oInspectors = Application.Inspectors  ' (*1)
   
   ' (*2) Wypełniamy obiekt z ustawieniami adresów i odpowiadających im folderom
   Set g_settings = CreateObject("Scripting.Dictionary")
   g_settings.Add "info", "info1@outlook.pl"
   g_settings.Add "support", "support1@outlook.pl"
   g_settings.Add "Zamówienia", "order1@outlook.pl"
End Sub

' (*3) Zdarzenie Activate
Private Sub oNewInspector_Activate() 
    On Error Resume Next

    ' (*4) Nie jest tworzona nowa wiadomość, lecz odczytywana istniejąca
    If g_bItemRead Then Exit Sub
    
    ' (*5) Nie obsługujemy Worda
    If oNewInspector.EditorType = olEditorWord Then Exit Sub

    Dim oMailItem As MailItem
    Dim oCurFolder As MAPIFolder
    
    Set oCurFolder = Application.ActiveExplorer.CurrentFolder
    
    ' (*6) Pobierz adres dla tego foldera
    Dim strFromAddr As String
    strFromAddr = g_settings.Item(oCurFolder.Name)
    If strFromAddr = "" Then Exit Sub
    
    ' (*7) Ustaw pole "Od"
    Set oMailItem = oNewInspector.CurrentItem
    oMailItem.SentOnBehalfOfName = strFromAddr
    
    ' (*8) Odśwież pole "Od"
    Dim cmdBars As CommandBars
    Dim cmdBar As CommandBar
    Dim oMenuItem As CommandBarControl
    
    Set cmdBars = oNewInspector.CommandBars
    Set cmdBar = cmdBars.Item("Menu Bar")
    Set oMenuItem = cmdBar.FindControl(, 1867, , , True)
    oMenuItem.Execute
    oMenuItem.Execute
    
End Sub

' (*9) Zdarzenie NewInspector
Private Sub oInspectors_NewInspector(ByVal oInspector As Inspector) 
    On Error Resume Next
    Set oItem = oInspector.CurrentItem
    If Not oItem Is Nothing Then ' (*10)
        ' (*11) Otwierane jest nowe okno dla obiektu typu MailItem
        Set oNewInspector = oInspector
        g_bItemRead = False
    End If
End Sub

' (*12) Zdarzenie Read
Private Sub oItem_Read()
    ' Nie jest tworzona nowa wiadomość, lecz odczytywana istniejąca
    g_bItemRead = True
End Sub

Private Sub oNewInspector_Close()
    ' Nie są nam już potrzebne zdarzenia dla tej wiadomości
    Set oItem = Nothing
End Sub

Kilka słów wyjaśnienia. W powyższym makrze przy tworzeniu nowej wiadomości pocztowej ustawiamy pole "Od", któremu odpowiada właściwość SentOnBehalfOfName obiektu MailItem. Musimy więc przede wszystkim wykryć kiedy tworzona jest nowa wiadomość w Outlook'u. W tym celu wykorzystujemy zdarzenia, które są generowane dla obiektów Outlook API. Wartość pola "Od" musimy zmienić w momencie otwierania okna z nową wiadomością.

W linii (*1) podczas uruchamiania Outlook'a uzyskujemy referencję do kolekcji Inspectors (okna wyświetlające zawartość elementów), aby w linii (*9) obsłużyć zdarzenie o nazwie NewInspector dodawania nowego okna. Tu z kolei uzyskujemy referencję do nowego okna (*11), aby móc obsłużyć zdarzenie jego aktywowania Activate (*3), w którym to musimy ustawić pole "Od".

Adresy, które mają być automatycznie ustawione w polu "Od" i odpowiadające im foldery przechowujemy w obiekcie Dictionary, który wypełniamy przy starcie Outlook'a (*2). W zdarzeniue Activate (*3) pozostaje nam więc pobrać nazwę obecnego foldera, znaleźć w obiekcie Dictionary odpowiadający mu adres SMTP (*6) i wstawić go w polu "Od" (*7).

Po tej operacji adres nie pojawi się jednak jeszcze w polu "Od", tak jak dzieje się to dla innych pól (np. Temat). Dlatego musimy pole "Od" w jakiś sposób odświeżyć. Rozwiązaniem jest tutaj na przykład jego ukrycie i ponowne wyświetlenie (*8). Innym rozwiązaniem mogłoby być wywołanie komendy "Sprawdź nazwy".

Mamy do rozwiązania jeszcze dwa małe problemy. Powinniśmy obsługiwać tylko tworzenie obiektów typu "poczta", nie "zadanie", "kontakt", itp. Dlatego w linii (*10) sprawdzamy czy obiekt powiązany z nowo otwieranym oknem jest typu MailItem. Nie powinniśmy również ustawiać pola "Od", gdy otwierana jest istniejąca wiadomość pocztowa. Dlatego obsługujemy zdarzenie Read dla obiektu oItem (*12), które jest generowane w momencie odczytywania istniejącej wiadomości. Zapamiętujemy ten fakt w zmiennej g_bItemRead i sprawdzamy jej wartość w linii (*4).

Ponieważ w makrze wykorzystujemy zdarzenia, to jego kod musi być umieszczony w module ThisOutlookSession.

Ponieważ makro wykorzystuje zdarzenie Application_Startup, uruchamiane jest przy starcie Outlook'a. Jeśli poziom zabezpieczeń dla makr ustawiony będzie na "średni", to przy każdym starcie Outlook'a wyświetlone zostanie okno z pytaniem, czy zezwolić na uruchamianie makr. Aby się go pozbyć, należy ustawić poziom zabezpieczeń makr na "niski".

Makro nie działa, gdy domyślnym edytorem jest Microsoft Word. Microsoft Word znacznie komplikuje działanie makr i powoduje różnice w działaniu obiektów Outlook'a pod jego różnymi wersjami. Przykładowo w Outlook'u 2000 zdarzenia, które tu wykorzystujemy w ogóle nie są wyzwalane, jeśli Word jest domyślnym edytorem.

Jeśli makro używane jest w profilu, w którym skonfigurowana jest skrzynka Exchange, to należy pamiętać o zasadach obowiązujących wartość pola "Od" w środowisku Exchange. Można wstawić tam tylko nazwę skrzynki, której wysyłający jest delegatem lub ma nadane do niej prawo "SendAs". W przeciwnym wypadku wiadomość nie będzie mogła zostać wysłana. Więcej na ten temat można przeczytać w artykule Współdzielenie prywatnych folderów w Outlook'u.

Jeśli masz jakieś pytania lub komentarze dotyczące tego artykułu, napisz na naszym forum.

(c) CodeTwo. Wszelkie prawa zastrzeżone.



© Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.