Jump to content

Regeln über VBA (Makro) oder Powershell starten


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen!

Folgendes Problem, ich habe 1 bzw. 2 Regeln erstellt.
Eine Regel davon beinhaltet folgendes.

Nach Erhalt einer Nachricht,
über das Konto "ZENTRALES-POSTFACH"
und die an "ZENTRALES-POSTFACH" gesendet wurde
und die Kategorie "AUTOMATISCH" zugeordnet ist
und nur auf diesem Computer
diese in den Ordner "INBOX/(POSTFACH B)" verschieben
eine Kopie davon in den Ordner "INBOX/(POSTFACH C)" verschieben.
außer der Absender der Nachricht ist "ZENTRALES-POSTFACH"

Auf dieses zentrale Postfach greifen 50 Mitarbeiter zu, das "Postfach B" und "Postfach C" wo bestimmte Mails mit der zugewiesenen Kategorie hinverschoben werden sollen, ist nur auf einem "Server" bzw. auf einem einzigen Client-Rechner in Outlook eingebunden.

Jetzt greifen die Regeln aber leider nicht automatisch. Also habe ich mir ein VB Script zusammengetragen das alle X Sekunden alle Regeln ausführen soll.
Das funktioniert auch. Allerdings läuft das Script nicht, welches die Regeln anstoßen soll. Es lässt die Client Regel leider aussen vor. Anbei das Script um die Regeln anzustoßen. Im übrigen funktionieren die Regeln wenn ich diese manuell Starte.

Public Sub RunRules()
  Dim RunEnabledRules As Boolean
  Dim RunDisabledRules As Boolean
  Dim ExecuteOption As Long
  Dim IncludeSubfolders As Boolean
  Dim Inbox As Boolean
  
  'Aktivierte Regeln ausführen (true/false)
  RunEnabledRules = True
  
  'Deaktivierte Regeln ausführen (true/false)
  RunDisabledRules = False
  
  'Auf welche Nachrichten sollen die Regeln angewendet werden?
  '0 = alle Nachrichten
  '1 = nur gelesene Nachrichten
  '2 = nur ungelesene Nachrichten
  ExecuteOption = 0
  
  'Startordner ist der Posteingang (true) oder der aktuelle Ordner (false)
  Inbox = True
  
  'Regeln nur auf den Startordner anwenden (false) oder auch auf dessen Unterordner (true)
  IncludeSubfolders = False
  
  RunRules_ex RunEnabledRules, RunDisabledRules, ExecuteOption, IncludeSubfolders, Inbox
End Sub




Private Sub RunRules_ex(ByVal RunEnabledRules As Boolean, ByVal RunDisabledRules As Boolean, _
  ByVal ExecuteOption As Long, ByVal IncludeSubfolders As Boolean, ByVal Inbox As Boolean)
  Dim Store As Outlook.Store
  Dim Rules As Outlook.Rules
  Dim Rule As Outlook.Rule
  Dim Folder As Outlook.Folder
  
  If Inbox Then
    Set Folder = Application.Session.GetDefaultFolder(olFolderInbox)
  Else
    Set Folder = Application.ActiveExplorer.CurrentFolder
  End If
  
  Set Store = Application.Session.DefaultStore
  Set Rules = Store.GetRules
  For Each Rule In Rules
    If Rule.RuleType = olRuleReceive Then
      If Rule.Enabled Then
        If RunEnabledRules Then
          Rule.Execute , Folder, IncludeSubfolders, ExecuteOption
        End If
      Else
        If RunDisabledRules Then
          Rule.Execute , Folder, IncludeSubfolders, ExecuteOption
        End If
      End If
    End If
  Next
End Sub

Muss ich die Client Regeln evtl. im Script irgendwie anders ansprechen? Geht das überhaupt? Falls ja, wie geht das? smile.gif
Bin übrigen die nächsten 8 Stunden dauer online hier im Forum, ich werde schnell antworten ;-) falls es Fragen gibt.


Also vielleicht noch zu meiner Person, da dies auch der erste Beitrag bei euch im Forum ist.

Ich persönlich bin Programmcodeafin ;-) habe zwar nicht IT studiert, betreue allerdings bei meinem Arbeitgeber genügend Programme, Server, Websiten & Datenbanken.
Sicherlich bin ich kein Profi, aber Abläufe von Programmcodes sind für mich zu verstehen.

Im übrigen gehört auch zu meinem Motto, sobald ich eine Lösung für ein Problem habe, werde ich das auch in jedem meiner Beitrage als Finale Version klarstellen... damit die Nachweld auch was davon hat.


EDIT 13:47 Uhr

Mir ist gerade noch eine Idee gekommen,

 

via Powershell würde sich doch ebenfalls das ganze Konstruk umsetzen lassen?
Quasi E-Mails aus einem bestimmten Ordner in den Posteingang einer anderen Mailbox verschieben.

 

Das Script könnte ich dann theoretisch sogar über den Aufgaben/ Taskplaner von Windows ablaufen lassen.

Vielleicht stößt ja der ein oder andere Powershell Enthusiast dazu...

Grüße Chris

bearbeitet von CrissGross
Link zu diesem Kommentar

Das ist leider nicht möglich, denn das 2. Postfach ist ein "lokales Imap Postfach" auf einem Server der im Firmennetzwerk steht. Somit wäre das 2. Postfach in welches die Mails verschoben werden sollen nur über den Client sichtbar, also über Outlook.

 

EDIT NUMMER 1

Im übrigen haben wir als Gesellschaft nur FULL ACCESS Berechtigungen auf unsere Exchange Postfächer. Wir haben leider keinen Zugriff auf die Administrationstools des Exchange Servers.

 

 

EDIT NUMMER 2

Wobei?! Hab mich damit gerade mal kurz auseinander gesetzt... via Remote Shell hätte ich Zugriff  :D

Nach Eingabe meiner Nutzerkennung und meines PWs...

SET-ExecutionPolicy RemoteSigned
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session

Jetzt verstehe ich das Prinzip allerdings nicht... eine Transportregel wird doch ausgeführt, bevor diese E-Mail in dem ursprünglichen Postfach eintrifft? Das heisst, ein Mitarbeiter könnte dieser Nachricht keine Kategorie mehr mitgeben, bzw. diese Email würde vorher in dem zentralen Postfach nicht in einen bestimmten Ordner wandern?

 

Oder verstehe ich das Prinzip gerade nicht....

 

:-( Ich sitz schon seit heute morgen 7:30 an dem Problem, da ich morgen mit dem neuen System Produktiv gehen muss...

 

PS EDIT ist mein zweiter Name^^

 

 

EDIT NUMMER 3 (15:20 Uhr)

Habe gerade eben noch folgenden Code zusammengeschnippselt.
Für mich hört sich dieser Sehr vielversprechend an.

Nur verstehe ich nicht, wie ich $Namespace.Store[iD] <<< die ID herbekomme... habe jetzt etwas gegoogled, werde aber nicht schlauer. Befasse mich erst seid ein paar Stunden mit Powershell.

 

Zum Testen habe ich nun in meinem persönlichen Postfach unter der Inbox einen Ordner TESTAUSGANG und einen Ordner TESTEINGANG.

$outlook = New-Object -ComObject outlook.application
$namespace  = $Outlook.GetNameSpace("mapi")
$namespace.Logon("Outlook")

$LocalStore = $Namespace.Stores[1]
$RemoteStore = $Namespace.Stores[1]


$LocalFolders = $LocalStore.GetRootFolder().folders
$RemoteFolders = $RemoteStore.GetRootFolder().folders

$RemoteInbox = $RemoteFolders | ? {$_.Name -eq "Inbox\TESTEINGANG"}
$LocalInbox = $LocalFolders | ? {$_.Name -eq "Inbox\TESTAUSGANG"}

$RemoteInbox.CopyTo($LocalInbox.Parent)

Foreach ($Item in $RemoteInbox.Items){
$Copy = $Item.Copy()
[void]$Copy.Move($TargetFolder)
}

EDIT NUMMER 4 (16:32 Uhr)

Ok ich habe die einfache Lösung via PowerShell!

Clear-Host
$Outlook = New-Object -ComObject Outlook.Application

# Move Emails from Mailbox "2" INBOX/TESTEINGANG to Mailbox "8" INBOX
$EmailIToMove = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Items
$EmailIToMove | ft SentOn, Subject, SenderName, To, Sensitivity -AutoSize -Wrap
$NewFolder = $Outlook.Session.Folders.Item(8).Folders.Item("INBOX")

FOREACH($Email in $EmailIToMove )
    { 
        $Email.Move($NewFolder) 
    }

Würde jetzt gerne noch die Mailboxen anstatt mit einer ID mit dem geneuen oder ähnlichen Namen ansprechen.
Damit später bei Einrichtung bzw. entfernen einer Mailbox die ID's nicht zufällig durch andere ersetzt werden. Das wäre Fatal.

Vielleicht kann mir hierzu noch einer helfen.

Nice to Have, wäre auch, wenn das Script die Bedingung einer Kategorie prüft. Aber das sollte ich wohl noch ergoogeln können.

Trotzdem Danke an Nobbyaushm, der mich auf die Idee mit Powershell gebracht hat.

bearbeitet von CrissGross
Link zu diesem Kommentar

Für die Nachwelt, eine Lösung via PowerShell.

Leider hab ich es nicht mehr geschafft die IDs der Postfächer auszulesen und musste Sie vorher "manuell" bestimmen.
Schön wäre evtl auch, das bei einem Fehler nicht in einen anderen Ordner verschoben wird sondern eine Kategorie Namens Fehler hinzugefügt wird.

 

Ich kann damit aber erstmal leben :)


#PowerShell Retrieves Outlook Email Subject
Clear-Host
$Outlook = New-Object -ComObject Outlook.Application


# Move Emails from Inbox to Test folder
$EmailIToMove = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Items
$EmailIToMove | ft SentOn, Sensitivity, Categories, SenderName, Subject, to -AutoSize -Wrap

$NewFolder =     $Outlook.Session.Folders.Item(8).Folders.Item("INBOX")
$BackupFolder = $Outlook.Session.Folders.Item(8).Folders.Item("INBOX").Folders.Item("Eingehende Nachrichten")
$FailureFolder = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Folders.Item("FEHLER")

$SuchwertCategory = "AUTOMATISCH"
$SuchwertSenderName = "Eigener Mailboxname"


$runde = 0

FOREACH($Email in $EmailIToMove)
    { 
      
      $runde = $runde + 1 
      write-host -nonewline "E-Mail" $runde

       
      $Categories =  ($Email|Select Categories)      
      $SenderName =  ($Email|Select SenderName)

       
           if($Categories -match $SuchwertCategory -and $SenderName -notmatch $SuchwertSenderName) 
           {
                                       
              $Email.Move($NewFolder)  
              $Email.Copy($BackupFolder)
              echo " erfolgreich verschoben!"
                                
           }
          
           elseif($SenderName -match $SuchwertSenderName)
           {
                       
              $Email.Move($FailureFolder) 
              echo " überprüfen! In Fehler-Ordner verschoben!"
                        
           }
          
           else
           {
                        
              echo " nicht verschoben, da Bedingungen nicht erfüllt!"
                        
           }
           

       
     
    }
    
    if($runde -le 1)
    {
    $wort1 = "wurde"
    $wort2 = "E-Mail"
    }
    else
    {
    $wort1 = "wurden"
    $wort2 = "E-Mail(s)"
    }
    
    echo "--------------------------------------------------------"
    write-host -nonewline "Insgesamt"$wort1 $runde $wort2 "gefunden"
  

bearbeitet von CrissGross
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...