Esta pregunta es una versión diferente (simplificada) de esta publicación SO (enlace).
Tengo un script VBA de Outlook en particular que quiero ejecutar automáticamente a las 2 p.m. todos los días (y otros en muchos otros momentos). Ejecutar el lado del cliente está bien, ya que la computadora siempre está encendida. ¿Cómo puedo lograr esto de manera confiable?
El (vinculado) La publicación SO describe algunos enfoques que probé yesta publicación SOEs una indagación general sobre enfoques de la que nació mi pregunta específica sobre correr a la vez.
Respuesta1
Resumen
Crearemos un script de Powershell que enviará un correo electrónico a través del servidor SMTP de Google. Este script se puede ejecutar a través del programador de tareas, lo que le permite ejecutarlo según una programación. Cuando se recibe el correo electrónico en Outlook, una regla que busca ese correo electrónico activará un script VBA de Outlook. Viola.
Paso 1: Cree un archivo de credencial seguro para la cuenta de Gmail que utilizará para enviar un correo electrónico "activador" para activar el script VBA.
En Powershell, ejecute
read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
Esto almacenará una versión segura de su contraseña para esa cuenta de Gmail en su directorio de usuarios. Tenga en cuenta que si utiliza la autenticación de dos factores, querrá obtener unacontraseña de la aplicaciónen lugar de su contraseña normal para esta credencial, que utilizará en los siguientes pasos.
Paso 2: Este script de Powershell enviará un correo electrónico a través del servidor SMTP de Google utilizando sus propias credenciales proporcionadas. Configure los campos apropiadamente, eligiendo un tema particular y único (por ejemplo, "@TRIGGERMYVBA21") que anotará en su regla de Outlook.
# 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
Guarde el script como un archivo .ps1.
Paso 3:Asegúrese de poder crear reglas en Outlook que puedan "ejecutar secuencias de comandos" como una acción. Si no puede, deberá usar regedit para ir HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
y agregar un nuevo DWORD (valor de 32 bits) titulado, "EnableUnsafeClientMailRules"
con valor 1.
Etapa 4: Cree una regla que encuentre:
- La dirección de Gmail del Gmail que usarás en el script de Powershell para activar la regla.
- La línea de asunto única que creó en el script de Powershell (por ejemplo, "@TRIGGERMYVBA21")
y luego:
- Elimina el correo electrónico,
- Y ejecuta un script
Paso 5: Configure una regla del Programador de tareas que active el script de Powershell en el momento en que desee ejecutarlo. Seleccionará "iniciar un programa" como acción, luego escribirá "powershell" para el programa y, finalmente, "-Directorio de archivos\script.ps1" en el cuadro para agregar argumentos.
Para que conste, estoy usando esto para posponer los correos electrónicos hasta que sean procesables usando el script VBA que mueve la carpeta. Muevo los correos electrónicos a carpetas concretas y luego los devuelvo a la bandeja de entrada cuando se activa la regla para esa carpeta en particular.
Ese script se incluye aquí para que esté completo:
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