Diese Frage ist eine andere (vereinfachte) Version dieses SO-Beitrags (Verknüpfung).
Ich habe ein bestimmtes Outlook-VBA-Skript, das ich jeden Tag um 14 Uhr automatisch ausführen möchte (und andere zu mehreren anderen Zeiten). Die Ausführung auf der Clientseite ist problemlos möglich, da der Computer immer eingeschaltet ist. Wie kann ich dies zuverlässig erreichen?
Der (verknüpft) SO Post skizziert ein paar Ansätze, die ich versucht habe, unddieser SO-Beitragist eine allgemeine Anfrage zu Vorgehensweisen, aus der meine spezifische Frage zum Thema „Laufen auf einmal“ entstanden ist.
Antwort1
Zusammenfassung
Wir erstellen ein Powershell-Skript, das eine E-Mail über den SMTP-Server von Google sendet. Dieses Skript kann über den Taskplaner ausgeführt werden, sodass Sie es nach einem Zeitplan ausführen können. Wenn die E-Mail in Outlook empfangen wird, löst eine Regel, die nach dieser E-Mail sucht, ein Outlook-VBA-Skript aus. Viola.
Schritt 1: Erstellen Sie eine sichere Anmeldeinformationsdatei für das Gmail-Konto, das Sie zum Senden einer „Trigger“-E-Mail zum Auslösen des VBA-Skripts verwenden.
Führen Sie in Powershell aus
read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
Dadurch wird eine sichere Version Ihres Passworts für dieses Gmail-Konto in Ihrem Benutzerverzeichnis gespeichert. Beachten Sie, dass Sie bei Verwendung der Zwei-Faktor-Authentifizierung eineApp-Passwortanstelle Ihres normalen Passworts für diese Anmeldeinformationen, das Sie in den folgenden Schritten verwenden werden.
Schritt 2: Dieses Powershell-Skript sendet eine E-Mail über den SMTP-Server von Google unter Verwendung Ihrer eigenen Anmeldeinformationen. Legen Sie die Felder entsprechend fest und wählen Sie einen ganz bestimmten, eindeutigen Betreff (z. B. „@TRIGGERMYVBA21“), den Sie in Ihrer Outlook-Regel notieren.
# You must paste your password after running the command:
# read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
# before running the next part of the script.
#Create credential file
$password = get-content $Home\autopass.txt | convertto-securestring
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "[email protected]",$password
#Send automatic email
$From = "[email protected]"
$To = "[email protected]"
$Subject = "@TRIGGERMYVBA21"
$Body = "some body"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential ($credentials)
# possible additions
# $Cc = "[email protected]"
# $Attachment = "dir\attachment.txt"
# both of which require the following tags in the Send-MailMessage command
# -Attachments $Attachment -Cc $Cc
Speichern Sie das Skript als .ps1-Datei.
Schritt 3:Stellen Sie sicher, dass Sie in Outlook Regeln erstellen können, die als Aktion „Skript ausführen“ können. Wenn das nicht möglich ist, müssen Sie mit regedit HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
ein neues DWORD (32-Bit-Wert) mit dem Titel "EnableUnsafeClientMailRules"
und dem Wert 1 hinzufügen.
Schritt 4: Erstellen Sie eine Regel, die Folgendes findet:
- Die Gmail-Adresse des Gmails, die Sie im Powershell-Skript verwenden, um die Regel auszulösen
- Die eindeutige Betreffzeile, die Sie im Powershell-Skript erstellt haben (z. B. „@TRIGGERMYVBA21“)
und dann:
- Löscht die E-Mail,
- Und führt ein Skript aus
Schritt 5: Richten Sie eine Taskplanerregel ein, die das Powershell-Skript zu den gewünschten Zeitpunkten auslöst. Wählen Sie als Aktion „Programm starten“ aus, geben Sie dann „Powershell“ als Programm ein und schließlich „-File directory\script.ps1“ in das Feld „Argumente hinzufügen“.
Zur Information: Ich verwende dies, um E-Mails zurückzustellen, bis sie mithilfe des VBA-Skripts zum Verschieben von Ordnern bearbeitet werden können. Ich verschiebe E-Mails in bestimmte Ordner und sie werden dann zurück in den Posteingang verschoben, wenn die Regel für diesen bestimmten Ordner ausgelöst wird.
Der Vollständigkeit halber ist dieses Skript hier enthalten:
Sub moveTheItems(item As Outlook.MailItem)
Dim myNameSpace As Outlook.NameSpace
Dim myInbox As Outlook.Folder
Dim myDestFolder As Outlook.Folder
Dim myItems As Outlook.Items
Dim myItem As Object
Set myNameSpace = Application.GetNamespace("MAPI")
Set myInbox = myNameSpace.GetDefaultFolder(olFolderInbox)
Set myItems = myInbox.Items
Set myDestFolder = myInbox
Set myItems = myInbox.Folders("Snooze Until 3 PM").Items
For i = myItems.Count To 1 Step -1 'Iterates from the end backwards
myItems.item(i).Move myDestFolder
Next
End Sub