Outlook Mail verschieben, Ordner aber variable

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Outlook Mail verschieben, Ordner aber variable

    Hallo zusammen,

    ich versuche gerade ein kleines Programm für Outlook zu schreiben, welches mir doppelte Mails erkennt und dann diese markiert und in einen Outlookordner verschieben soll.

    Das Finden und Markieren ist nicht das Problem, aber das Verschieben. Grundsätzlich funktioniert das Verschieben mit einem festen "Pfad" natürlich, aber dieser soll aus einer Textbox heraus genommen werden. Diese Textbox wird über einen Button 'Btn_OutlookZielOrdner_Click' mit der Auswahl des Outlook-Ordners gefüllt. So kann das Programm variable genutzt werden.

    Nur hierbei habe ich im Netz leider keine Lösung gefunden, wie ich den Ordner ansprechen kann.

    Kann mir von Euch jemand einen Tipp geben?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.Office.Interop
    3. Imports Microsoft.Office.Interop.Outlook
    4. Public Class Form1
    5. 'Dim objOL As New Outlook.Application
    6. 'Public colAtts As Outlook.Attachments
    7. 'Public sFile As String
    8. 'Public sFileType As String
    9. 'Public OutlookDateiname As String
    10. Public objWMI As Object
    11. Public ProcessList As Object
    12. Public Outlookschongestartet As Boolean
    13. ' Create Outlook application.
    14. Public oApp As Outlook.Application 'Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application
    15. Private Sub PBox_DoppelteMailsFinden_Click(sender As Object, e As EventArgs) Handles PBox_DoppelteMailsFinden.Click
    16. ' Hier werden die aktuellen Mailinfos festgehalten
    17. Dim AktuelleMailInfos As String
    18. ' Hier werden die nächsten Mailinfos festgehalten
    19. Dim NaechstenMailInfos As String
    20. ' Hier werden die letzten Mailinfos festgehalten
    21. Dim LetzteMailInfos As String
    22. ' ******************************************************
    23. ' Outlook schön geöffnet?
    24. ' ******************************************************
    25. On Error Resume Next
    26. ' Alle Windows Prozesse aufrufen
    27. objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
    28. ' und dann davon alle filtern, die in ihrem Namen Outlook.exe beinhalten
    29. ProcessList = objWMI.ExecQuery("Select * from Win32_Process " & "Where Name = 'OUTLOOK.EXE'")
    30. ' Wenn die Datensatzmenge = 0 ist, dann ist Outlook auch nicht gestartet
    31. If ProcessList.Count = 0 Then
    32. Outlookschongestartet = False
    33. Else
    34. ' andernfalls schon
    35. Outlookschongestartet = True
    36. 'For Each objProcess In ProcessList
    37. ' objProcess.Terminate 'Prozess beenden
    38. 'Next objProcess
    39. oApp = New Microsoft.Office.Interop.Outlook.Application ' GetObject(, "Outlook.Application")
    40. End If
    41. ' Wenn Outlook nicht gestartet wurde, dies jetzt nachholen
    42. If Outlookschongestartet = False Then
    43. oApp = New Microsoft.Office.Interop.Outlook.Application ' CreateObject("Outlook.Application")
    44. End If
    45. 'oApp = CreateObject("Outlook.Application")
    46. ' Get Mapi NameSpace.
    47. Dim oNS As Microsoft.Office.Interop.Outlook.NameSpace = oApp.GetNamespace("mapi") ' oNS.Logon( "Xyz_Configured_Outlook" , Missing.Value, False , True )
    48. ' Get Messages collection of Inbox.
    49. Dim oInbox As Microsoft.Office.Interop.Outlook.MAPIFolder = oNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox)
    50. Dim overz As MAPIFolder
    51. 'overz = oNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox)
    52. 'oInbox.Display()
    53. Dim oItems As Microsoft.Office.Interop.Outlook.Items = oInbox.Items
    54. 'Console.WriteLine("Total : " & oItems.Count)
    55. ' Get unread e-mail messages.
    56. ' oItems = oItems.Restrict("[unread] = false")
    57. oItems.Sort("[ReceivedTime]", True)
    58. 'Console.WriteLine("Total Unread : " & oItems.Count)
    59. ' Loop each unread message.
    60. Dim oMsg As Object
    61. Dim myDestFolder As Outlook.Folder
    62. Dim oulAusgewählte As Outlook.Selection
    63. Dim i As Integer
    64. Call Outlook_Orderpfad_Umschreiben()
    65. 'For i = 1 To oItems.Count - 1
    66. i = 1
    67. For Each It In oItems
    68. oMsg = oItems.Item(i)
    69. AktuelleMailInfos = oMsg.SenderName & " " & oMsg.Subject & " " & oMsg.ReceivedTime
    70. 'MsgBox(i & vbCrLf & oMsg.SenderName & vbCrLf & oMsg.Subject & vbCrLf & oMsg.ReceivedTime & vbCrLf & oMsg.Body & vbCrLf & "---------------------------" & vbCrLf & "press any key to continue")
    71. oMsg = oItems.Item(i + 1)
    72. NaechstenMailInfos = oMsg.SenderName & " " & oMsg.Subject & " " & oMsg.ReceivedTime
    73. If AktuelleMailInfos = NaechstenMailInfos Then
    74. ' Die Doppelten anzeigen
    75. If MsgBox("Doppelt: " & vbCrLf & vbCrLf & AktuelleMailInfos & vbCrLf & vbCrLf & NaechstenMailInfos & vbCrLf & vbCrLf & "Soll diese Mail nicht gelöscht werden, dann wählen Sie 'JA' aus, andernfalls wird diese Mail gelöscht", MsgBoxStyle.DefaultButton2 + MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Doppelte e-Mail gefunden") = MsgBoxResult.No Then
    76. oItems.Item(i + 1).unread = True
    77. oApp.ActiveExplorer.AddToSelection(oItems.Item(i + 1))
    78. oulAusgewählte = oApp.ActiveExplorer.Selection
    79. End If
    80. End If
    81. If i <= oItems.Count - 2 Then
    82. i = i + 1
    83. Else
    84. Exit For
    85. End If
    86. Next
    87. ' Wenn es doppelte Mails gibt, diese nun verschieben
    88. If oulAusgewählte.Count > 0 Then
    89. For intZähler = 1 To oulAusgewählte.Count
    90. MsgBox(Outlook_Orderpfad_Umschreiben)
    91. oulAusgewählte.Item(intZähler).Move(oApp.Application.Session.Folders(Outlook_Orderpfad_Umschreiben)) ' "meinName@firma.de").Folders("Aktenschrank").Folders("Ablesekarten").Folders("Test"))
    92. Next intZähler
    93. MsgBox("Es wurden " & oulAusgewählte.Count - 1 & " doppelte Mails in den Ordner" & vbCrLf & vbCrLf & TBox_PDFPfad_Temp.Text & vbCrLf & vbCrLf & " als ungelesen verschoben.")
    94. Else
    95. MsgBox("Es gab im Ordner " & oInbox.Name & " keine doppelten Mails." & vbCrLf & vbCrLf & "Verglichen wurde Abseender, Betreffzeile und Datum/Uhrzeit.")
    96. End If
    97. End Sub
    98. Function Outlook_Orderpfad_Umschreiben() As String
    99. Dim Pfadteile() As String
    100. Dim NeuerPfad As String
    101. ' Ein paar unnötige Zeichen löschen
    102. TBox_PDFPfad_Temp.Text = Replace(TBox_PDFPfad_Temp.Text, "\\", "")
    103. Pfadteile = Split(TBox_PDFPfad_Temp.Text, "\")
    104. NeuerPfad = Chr(34) & Pfadteile(0) & Chr(34)
    105. For z = 1 To Pfadteile.Length - 1
    106. NeuerPfad = NeuerPfad & ").Folders(" & Chr(34) & Pfadteile(z) & Chr(34)
    107. Next
    108. NeuerPfad = NeuerPfad & ")"
    109. Return NeuerPfad
    110. End Function
    111. Private Sub Btn_OutlookZielOrdner_Click(sender As Object, e As EventArgs) Handles Btn_OutlookZielOrdner.Click
    112. TBox_PDFPfad_Temp.Text = Outlook_Ordner_auswaehlen()
    113. End Sub
    114. Function Outlook_Ordner_auswaehlen() As String
    115. ' Create Outlook application.
    116. Dim oApp As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application
    117. ' Get Mapi NameSpace.
    118. Dim oNS As Microsoft.Office.Interop.Outlook.NameSpace = oApp.GetNamespace("mapi")
    119. Dim oFolder As Microsoft.Office.Interop.Outlook.MAPIFolder
    120. Dim c As String
    121. oFolder = oNS.PickFolder
    122. Dim f As Int16
    123. For f = 1 To oFolder.Folders.Count
    124. c = oFolder.Folders.Item(f).FolderPath
    125. Next
    126. Return oFolder.FolderPath
    127. End Function
    128. End Class

    Gruß

    Volker

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Volker Bunge“ ()

    Call? On Error Resume Next? MsgBox? Object? GetObject? CreateObject? Wären die ersten paar Zeilen nicht, hätte ich gesagt, dass wir uns hier mit VBA/VB6 beschäftigen …
    Was ist denn nun das Problem? Funktioniert Zeile#101 nicht, wenn Du da einen Ordernamen angibst? Denn dass das so geht, impliziert ja der entsprechende MSDN-Artikel., eben mit ….Move(myInbox.Folders(NameDesZielordners))
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    Zeile 101 funktioniert leider so wie o. g. nicht. Es passiert in Outlook nichts

    In der Textbox steht nach Auswahl des Ordners bsp. \\MeinName@Firma.de\Aktenschrank\Ablesekarten\Test

    lt. Zeile 101 so: oulAusgewählte.Item(intZähler).Move(oApp.Application.Session.Folders("meinName@firma.de").Folders("Aktenschrank").Folders("Ablesekarten").Folders("Test")) dann klappt es mit dieser festen Ordnerstruktur.

    lt. Zeile 101 so:
    oulAusgewählte.Item(intZähler).Move(oApp.Application.Session.Folders(Replace(TBox_PDFPfad_Temp.Text, "\\", ""))) dann funktioniert es nicht. Es kommt aber auch keine Fehlermeldung o. ä.

    Gruß
    Volker
    Ah, ok. Dann eben anders. Ein geprüftes Beispiel, damit Du nachvollziehen kannst, wie es ginge:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Outlook = GetOutlookAppInstance() 'Oder eben Deine Methode wie Du an die Outlook-Instanz kommst
    3. Dim TargetDirectory = "Foo\Bar\Baz"
    4. Dim TargetFolder = GetFolderFrom(TargetDirectory.Split("\"c), Outlook.Session.Folders(1)) 'das ist eben wichtig
    5. DirectCast(Outlook.ActiveExplorer.Selection.Item(1), Microsoft.Office.Interop.Outlook.MailItem).Move(TargetFolder) '*
    6. End Sub
    7. Private Function GetFolderFrom(FolderNames As IEnumerable(Of String), RootFolder As Microsoft.Office.Interop.Outlook.MAPIFolder) As Microsoft.Office.Interop.Outlook.MAPIFolder
    8. Dim TargetFolder = RootFolder
    9. For Each FolderName In FolderNames
    10. TargetFolder = TargetFolder.Folders(FolderName)
    11. Next
    12. Return TargetFolder
    13. End Function

    * hier zwar nur die bereits in Outlook erste selektierte Mail, aber ich glaube den Einbau in Deinen Code bekommst Du hin
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed,

    vielen Dank erst einmal für Deine Antwort.

    Da ist ein Büroprojekt ist, konnte ich erst heute weitermachen.

    Nur mal so zum Verständnis.

    Outlook_Orderpfad_Ermitteln(TargetDirectory.Split("\"c), oApp.Session.Folders(1)):
    Hier wird der kpl. Outlookordnerzielpfad gesplittet und der Hauptordner (meineAdresse@firma.de) übergeben.

    In der Funktion 'GetFolderFrom' kommen dann ein Array mit den einzelnen Ordnernamen an. Am Anfang ist hier aber auch noch meineAdresse@firma.de.
    Frage: Was soll die For-Each-Schleife bewirken? Sie steigt bei mir mit Nothing aus.

    Habe den DirectCast mal so angepasst: DirectCast(oulAusgewählte.Item(intZähler), Microsoft.Office.Interop.Outlook.MailItem).Move(TargetFolder). Da passiert leider garnichts. Weder Fehlermeldung noch ein Move.
    Auch oulAusgewählte.Item(intZähler).Move(TargetFolder) geht leider nicht.

    Hast Du da eine Lösung bzw. kannst mir Deinen Code noch einmal im Detail erklären?

    Da Du ja geschrieben hast, das es ein geprüftes Beispiel ist, ist es evtl. Versionsabhängig? Ich benutze hier im Büro Office 365 und Outlook Exchange.

    Meine Lösung soll später mit möglichst vielen Outlook-Versionen laufen (aber dazu muss ich noch mal im Internet nach sehen bzw. hier noch in einem neuen Thread nachfragen).

    Gruß

    Volker
    Wenn Du ein Zielverzeichnis hast, z.B. "meinName@firma.de\Aktenschrank\Ablesekarten\Test", dann wird durch das Split und meine Funktion der entsprechende Ordner rausgesucht, indem eine List mit den Einträgen
    meinName@firma.de, Aktenschrank, Ablesekarten und Test erstellt wird und dann durch die For-Schleife in dem ersten Ordner meinName@firma.de nach Aktenschrank gesucht wird, dann in dem Ordner nach Ablesekarten, ….
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.