Möchte man innerhalb von Outlook eine E-Mail direkt mit VBA weiterverarbeiten, zum Beispiel verschieben, nachdem diese im Posteingang eingetroffen ist, so kann man in vielen Fällen dafür die Regeln von Outlook nutzen.
Für spezielle Anforderungen, wie zum Beispiel dem automatischen Speichern von Anhängen, kommt man mit den Outlook-Regeln jedoch schnell an seine Grenzen. Denn für solche Funktionalitäten kommt meist ein VBA-Makro zum Einsatz.
In früheren Versionen von Outlook konnten man noch “Nach Erhalt einer Nachricht von … ein Skript ausführen…“ in den Outlook-Regeln einstellen. Doch das wurde aus Sicherheitsaspekten abgeschafft. Laut einigen Foren kann man dies wieder aktivieren, indem man den Registry-Editor aufruft und den Key EnableUnsafeClientMailRules auf 1 setzt.
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
DWORD: EnableUnsafeClientMailRules
Value: 1
Bei meinem Outlook365 gab es aber bereits auch diese Lösung nicht mehr.
- Widl, Markus(Autor)
Makro nach Eintreffen der E-Mail im Posteingang ausführen
Microsoft empfiehlt an dieser Stelle auf das NewMail Event zu setzen oder besser noch NewMailEx Ereignis. Damit kann man E-Mails automatisch per VBA verarbeiten, wenn diese im Posteingang empfangen werden. So ist es zum Beispiel möglich einen E-Mail Anhang automatisch zu drucken, wenn dieser von einem bestimmten Absender kommt, sofort in dem Moment in welchem die E-Mail eintrifft.
Damit lassen sich viele Automatisierungsaufgaben lösen, ohne dass man zig Klicks tätigen muss.
VBA Application_NewMailEx() verwenden
In dem nachfolgenden VBA-Code ist das Grundgerüst zum Ausführen eines Makros bei E-Mail-Eingang. Es ist darauf zu achten, dass die Methode Application_NewMailEx innerhalb „ThisOutlookSession“ implementiert wird.
Beide Methoden Application_NewMail und Application_NewMailEx werden noch vor den definierten Outlook-Regeln ausgeführt.
In dem Beispiel findet mit der Eigenschaft Item.SenderEmailAddress eine Überprüfung der Absenderadresse statt. Viele weitere Überprüfungen, wie zum Beispiel auf den Betreff (Item.Subject), sind denkbar. Innerhalb dieser If-Anweisung kann man dann weiteren Code ausführen oder Makros aus anderen Modulen ausführen.
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim Item As Object
Dim Email As String
Set Item = Session.GetItemFromID(EntryIDCollection)
Item.Save
'Absender E-Mail Adresse ermitteln
Email = Item.SenderEmailAddress
'Überprüfen, ob E-Mail von bestimmten Absender
If Email = "vorname.nachname@ekiwi.de" Then
'weiteren Code und Makros hier ausführen
Modul1.MeinMakro
Debug.Print "Die richtige Mail lautet: " + Email
Else
Debug.Print "Falsche Mail lautet: " + Email
End If
End Sub
Will man Methoden aus anderen Modulen an dieser Stelle ausführen, muss man darauf achten, dass diese als public deklariert sind.
Hinweis: Wer Debug.Print zum Testen benutzt muss sich über Ansicht => Direktfenster (Strg+G) das Ausgabefenster einblenden im VBA-Editor. Für Programmierer anderer Programmiersprachen sicherlich ein ungewohntes Wording.
OK, MeinMakro wird aufgerufen – nur leider ohne jede Ahnung, warum (d. h. mit welcher E-Mail es aktiviert wurde)
Ja, das passt so. Bei Application_NewMailEx handelt es sich um ein Event. Das wird bei jedem empfangenen Element ausgeführt. Und Element kann in diesem Fall eine E-Mail, ein Outlook-Termin o.ä. sein. Das heißt also, dass das Makro bei jeder eintreffenden E-Mail ausgeführt wird. Wenn du jetzt Code ausführen möchtest, der nur auf bestimmte E-Mails reagieren soll, musst du anhand des Mail-Items entsprechende Unterscheidungen treffen. Im Blog-Artikel ist als Beispiel die Unterscheidung nach der E-Mail-Adresse des Senders durch ein If-Statement dargestellt. Genauso gut kannst du eine Unterscheidung nach dem Betreff einbauen.
Hi,
bei mir ist es so, dass ich mehrere Konten in Outlook habe, und der Code wird nur beim ersten Konto (persönliches) Ausgeführt, nicht aber wenn ein Mail bei einem der anderen Konten eintrifft, kannst du mir vielleicht sagen warum?
Leider nein! Ich habe es noch mal bei getestet; ich habe auch mehrere Konten; und dort wird es auch beim Eintreffen von Mails in anderen Postfächern (alles IMAP) ausgeführt. Das Script hast du sicherlich in „ThisOutlookSession“ eingefügt. Wenn man es in ein Modul einfügt, funktioniert es auch nicht, betrifft dann aber alle Postfächer.