Neue E-Mails in öffentlichem Ordner
Hallo,
ich versuche, einen Code zu schreiben, der erkennt, dass eine neue (neu eingegangene bzw. seit letztem Programmstart neu hinzugekommene) E-Mail in einem öffentlichen Ordner vorhanden sind.
Später sollen diese dann auch bearbeitet werden (gedruckt, organisiert).
(Outlook 2010, Exchange, Win7, VB 2010 Express)
Für eine normale Inbox scheine ich das (Copy & Paste) hinbekommen zu haben, Panel1 wird grün wenn eine E-Mail eingeht:
Bei einem nem Öffentlichen Ordner klappt es (bis jetzt) nicht:
Woran könnte es liegen? Setze ich insgesamt vielleicht falsch an? Wäre ggf NewMail oder NewMailEx ein kleverer Ansatz?
Neugierige Grüße,
Andreas
ich versuche, einen Code zu schreiben, der erkennt, dass eine neue (neu eingegangene bzw. seit letztem Programmstart neu hinzugekommene) E-Mail in einem öffentlichen Ordner vorhanden sind.
Später sollen diese dann auch bearbeitet werden (gedruckt, organisiert).
(Outlook 2010, Exchange, Win7, VB 2010 Express)
Für eine normale Inbox scheine ich das (Copy & Paste) hinbekommen zu haben, Panel1 wird grün wenn eine E-Mail eingeht:
Public Class Form1
Private WithEvents olInboxItems As Microsoft.Office.Interop.Outlook.Items
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Application_Startup()
End Sub
Private Sub Application_Startup()
Dim objApp As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application()
Dim objNS As Microsoft.Office.Interop.Outlook.NameSpace = objApp.GetNamespace("mapi")
olInboxItems = objNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox).Items
objNS = Nothing
End Sub
Private Sub olInboxItems_ItemAdd1(ByVal Item As Object) Handles olInboxItems.ItemAdd
Panel1.BackColor = Color.Green
End Sub
Private Sub cmdBtnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBtnReset.Click
Panel1.BackColor = Color.Empty
End Sub
Private Sub cmdBtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBtnClose.Click
Me.Close()
End Sub
End Class
Bei einem nem Öffentlichen Ordner klappt es (bis jetzt) nicht:
Public Class Form1
Private WithEvents olInboxItems As Microsoft.Office.Interop.Outlook.Items
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Application_Startup()
End Sub
Private Sub Application_Startup()
Dim objApp As Microsoft.Office.Interop.Outlook.Application
Dim objNS As Microsoft.Office.Interop.Outlook.NameSpace
Dim objPF As MAPIFolder
Dim objAPF As MAPIFolder
Dim objMKF As MAPIFolder
objApp = New Microsoft.Office.Interop.Outlook.Application()
objNS = objApp.GetNamespace("MAPI")
objPF = objNS.Folders("Öffentliche Ordner - " & objNS.AddressEntry.GetExchangeUser.PrimarySmtpAddress)
objAPF = objPF.Folders("Alle Öffentlichen Ordner")
objMKF = objAPF.Folders("Ordner_01")
olInboxItems = objNS.GetPublicFolder(objMKF).Items
End Sub
Private Sub olInboxItems_ItemAdd1(ByVal Item As Object) Handles olInboxItems.ItemAdd
Panel1.BackColor = Color.Green
End Sub
Private Sub cmdBtnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBtnReset.Click
Panel1.BackColor = Color.Empty
End Sub
Private Sub cmdBtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdBtnClose.Click
Me.Close()
End Sub
End Class
Woran könnte es liegen? Setze ich insgesamt vielleicht falsch an? Wäre ggf NewMail oder NewMailEx ein kleverer Ansatz?
Neugierige Grüße,
Andreas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 212883
Url: https://administrator.de/forum/neue-e-mails-in-oeffentlichem-ordner-212883.html
Ausgedruckt am: 04.04.2025 um 17:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo Andreas,
dein zweites Script kann in dieser Weise nicht funktionieren, da es das Event ItemAdd abfängt welches nur ausgelöst wird wenn du selber im Ordner ein Objekt erstellst.
Wie wäre es, wenn die Mails, die im öffentlichen Ordner auflaufen, automatisch an eine bestimmte Mailbox weitergeleitet werden die du dann mit dem "NewMailEx"-Ereignis abfängst und verarbeitest.
--edit--
alternativ wäre die Entwicklung eines Exchange-Transport-Agents der auf dem Exchange-Server läuft auch eine Lösung.
Grüße Uwe
Wie wäre es, wenn die Mails, die im öffentlichen Ordner auflaufen, automatisch an eine bestimmte Mailbox weitergeleitet werden die du dann mit dem "NewMailEx"-Ereignis abfängst und verarbeitest.
--edit--
alternativ wäre die Entwicklung eines Exchange-Transport-Agents der auf dem Exchange-Server läuft auch eine Lösung.
Grüße Uwe
Heißt dass, dass ich auf irgend eine mysteriöse Weise alle neuen Mails im öffentlichen Ordner erzeuge?
Sorry war mein Fehler, hatte diesbezüglich was anderes im Hinterkopf...Ich würde nun gerne in lblMailID.Text (Zeile 50) die MailID der Mail ausgeben
Ich denke du meinst mit MailID die EntryID der Mail. Auf das Objekt was hinzugefügt wurde kannst du mit Item
zugreifen. Dieses Object wird dem Event ja als Parameter übergeben (Private Sub olInboxItems_ItemAdd1(ByVal Item As Object))Die EntryID fragst du also so ab:
Item.EntryID
.Class
des Objektes tun.Welche Eigenschaften und Methoden für Outlook-Objekte existieren kannst du entweder Online im MSDN oder in der VBA-Hilfe des VBA-Editors in Outlook nachlesen.
Grüße Uwe
Das ist klar, du versuchst aus dem Outlook-Prozess (das ItemAdd-Event gehört auch zu Outlook) ein Steuerelement in einem anderen Prozess (deine Anwendung) zu verändern - das scheitert natürlich weil dies ein illegaler Cross-Thread-Call ist. Dies lässt sich mit Delegates lösen oder du erlaubst in deiner Anwendung Cross-Thread-Calls was aber nicht zum guten Programmier-Stil gehört:
Im Initializer deiner Form dazu folgendes eintragen
Im Initializer deiner Form dazu folgendes eintragen
Control.CheckForIllegalCrossThreadCalls = false
OK das mit den Delegates ist für Anfänger nicht einfach zu verstehen aber hier für dich ein Beispiel für dein Vorhaben:
zuerst deklarierst du den Delegaten(Stellvertreter/Bevollmächtigter) und eine zusätzliche Variable die nachher das neue MailItem enthält in deiner Form-Klasse.
dann schreibst du im Item_Add-Ereigniss folgendes hinein:
zusätzlich erstellst du noch folgende Sub in deiner Klasse:
In dieser Prozedur wird die eigentliche Arbeit in deiner Form gemacht (sie ist quasi die Worker-Prozedur des Delegaten). In dieser kannst du auch noch andere Dinge erledigen die Änderungen an deiner Form setzen müssen.
Klar wenn Probleme auftauchen, einfach melden .. dann wird dir geholfen
Grüße Uwe
Gelöste Beitrage bitte auch als solche markieren.Danke.
zuerst deklarierst du den Delegaten(Stellvertreter/Bevollmächtigter) und eine zusätzliche Variable die nachher das neue MailItem enthält in deiner Form-Klasse.
Public Delegate Sub setLabelInfoDelegate()
Public newIncomingMail As Object = Nothing
newIncomingMail = Item
Dim myDelegate As setLabelInfoDelegate
myDelegate = AddressOf setLabelInfo
Invoke(myDelegate)
Private Sub setLabelInfo()
Try
If Not newIncomingMail Is Nothing Then
lblMailID.Text = newIncomingMail.EntryID
End If
Catch ex As SystemException
MsgBox(ex.Message)
End Try
End Sub
Klar wenn Probleme auftauchen, einfach melden .. dann wird dir geholfen
Grüße Uwe
Gelöste Beitrage bitte auch als solche markieren.Danke.