Outlook Freigabe Postfach abrufen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Outlook Freigabe Postfach abrufen

    Hi,

    ich möchte aus meinem Outlook im MS Office Home and Business 2010 Version 14.0.7... 32 Bit Daten per Code auslesen, es geht um die Anzahl der ungelesenen Emails die ich aktuell in der Inbox/Posteingang habe.
    Hierzu habe ich auch eine Lösung im Netz gefunden und eingebaut:

    (Einziger Wehrmutstropfen hier: Ich bekomme selber das Late Binding nicht raus, also ist es das einzige Modul in meinem Code OHNE "Option Strict On". Eventuell kann mir ja jemand hier noch behilflich sein, ist aber nicht das eigentliche Problem.Hier ist der Code mit Late-Binding: myInbox.UnReadItemCount)

    VB.NET-Quellcode

    1. Sub MAIL_Check(ByVal User As String, ByVal Pass As String, ByRef Neu As Integer, ByRef Gesamt As Integer)
    2. Dim oOutlook As Microsoft.Office.Interop.Outlook.Application
    3. Dim oNs As Microsoft.Office.Interop.Outlook.NameSpace
    4. Dim mapiNameSpace As Microsoft.Office.Interop.Outlook.NameSpace
    5. Dim oFldr As Microsoft.Office.Interop.Outlook.MAPIFolder
    6. On Error GoTo ErrorHandler
    7. oOutlook = New Microsoft.Office.Interop.Outlook.Application
    8. oNs = oOutlook.GetNamespace("MAPI")
    9. mapiNameSpace = oOutlook.GetNamespace("MAPI")
    10. mapiNameSpace.Logon(User, Pass, False, False)
    11. oFldr = oNs.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox)
    12. Dim myInbox As Object = mapiNameSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox)
    13. Dim a As Integer = myInbox.UnReadItemCount
    14. MsgBox("Outlook neu/gesamt: " & CStr(myInbox.UnReadItemCount) & "/" & CStr(myInbox.Items.Count))
    15. Neu = myInbox.UnReadItemCount
    16. Gesamt = myInbox.Items.Count
    17. ErrorHandler:
    18. mapiNameSpace = Nothing
    19. oFldr = Nothing
    20. oNs = Nothing
    21. oOutlook = Nothing
    22. On Error GoTo 0
    23. End Sub


    Das funktioniert so auch mit meiner Email Adressse.

    Nun habe ich aber folgendes Problem:
    Ich habe auch noch Zugriff auf mehrere sogenannte "Freigabe Postfächer".
    Diese sind auf dem MS Exchange Server Offce 365 der in der Cloud, ich habe einfach Rechte in weitere Postfächer zu schauen und dort auch Mails zu verschicken.

    Die Postfächer sind aus Kostengründen nur virtuell, man kann sich nicht per PW und Username einloggen.

    Die Postfächer werden in meienem Outlook angezeigt, ich komme aber partout nicht an die Inbox.UnReadItemCount ran.

    Ist jemandem eine Lösung bekannt, wie man Freigabe-Postfächer ansprechen kann ?

    Vielen Dank vorab für Eure Hilfe.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    versuche es mal so

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim objOutlook As Outlook.Application = New Outlook.Application()
    3. Dim objOutlookoNS As Outlook.NameSpace = objOutlook.GetNamespace("mapi")
    4. objOutlookoNS.Logon("Outlook", Reflection.Missing.Value, False, True)
    5. Dim OutlookMails As Outlook.MAPIFolder = objOutlookoNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
    6. Dim outLookItems As Outlook.Items = OutlookMails.Items
    7. MessageBox.Show(CStr(OutlookMails.UnReadItemCount))
    8. objOutlookoNS.Logoff()
    9. objOutlookoNS = Nothing
    10. outLookItems = Nothing
    11. objOutlook = Nothing
    12. End Sub
    Hallo Kasi,

    danke für Deinen Beitrag.

    Der Ansatz ist gut.
    Das Strict On Problem ist hiermit gelöst, vielen Dank dafür.

    Leider sieht der auch nur mein eigenes Postfach, die beiden "Freigabe Postfächer" aber nicht.


    Ideen ?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mabbi“ ()

    meine Vermutung = du musst denn 'Folder' auch ansprechen

    hab es abgeändert

    VB.NET-Quellcode

    1. Dim objOutlook As Outlook.Application = New Outlook.Application()
    2. Dim objOutlookoNS As Outlook.NameSpace = objOutlook.GetNamespace("mapi")
    3. objOutlookoNS.Logon("Outlook", Reflection.Missing.Value, False, True)
    4. Dim OutlookMails As Outlook.MAPIFolder = objOutlookoNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
    5. Dim outLookItems As Outlook.Items = OutlookMails.Items
    6. Dim c As Outlook.MAPIFolder
    7. c = OutlookMails.Folders("inSubFolder") '<--- dein Foldername angeben
    8. MessageBox.Show(CStr(c.UnReadItemCount))
    9. objOutlookoNS.Logoff()
    10. objOutlookoNS = Nothing
    11. outLookItems = Nothing
    12. objOutlook = Nothing
    Hallo Kasi,

    ich komme damit leider nicht weiter.

    Ich kann mit deinem Code OutlookMails.Folders("inSubFolder") ohne error Daten abrufen wenn ich hier eine Zahl zwischen 1 und 6 eingebe. Alle Ergebnisse geben dann aber 0 aus, obwohl ungelesene Emails da sind.

    Was genau muss ich dort eingeben ? Eine Kombination aus meinem Postfach Namen und oder "Posteingang" oder muss ich "InBox" nutzen ?

    Ich finde keine sinnvollen Definitionen zu outlook.Folders, sorry.

    Gibt es hierzu bitte einen Hinweis.. :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    führe das mal aus, kannst du denn Folder auswählen denn du haben möchtest

    VB.NET-Quellcode

    1. Public strFolders As String
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. GetFolderNames()
    4. End Sub
    5. Public Sub GetFolderNames()
    6. Dim olApp As Outlook.Application
    7. Dim olSession As Outlook.NameSpace
    8. Dim olStartFolder As Outlook.MAPIFolder
    9. Dim lCountOfFound As Integer
    10. lCountOfFound = 0
    11. olApp = New Outlook.Application
    12. olSession = olApp.GetNamespace("MAPI")
    13. 'Auswahl erlauben
    14. olStartFolder = olSession.PickFolder
    15. If Not (olStartFolder Is Nothing) Then
    16. 'hier verarbeiten
    17. End If
    18. strFolders = ""
    19. End Sub
    Hallo Kasi,

    ich habe Deinen Code wie folgt modifiziert:

    VB.NET-Quellcode

    1. If Not (olStartFolder Is Nothing) Then
    2. 'hier verarbeiten
    3. strFolders = olStartFolder.FolderPath
    4. End If


    Die Ergebnisse in strFolders sind je nach Auswahl auch unterschiedlich: (anonymisiert)
    \\meinName@meineFirma.de\Posteingang
    \\info@meineFirma.de\Posteingang
    \\service@meineFirma.de\Posteingang

    Wenn ich nun hier den Wert nutzen will:

    VB.NET-Quellcode

    1. c = OutlookMails.Folders(strFolders)


    dann bekomme ich aber folgenden Error:

    {"Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden."}
    {System.Collections.ListDictionaryInternal}
    Error Code: -2147221233
    {Microsoft.Office.Interop.Outlook.MAPIFolder get_Item(System.Object)}

    Weil Du strFolders als String initialisiert hast habe ich den FolderPath genmmen. Das scheint aber so nicht zu funktionieren ?
    versuche es so

    VB.NET-Quellcode

    1. Public strFolders As String
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. GetFolderNames()
    4. End Sub
    5. Public Sub GetFolderNames()
    6. Dim olApp As Outlook.Application
    7. Dim olSession As Outlook.NameSpace
    8. Dim olStartFolder As Outlook.MAPIFolder
    9. Dim lCountOfFound As Integer
    10. lCountOfFound = 0
    11. olApp = New Outlook.Application
    12. olSession = olApp.GetNamespace("MAPI")
    13. 'Auswahl erlauben
    14. olStartFolder = olSession.PickFolder
    15. If Not (olStartFolder Is Nothing) Then
    16. 'hier verarbeiten
    17. ProcessFolder(olStartFolder)
    18. End If
    19. strFolders = ""
    20. End Sub
    21. Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)
    22. Dim iCounter As Integer
    23. Dim olNewFolder As Outlook.MAPIFolder
    24. Dim olTempFolder As Outlook.MAPIFolder
    25. Dim olTempFolderPath As String
    26. Dim olCount As Integer
    27. Dim lCountOfFound As Integer
    28. For iCounter = CurrentFolder.Folders.Count To 1 Step -1
    29. olTempFolder = CurrentFolder.Folders(iCounter)
    30. olTempFolderPath = olTempFolder.FolderPath
    31. 'olCount = olTempFolder.Items.Count
    32. olCount = olTempFolder.UnReadItemCount
    33. If olCount > 0 Then
    34. Debug.WriteLine(olTempFolderPath & " " & olCount)
    35. strFolders = strFolders & vbCrLf & olTempFolderPath & vbTab & olCount
    36. lCountOfFound += 1
    37. Else
    38. End If
    39. Next
    40. For Each olNewFolder In CurrentFolder.Folders
    41. If olNewFolder.Name <> "Gelöschte Elemente" Then
    42. ProcessFolder(olNewFolder)
    43. End If
    44. Next
    45. End Sub
    Hallo Kasi,

    vielen Dank für den Code.

    Ich habe getestet und das ist schon ganz dicht dran.

    Ein kleines Problem habe ich aber noch, hierzu bitte etwas Hilfe.

    So sieht mein MailFolderPicker aus (anonymisert):



    Wenn ich den "Posteingang" auswähle (die Daten will ich ja eigentlich sehen) dann läuft die For-Schleife nur durch "Archiv" bis zu dem letzten nach "Infected Items"
    In dem gerade sichtbaren Zustand: Ergebnis 0 ungelesene Mails.

    Wenn ich aber meinen Namen anklicke, dann kommen erst 2 Errors, dann das richtige Ergebnis = 2 und danach wieder Errors.

    Der 1. Error lautet Synchronisierungprobleme 17122
    Der 2. Error lautet PersonMetadata 1387
    Dann kommt Posteingang korrekt mit 2 (ungelesen Emails)
    Der 3. Error lautet Synchronisierungprobleme/Lokale Probleme 10
    Der 4. Error lautet Synchronisierungprobleme/Konflikte 6527

    Die Frage die ich mir nun stelle:
    Ich kann das einfach rausfiltern und bekomme das gewünschte Ergebnis.
    Machen diese Meldungen irgendwelche Probleme oder kann ich die einfach ignorieren ? Ich bin leider kein Wissender in Sachen Exchange Server :(

    EDIT:
    Nach Rücksprache mit unserer IT folgender Hinweis: Nicht anfassen, das soll so sein und macht keine Probleme.
    Also ist Filtern Ok und ich werde das so umsetzen.

    Vielen Dank an KASI, super Hilfe und erfolgreich gelöst. :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    geht es denn nur um die InBox?
    ich hatte es so verstanden das alle Folder kontrolliert werden sollen

    schuss ins blaue wenn nur die InBox von xyz@t-online.de gezählt werden soll

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim objOutlook As Outlook.Application = New Outlook.Application()
    3. Dim objOutlookoNS As Outlook.NameSpace = objOutlook.GetNamespace("mapi")
    4. objOutlookoNS.Logon("Outlook", Reflection.Missing.Value, False, True)
    5. Dim olRecip As Outlook.Recipient
    6. olRecip = objOutlookoNS.CreateRecipient("xyz@t-online.de")
    7. olRecip.Resolve()
    8. Dim OutlookMails As Outlook.MAPIFolder = objOutlookoNS.GetSharedDefaultFolder(olRecip, Outlook.OlDefaultFolders.olFolderInbox)
    9. Dim outLookItems As Outlook.Items = OutlookMails.Items
    10. MessageBox.Show(CStr(OutlookMails.UnReadItemCount))
    11. objOutlookoNS.Logoff()
    12. objOutlookoNS = Nothing
    13. outLookItems = Nothing
    14. objOutlook = Nothing
    15. End Sub
    Hallo Kasi,

    der Code funktioniert auch gut, vielen Dank.

    Ich hatte mich leider nicht exakt ausgedrückt... in meinem Postfach checke ich nur den Posteingang, in anderen Freigabe Fächern alles.
    Somit sind beide Lösungen von Dir hilfreich, vielen Dank für Deine Unterstützung.

    Bin nun mit allen offenen Punkten fertig und habe gerade die Version 1.0 meines Projekts auf Release gestellt und . :thumbsup:

    Edit:

    Als abschliessende Info, wofür das nun zum Einsatz kommt:

    Kalender Tool mit folgendn Features:
    - Hintergrundbild von WIndows zyklisch verändern
    - Termindatenbank netzwerkfähig
    - zyklische Termine je User per Confi-File (Wochentag, Monats-Datum oder per Jahresdatum)
    - User Preferenzen zu Rechten, Position, Erscheinungsbild, Infos etc. per Konfig-File
    - Einzeltermine in gesonderter multiuser Netzwerk DB mit Alarm- und/oder Privat-Option
    - Rückrufe für andere user setzen, immer privatisiert und mit Alarm
    - Outlook abfragen auf ungelesene Mails auf diverse Postfächer und Freigabe Postfächer (Danke für die umfängliche Hilfe hierbei an Kasi)
    - Visualisierung im Hintergrundbild undTraybar Iconflash und/oder systemInfo.balloon.popup bei abgelaufenen Terminen mit Alarm
    -Viele kleine Wohlfühl-Features

    Mir und meinen Kollegen hilft das enorm bei der Arbeit.
    Ohne dieses Forum und seine Community wäre die Realisierung für mich in diesem Umfang nicht möglich gewesen. Vielen Dank dafür.



    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mabbi“ ()