VBOffice

Sicherheitsmodell, Teil 1

So löst Ihr Outlook VBA-Programm keine Sicherheitsmeldung mehr aus, wenn Sie auf blockierte Eigenschaften zugreifen oder eine Email senden wollen.

Zuletzt geändert: 18.12.2007 | Aufrufe: 46.661  | #86
◀ Vorheriges Beispiel Nächstes Beispiel ▶

Inhalt

ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.

Problem: Auslösen der Sicherheitsmeldung

Seit Outlook 2000 SP3 (optional) bzw. Outlook XP sind einige Eigenschaften aus Sicherheitsgründen blockiert. Das betrifft z.B. die Absenderadresse einer E-Mail. Seit Outlook 2003 lassen sich in VBA auch die blockierten Eigenschaften lesen, ohne eine Sicherheitswarnung auszulösen, indem alles vom schon vorhandenen Application-Objekt abgeleitet wird. Schon vorhanden heißt, in VBA gibt es bereits eine Variable namens Application, über die auf alle weiteren Objekte und deren Eigenschaften zugegriffen werden kann. Diese Variable braucht nicht erst erstellt zu werden. Und genau hier liegt häufig der Fehler, das betrifft übrigens auch die offizielle VBA-Hilfe: Es wird über die Funktionen GetObject oder CreateObject ein Verweis auf Application erzeugt, statt einfach die vorhandene Variable zu verwenden. Die folgenden Beispiele demonstrieren den Unterschied. Um die Beispiele zu testen, muss es mindestens eine E-Mail im Posteingang geben.

Das erste Beispiel zeigt, wie es nicht geht. Statt einfach mit Application zu arbeiten, wird mit der Funktion GetObject die Variable olApp auf das Application-Objekt gesetzt. Die Folge: Beim Versuch, die Absenderadresse einer Mail zu lesen, kommt die Sicherheitsmeldung.


tip  So fügen Sie Makros in Outlook ein
Public Sub Warning()
  Dim olApp As Outlook.Application
  Dim Inbox As Outlook.MAPIFolder
  Dim Mail As Outlook.MailItem

  Set olApp = GetObject(, "Outlook.Application")

  Set Inbox = olApp.Session.GetDefaultFolder(olFolderInbox)
  Set Mail = Inbox.Items(1)
  MsgBox Mail.SenderEmailAddress
End Sub

Lösung: Aufruf ohne Sicherheitsmeldung

So verhindern Sie die Sicherheitsmeldung ganz einfach: Die Variable olApp wird direkt auf die Application-Eigenschaft gesetzt, ohne den Umweg über die GetObject-Funktion. Hiermit wird auch deutlich, dass Sie von außen, also z.B. aus Excel heraus, keine Möglichkeit haben, die Sicherheitsmeldung zu umgehen, weil Sie von außerhalb Outlooks eigentlich nur über GetObject bzw. CreateObject auf das Outlook.Application-Objekt zugreifen können. (Wie das trotzdem geht, erfahren Sie Sicherheitsmodell, Teil 2.)

Public Sub NoWarning()
  Dim olApp As Outlook.Application
  Dim Inbox As Outlook.MAPIFolder
  Dim Mail As Outlook.MailItem

  Set olApp = Application

  Set Inbox = olApp.Session.GetDefaultFolder(olFolderInbox)
  Set Mail = Inbox.Items(1)
  MsgBox Mail.SenderEmailAddress
End Sub
Category-Manager Category-Manager
Mit dem Category-Manager können Sie Outlook Kategorien gruppieren, synchronisieren und filtern, neuen Emails automatisch die Kategorie des Absenders zuweisen und vieles mehr. Das Addin ist auch für IMAP geeignet.

Sonderfall Outlook 2003 und der Regelassistent

In Outlook 2003 gibt es noch etwas zu beachten: Der Regel-Assistent übergibt an Skripte die nicht vertrauenswürdige Referenz auf die Email. (Seit Outlook 2007 ist das nicht mehr der Fall.) Das folgende Beispiel löst deswegen eine Sicherheitswarnung aus:

Public Sub Warning(NewMail As Outlook.MailItem)
  MsgBox NewMail.SenderEmailAddress
End Sub

Lösung: Regelausführung ohne Sicherheitsmeldung

Dieses Beispiel umgeht die Sicherheitsmeldung in Outlook 2003, indem eine neue Variable auf die Email über das Application-Objekt geholt wird. Auf diese Weise kann die Absenderadresse ohne Probleme gelesen werden.

Public Sub NoWarning(NewMail As Outlook.MailItem)
  Dim Session As Outlook.NameSpace
  Dim EntryID$, StoreID$
  Dim Mail As Outlook.MailItem

  EntryID = NewMail.EntryID
  StoreID = NewMail.Parent.StoreID

  Set Session = Application.Session
  Set Mail = Session.GetItemFromID(EntryID, StoreID)

  MsgBox Mail.SenderEmailAddress
End Sub
OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.
email  Senden Sie eine Nachricht