CrissGross 0 Geschrieben 7. Februar 2016 Melden Teilen Geschrieben 7. Februar 2016 (bearbeitet) 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 wurdeund die Kategorie "AUTOMATISCH" zugeordnet istund nur auf diesem Computerdiese in den Ordner "INBOX/(POSTFACH B)" verschiebeneine 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? 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 7. Februar 2016 von CrissGross Zitieren Link zu diesem Kommentar
Nobbyaushb 1.475 Geschrieben 7. Februar 2016 Melden Teilen Geschrieben 7. Februar 2016 Warum machst du keine Transport-Regel auf dem Exchange? Ist doch viel effektiver und läuft immer, auch ohne Client. ;) 1 Zitieren Link zu diesem Kommentar
CrissGross 0 Geschrieben 7. Februar 2016 Autor Melden Teilen Geschrieben 7. Februar 2016 (bearbeitet) 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 7. Februar 2016 von CrissGross Zitieren Link zu diesem Kommentar
CrissGross 0 Geschrieben 7. Februar 2016 Autor Melden Teilen Geschrieben 7. Februar 2016 (bearbeitet) 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 7. Februar 2016 von CrissGross Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.