none
Powershell Exchange Server - E-mails nach dem Lesen löschen RRS feed

  • Frage

  • Hallo liebe Community,

    ich bin neu hier im Forum und das hier ist mein erster Beitrag, deshalb ein Servus an alle.

    Folgendes Problem habe ich momentan:

    Auf ein Unterverzeichnis eines bestimmten Outlook-Kontos fließen ständig neue Mails mit Anhang. 

    Ich möchte die Anhänge von ungelesenen E-Mails je nach Dateiformat in entsprechenden Verzeichnissen abspeichern und die E-Mails anschließend löschen.

    Mein bisheriger Code:

    # file path
    $filepath_accepted_Attachments = “...\akzeptierte_Anhänge”
    $filepath_unaccepted_Attachments = “...\Nicht_akzeptierte_Anhänge”
    
    
    $account = "x@y.de"
    $unterverzeichnis = "Posteingang"
    $regex = "(.jpg|.log)"
    
    
        # Outlook öffnen
        $objOutlook = New-Object -comobject outlook.application
        $objMailbox = $objOutlook.GetNamespace(“MAPI”)
    
       
        # ausgelesenes Postfach und Unterverzeichnis suchen und speichern
    
        $Account = $objMailbox.Folders | Where-Object { $_.Name -eq $account }
    
        $folders = $Account.Folders | Where-Object { $_.Name -eq $unterverzeichnis }
        
        # in Unterverzeichnis des Postfachs ungelesene Nachrichten lesen
        # Anhänge nach ausgelesenem Regex filtern und in entsprechendem Pfad speichern
        # E-Mail als gelesen markieren und löschen 
        $folders.Items.Restrict("[UnRead] = True") | foreach {
            $_.attachments | foreach {
                $filename = $_.filename
    
                if ($filename -match  $regex) {
                    $_.saveasfile((Join-Path $filepath_unaccepted_Attachments $filename))
                    $_.Parent.Unread = $false
                    $_.Parent.delete()
                }
                else {
                    $_.saveasfile((Join-Path $filepath_accepted_Attachments $filename))
                    $_.Parent.Unread = $false
                    $_.Parent.delete()
                }
            }
        }

    Klammere ich die Zeilen 

    $_.Parent.delete() 

    aus, funktioniert alles wie gewollt. Alle ungelesenen Nachrichten werden gelesen, die Anhänge extrahiert und die Nachrichten als gelesen markiert. 

    Sind die delete-Zeilen nicht ausgeklammert, wird immer nur die erste E-Mail als ungelesen markiert und gelöscht. Durch Recherchen habe ich gelesen, dass ich bei der letzten E-Mail anfangen muss und nicht bei der ersten, das hat aber auch noch nicht funktioniert.

    Kann mir da jemand helfen?

    Beste Grüße

    Freitag, 31. Oktober 2014 10:32

Antworten

  • Hallo,

    wie ich das sehe löscht du bei Mails mit mehr als einem Anhang direkt nach dem 1. Anhang die Mail.
    Versuche doch mal das löschen ans Ende der Schleife zu stellen.

    Grüße

    PS:

    Die Mail als gelesen zu kennzeichnen und dann zu löschen ist ja eigentlich unnötig?

    Montag, 3. November 2014 07:27
  • EDIT:

    Ich habe nun einen Counter mitgegeben und es scheint zu funktionieren! Der Counter ist anfangs gleich der Eigenschaft $folders.UnReadItemCount (z.B. 2) verpackt in einer While-Schleife. Ist nun eine E-Mail abgearbeitet, wird das Programm "gezwungen" wieder an den Anfang der While-Schleife zu springen und sieht dann dort (mal angenommen anfangs gab es 2 ungelesene E-Mails) dass Counter nun 1 ist, also immer noch größer 0. Und sucht dann die nächste ungelesene E-Mail. 

    Hier der Code:

    # file path
    $filepath_accepted_Attachments = “...\akzeptierte_Anhänge”
    $filepath_unaccepted_Attachments = “...\Nicht_akzeptierte_Anhänge”
    
    
    $account = "x@y.de"
    $unterverzeichnis = "Posteingang"
    $regex = "(.jpg|.log)"
    
    
        # Outlook öffnen
        $objOutlook = New-Object -comobject outlook.application
        $objMailbox = $objOutlook.GetNamespace(“MAPI”)
    
       
        # ausgelesenes Postfach und Unterverzeichnis suchen und speichern
    
        $Account = $objMailbox.Folders | Where-Object { $_.Name -eq $account }
    
        $folders = $Account.Folders | Where-Object { $_.Name -eq $unterverzeichnis }
        
        # in Unterverzeichnis des Postfachs ungelesene Nachrichten lesen
        # Anhänge nach ausgelesenem Regex filtern und in entsprechendem Pfad speichern
        # E-Mail als gelesen markieren und löschen 
        $Counter = $folders.UnReadItemCount
        while($Counter -gt 0) {
           $folders.Items.Restrict("[UnRead] = True") | foreach {
              $_.attachments | foreach {
                 $filename = $_.filename
    
                 if ($filename -match  $regex) {
                    $_.saveasfile((Join-Path $filepath_unaccepted_Attachments $filename))
                 }
                 else {
                    $_.saveasfile((Join-Path $filepath_accepted_Attachments $filename))
                 }
              }
    	  $_.Unread = $false
    	  $_.delete()
              $Counter--
          }
       }

    Danke für die Hilfe! Falls jemand einen Fehler entdeckt gerne mitteilen

    Beste Grüße

    Eduard

    Montag, 3. November 2014 14:17
  • Hallo,

    kleiner Schoenheitsmakel, du verwendest ForEach-Object, kuerzt es aber mit foreach ab, das kann dann schon mal zu verwechselungen mit der foreach Schleife geben, die die Powershell auch kennt. Ich wuerde es also auschreiben. ForEach-Object.

    # Objekt Bearbeitung in der Pipe
    1..9 | % {$_ + 100}
    1..9 | ForEach {$_ + 100}
    1..9 | ForEach-Object {$_ + 100}
    
    # Schleife
    ForEach ($i in (1..9)) {$i + 100}

    Beste Gruesse
    brima

    Montag, 3. November 2014 14:39

Alle Antworten

  • Hallo Alzenberg,

    Die Lösung Ihrer Frage wird mir sehr interessant sein. Ich hoffe die Community wird Ihnen damit helfen.

    Gruß

    Teodora


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Samstag, 1. November 2014 08:02
    Moderator
  • Hallo,

    wie ich das sehe löscht du bei Mails mit mehr als einem Anhang direkt nach dem 1. Anhang die Mail.
    Versuche doch mal das löschen ans Ende der Schleife zu stellen.

    Grüße

    PS:

    Die Mail als gelesen zu kennzeichnen und dann zu löschen ist ja eigentlich unnötig?

    Montag, 3. November 2014 07:27
  • Hallo!

    Ja, das stimmt, habe ich nun geändert.

    Dennoch wird noch immer nur eine E-Mail gelöscht, was ich nicht verstehe, denn nach meiner Delete-Funktion müsste bei einer noch vorhandenen ungelesenen E-Mail wieder an den Schleifen-Anfang gesprungen werden, oder nicht?

    # file path $filepath_accepted_Attachments = “...\akzeptierte_Anhänge” $filepath_unaccepted_Attachments = “...\Nicht_akzeptierte_Anhänge” $account = "x@y.de" $unterverzeichnis = "Posteingang" $regex = "(.jpg|.log)" # Outlook öffnen $objOutlook = New-Object -comobject outlook.application $objMailbox = $objOutlook.GetNamespace(“MAPI”) # ausgelesenes Postfach und Unterverzeichnis suchen und speichern $Account = $objMailbox.Folders | Where-Object { $_.Name -eq $account } $folders = $Account.Folders | Where-Object { $_.Name -eq $unterverzeichnis } # in Unterverzeichnis des Postfachs ungelesene Nachrichten lesen # Anhänge nach ausgelesenem Regex filtern und in entsprechendem Pfad speichern # E-Mail als gelesen markieren und löschen $folders.Items.Restrict("[UnRead] = True") | foreach { $_.attachments | foreach { $filename = $_.filename if ($filename -match $regex) { $_.saveasfile((Join-Path $filepath_unaccepted_Attachments $filename)) } else { $_.saveasfile((Join-Path $filepath_accepted_Attachments $filename)) } }

    $_.Unread = $false

    $_.delete() }


    Die E-Mails markiere ich als gelesen, da sie sonst im Verzeichnis "Gelöschte Objekte" als ungelesen angezeigt werden, was ich aber unterbinden möchte.

    Grüße

    Eduard

    Montag, 3. November 2014 13:29
  • EDIT:

    Ich habe nun einen Counter mitgegeben und es scheint zu funktionieren! Der Counter ist anfangs gleich der Eigenschaft $folders.UnReadItemCount (z.B. 2) verpackt in einer While-Schleife. Ist nun eine E-Mail abgearbeitet, wird das Programm "gezwungen" wieder an den Anfang der While-Schleife zu springen und sieht dann dort (mal angenommen anfangs gab es 2 ungelesene E-Mails) dass Counter nun 1 ist, also immer noch größer 0. Und sucht dann die nächste ungelesene E-Mail. 

    Hier der Code:

    # file path
    $filepath_accepted_Attachments = “...\akzeptierte_Anhänge”
    $filepath_unaccepted_Attachments = “...\Nicht_akzeptierte_Anhänge”
    
    
    $account = "x@y.de"
    $unterverzeichnis = "Posteingang"
    $regex = "(.jpg|.log)"
    
    
        # Outlook öffnen
        $objOutlook = New-Object -comobject outlook.application
        $objMailbox = $objOutlook.GetNamespace(“MAPI”)
    
       
        # ausgelesenes Postfach und Unterverzeichnis suchen und speichern
    
        $Account = $objMailbox.Folders | Where-Object { $_.Name -eq $account }
    
        $folders = $Account.Folders | Where-Object { $_.Name -eq $unterverzeichnis }
        
        # in Unterverzeichnis des Postfachs ungelesene Nachrichten lesen
        # Anhänge nach ausgelesenem Regex filtern und in entsprechendem Pfad speichern
        # E-Mail als gelesen markieren und löschen 
        $Counter = $folders.UnReadItemCount
        while($Counter -gt 0) {
           $folders.Items.Restrict("[UnRead] = True") | foreach {
              $_.attachments | foreach {
                 $filename = $_.filename
    
                 if ($filename -match  $regex) {
                    $_.saveasfile((Join-Path $filepath_unaccepted_Attachments $filename))
                 }
                 else {
                    $_.saveasfile((Join-Path $filepath_accepted_Attachments $filename))
                 }
              }
    	  $_.Unread = $false
    	  $_.delete()
              $Counter--
          }
       }

    Danke für die Hilfe! Falls jemand einen Fehler entdeckt gerne mitteilen

    Beste Grüße

    Eduard

    Montag, 3. November 2014 14:17
  • Hallo,

    kleiner Schoenheitsmakel, du verwendest ForEach-Object, kuerzt es aber mit foreach ab, das kann dann schon mal zu verwechselungen mit der foreach Schleife geben, die die Powershell auch kennt. Ich wuerde es also auschreiben. ForEach-Object.

    # Objekt Bearbeitung in der Pipe
    1..9 | % {$_ + 100}
    1..9 | ForEach {$_ + 100}
    1..9 | ForEach-Object {$_ + 100}
    
    # Schleife
    ForEach ($i in (1..9)) {$i + 100}

    Beste Gruesse
    brima

    Montag, 3. November 2014 14:39
  • Du hast recht, danke ;-)

    Kann schon schnell zur Verwechslung führen..

    Montag, 3. November 2014 14:52