Outlook newMailex oder NewMail?
Guten Tag,
Ich stehe vor der Aufgabe ein Macro für Outlook zu schreiben, welches auf eingehende
eMails reagiert.
Bin bisher auf 2 Events gestoßen, welche dies gut bewerkstelligen sollten (s.o.).
Der Hauptunterschied den ich bisher festgestellt habe ist, dass newMailEx die IDs der eingehenden ELEMENTE (MailItem, MeetingItem, ...)
mitgibt, was für mein weiteres vorhaben wahrscheinlich sehr nützlich ist.
NewMail dagegen wird wohl bei jeder eingehenden EMAIL ausgelöst, was wiederum auch sehr nützlich ist.
Gibt es eine Möglichkeit beide Events zu vereinen? z.B. durch eine Prüfung am Anfang des Macros o.Ä.
EDIT: Vielleicht hilft es ja, ich würde das Event gerne so wie in diesem Artikel benutzen: http://msdn.microsoft.com/de-de/library/office/ff863686(v=office.15).as ...
Liebe Grüße,
fudge
Ich stehe vor der Aufgabe ein Macro für Outlook zu schreiben, welches auf eingehende
eMails reagiert.
Bin bisher auf 2 Events gestoßen, welche dies gut bewerkstelligen sollten (s.o.).
Der Hauptunterschied den ich bisher festgestellt habe ist, dass newMailEx die IDs der eingehenden ELEMENTE (MailItem, MeetingItem, ...)
mitgibt, was für mein weiteres vorhaben wahrscheinlich sehr nützlich ist.
NewMail dagegen wird wohl bei jeder eingehenden EMAIL ausgelöst, was wiederum auch sehr nützlich ist.
Gibt es eine Möglichkeit beide Events zu vereinen? z.B. durch eine Prüfung am Anfang des Macros o.Ä.
EDIT: Vielleicht hilft es ja, ich würde das Event gerne so wie in diesem Artikel benutzen: http://msdn.microsoft.com/de-de/library/office/ff863686(v=office.15).as ...
Liebe Grüße,
fudge
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 250389
Url: https://administrator.de/contentid/250389
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo fudge, Willkommen auf Administrator.de!
Benutze NewMailEx als einziges Event, da du nur mit diesem wirklich jede neue Mail erfassen kannst. Das einfache NewMail wird oft nur einmal abgefeuert auch wenn zwei Mails gleichzeitig zur selben Zeit eintreffen, wohingegen du mit NewMailEx die IDs aller gerade neu eingetroffenen Mails als kommagetrennten String geliefert bekommst über welche du dann mit einer Schleife iterieren kannst !
Beispiele dazu findest du hier im Forum etliche
Grüße Uwe
NewMail dagegen wird wohl bei jeder eingehenden EMAIL ausgelöst, was wiederum auch sehr nützlich ist.
Das stimmt so nicht ganz ...Benutze NewMailEx als einziges Event, da du nur mit diesem wirklich jede neue Mail erfassen kannst. Das einfache NewMail wird oft nur einmal abgefeuert auch wenn zwei Mails gleichzeitig zur selben Zeit eintreffen, wohingegen du mit NewMailEx die IDs aller gerade neu eingetroffenen Mails als kommagetrennten String geliefert bekommst über welche du dann mit einer Schleife iterieren kannst !
Beispiele dazu findest du hier im Forum etliche
- Outlook Mails automatisch auf Inhalt prüfen und kategorisieren
- Eingehende Emails in Outlook mit automatischer Mail inkl aktueller Uhrzeit und Betreff beantworten?
- Verborgene Informationen aus einem E-Mail-Header vor einem E-Mail-Body bei Weiterleitung automatisch reinschreiben - Outlook 2010
Grüße Uwe
Zitat von @bigfudge:
Meine Hauptsorge ist einfach, dass laut oben verlinktem Artikel nicht nur eMails sondern auch "von mehreren verschiedenen
Elementtypen , z.B.MailItem, MeetingItem oder SharingItem" ausgelöst wird. Gibt es eine Möglichkeit mit diesem
Event nur MailItems (olMail) zu verarbeiten?
kein Problem, in den oben verlinkten Beispielen kannst du sehen das ich den Typ bzw. die Klasse des Objektes vor der Verarbeitung prüfe:Meine Hauptsorge ist einfach, dass laut oben verlinktem Artikel nicht nur eMails sondern auch "von mehreren verschiedenen
Elementtypen , z.B.MailItem, MeetingItem oder SharingItem" ausgelöst wird. Gibt es eine Möglichkeit mit diesem
Event nur MailItems (olMail) zu verarbeiten?
if objItem.Class = olMail then
...
..
end If
Zitat von @bigfudge:
Ja, das ergibt Sinn. Habe das jetzt mal so wie in den oben verlinkten Beispielen die Prüfung eingefügt.
Falls ich nun noch die Inbox durchsuchen will, > kann ich diese schätze ich mal über .Parent setzen.
Das wäre im Falle von weiteren Regeln im Posteingang nicht gut, denn dann würde dir der Ordner zurückgegeben in den die Mail verschoben worden ist.Ja, das ergibt Sinn. Habe das jetzt mal so wie in den oben verlinkten Beispielen die Prüfung eingefügt.
Falls ich nun noch die Inbox durchsuchen will, > kann ich diese schätze ich mal über .Parent setzen.
Dieser ganze
Mechanismus geschieht
zeitlich meine ich VOR der Ausführung der Outlook-Regeln oder?
jein eher gleichzeitig.Mechanismus geschieht
zeitlich meine ich VOR der Ausführung der Outlook-Regeln oder?
Soll heißen, wenn nach dem Event die Mail per Regel in
ein anderes Postfach/Ordner
verschoben wird kommt es zu Fehlern?
es kommt nicht zu Fehlern, aber die Mail befindet sich dann halt nicht mehr in der Inbox, deswegen ist .Parent da nicht so gut. Die ItemID liefert dir ja das Objekt egal wo es im Postfach hin verschoben wird.ein anderes Postfach/Ordner
verschoben wird kommt es zu Fehlern?
Hoffe du verstehst was ich meine, gibt es dafür vllt. einen Fix?
setze den Posteingang fix als Folder-Objekt:set objInbox = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
for each mail in objInbox.Items
...
Next
Zitat von @bigfudge:
Also Ziel des Macros ist es genau den Ordner später zu durchsuchen wo Mails dieser Art letztendlich landen. Dann wäre .Parent wohl gar nicht so falsch?
In diesem Fall natürlich richtig ...Also Ziel des Macros ist es genau den Ordner später zu durchsuchen wo Mails dieser Art letztendlich landen. Dann wäre .Parent wohl gar nicht so falsch?
Ich ginge davon aus, dass ich mit .Parent die normale Inbox kriege (da zeitl. vor Regelausführung) und die eMail dannach verschoben wird (in den Ordner den ich durchsuchen will) womit der durch Parent gesetzte Ordner falsch wäre.
den genauen zeitlichen Ablauf muss ich später nochmal genau checken, bin gerade auf dem Smartphone.Wenn ich den Ordner fix setze, welchen Wert nehme ich für "olFolderInbox" ? Einfach den Ordnernamen den ich in
Outlook sehe?
olFolderInbox ist eine Konstante und bezeichnet den Standardposteingang im Hauptstore.Outlook sehe?
Denke aber mal bei einem normalen Schleifendurchlauf wird nicht über Items in Unterordnern iteriert?
Richtig, Dazu müsstest du dann eine Rekursive Funktion nehmen. Hatte ich hier schon mal eine Funktion gepostet, finde sie gerade nur nicht ...
Also, es gibt hier eine Race-Condition (d.h. Event und Regel starten gleichzeitig, bzw kurz nach dem Eintreffen), es kann also sein das eine Mail wenn das Event auftritt bereits verschoben wurde. Die zugeordneten IDs sind nicht die endgültigen für die Elemente im Store. Es gibt aber in der MAPI-Definition eine Eigenschaft namens PR_SEARCH_ID welche beim Eintreffen der Mail sowie später gleich bleiben. Man kann also danach im Store suchen.
Man muss also diese PR_SEARCH_ID so schnell wie möglich im NewMailEx-Event in eine Collection speichern und dann die Ordner des Stores nach dieser ID rekursiv durchforsten.
Siehe dazu auch: http://stackoverflow.com/questions/2301999/vsto-process-mail-using-newm ...
In VBA könnte das so aussehen (ACHTUNG nicht geeignet für IMAP-Konten, da hier das Mailverschieben verzögert stattfindet und die Mails dann nicht gefunden werden), ansonsten nur grob angetestet. In Zeile 4 den Storenamen angeben, der dann durchsucht wird. Man kann das ganze natürlich auch auf alle Stores ausweiten, aber als Beispiel sollte das reichen. Im Beispiel werden dann das Subject der Mail und der Ordner in dem die Mail sich nun befindet mit einer MsgBox ausgegeben.
Weitere Kommentare im Code.
Viel Erfolg
Grüße Uwe
Man muss also diese PR_SEARCH_ID so schnell wie möglich im NewMailEx-Event in eine Collection speichern und dann die Ordner des Stores nach dieser ID rekursiv durchforsten.
Siehe dazu auch: http://stackoverflow.com/questions/2301999/vsto-process-mail-using-newm ...
In VBA könnte das so aussehen (ACHTUNG nicht geeignet für IMAP-Konten, da hier das Mailverschieben verzögert stattfindet und die Mails dann nicht gefunden werden), ansonsten nur grob angetestet. In Zeile 4 den Storenamen angeben, der dann durchsucht wird. Man kann das ganze natürlich auch auf alle Stores ausweiten, aber als Beispiel sollte das reichen. Im Beispiel werden dann das Subject der Mail und der Ordner in dem die Mail sich nun befindet mit einer MsgBox ausgegeben.
Weitere Kommentare im Code.
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim varEntryIDs, objItem As Object, startFolder As Folder, i As Integer, colPRIds As New Collection
' Rootfolder des Stores angeben
Set startFolder = Application.Session.Stores("user@domain.de").GetRootFolder
varEntryIDs = Split(EntryIDCollection, ",")
For i = 0 To UBound(varEntryIDs)
'Objekt holen
Set objItem = Application.Session.GetItemFromID(varEntryIDs(i))
'wenn Objekt ein Mailitem ist
If objItem.CLASS = olMail Then
'extrahiere die PR_SEARCH_ID Eigenschaft und füge sie der Collection hinzu
colPRIds.add getPRSearchKey(objItem)
End If
Next
'kurz warten das die Regeln angewendet wurden
pause 1
'Rekursive Funktion um alle Ordner nach den IDs zu durchsuchen
parseFolder startFolder, colPRIds
End Sub
'Rekursive Prozedur zumm Suchen in einer Ordnerstruktur
Sub parseFolder(ByVal fldr As Folder, ByRef colMails As Collection)
'Wenn der Ordner Mailitems enthält
If fldr.DefaultItemType = olMailItem Then
'für jede ID in der Collection
For Each sID In colMails
'Nur auf ungelesene Mails filtern
For Each itm In fldr.items.Restrict("[UNREAD] = True")
'wenn die ID in der Collection mit der des ITEMS übereinstimmt ...
If getPRSearchKey(itm) = sID Then
MsgBox "Die neue Mail mit dem Subject '" & itm.Subject & "' liegt jetzt im Ordner " & itm.Parent.FolderPath
End If
Next
Next
End If
'Prozedur ruft sich eslbst für alle Unterordner erneut auf
For Each subfolder In fldr.Folders
parseFolder subfolder, colMails
Next
End Sub
'Funktion die die MAPI Eigenschaft **PR_SEARCH_ID** einer Mail extrahiert
Function getPRSearchKey(ByVal m As MailItem)
getPRSearchKey = m.PropertyAccessor.BinaryToString(m.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x300B0102"))
End Function
'Pause-Prozedur
Sub pause(t As Integer)
start = Timer
Do While Timer < start + t
DoEvents
Loop
End Sub
Grüße Uwe
'Setting up button in toolbar
Private Sub Application_Startup()
Dim menueBar As CommandBar, commandButton As CommandBarButton
Set menueBar = ActiveExplorer.CommandBars("Standard")
Set commandButton = menueBar.FindControl(Type:=msoControlButton, Tag:="Toggle")
If commandButton Is Nothing Then
Set commandButton = menueBar.Controls.Add(msoControlButton)
With commandButton
.Tag = "Toggle"
.Caption = "Start"
.Visible = True
.OnAction = "Toggle"
End With
else
commandButton.Caption = "Start"
End If
Set menueBar = Nothing
Set commandButton = Nothing
End Sub
Zitat von @bigfudge:
Bringt das viele Änderungen mit sich? Haben es einfach mal probiert aber der Button wird logischerweise nicht erstellt, da man dort diese RibbonView hat und keine Toolbar. (Vllt. wird er ja sogar erstellt, ich sehe ihn nur nicht)
doch der befindet sich in diesem Fall dann auf dem Tab Add-Ins. Wenn dieser Tab nicht sichtbar ist muss du ihn erst einblenden. Rechtsklick > Menüband anpassenBringt das viele Änderungen mit sich? Haben es einfach mal probiert aber der Button wird logischerweise nicht erstellt, da man dort diese RibbonView hat und keine Toolbar. (Vllt. wird er ja sogar erstellt, ich sehe ihn nur nicht)
Bringt die Anpassung an 2010 große Änderungen mit sich?
Für Verteilung auf unterschiedliche Systeme würde ich ein richtiges COM oder VSTO-Addin daraus schreiben, mit VBA lässt sich das Ribbon nicht vernünftig programatisch steuern, das geht nur mit einem richtigen Add-In.Ansonsten kannst du auch selber einen Button auf dem Ribbon erstellen und diesem halt eine Sub zuweisen die dann je nach Status der Public Variablen diese umschaltet und via MSGBOX eine Meldung ausgibt ob die Funktion aktiviert oder deaktiviert wurde.
Zitat von @bigfudge:
kleine Frage noch . Wie komme ich an Ordner die auf der selben Ebene wie die Inbox liegen?
kleine Frage noch . Wie komme ich an Ordner die auf der selben Ebene wie die Inbox liegen?
Set folder = Application.Session.Stores("user@domain.de").GetRootFolder.Folders("OrdnerXYZ")
Set folder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Parent.Folders("OrdnerXYZ")
hatten wir das oben nicht schon zwei, drei mal ?
ist so langsam Off-Topic
ist so langsam Off-Topic
Habe das nur kurz auf seinem Bildschirm gesehen, er hatte in den Favoriten mehrere Ordner an denen so ein blauer Doppelpfeil dran war, schätze mal die werden irgendwie online synchronisiert.
Die Favoriten verlinken ja nur auf einen anderen Ordner in eine Store, er muss halt lokal erreichbar sein.