Esta questão é uma versão diferente (simplificada) desta postagem do SO (link).
Tenho um script VBA específico do Outlook que desejo executar automaticamente às 14h todos os dias (e outros em vários outros horários). A execução do lado do cliente é adequada, pois o computador está sempre ligado. Como posso fazer isso de forma confiável?
O (vinculado) SO post descreve algumas abordagens que tentei, eesta postagem SOé uma investigação geral sobre abordagens da qual nasceu minha pergunta específica sobre correr de cada vez.
Responder1
Resumo
Criaremos um script Powershell que enviará um e-mail através do servidor smtp do Google. Este script pode ser executado por meio do agendador de tarefas, que permite executá-lo de acordo com um agendamento. Quando o e-mail for recebido no Outlook, uma regra que procura esse e-mail acionará um script VBA do Outlook. Viola.
Passo 1: Crie um arquivo de credencial seguro para a conta do Gmail que você usará para enviar um e-mail de "gatilho" para acionar o script VBA.
No Powershell, execute
read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt
Isso armazenará uma versão segura da sua senha dessa conta do Gmail em seu diretório de usuários. Observe que se você usar autenticação de dois fatores, você desejará obter umsenha do aplicativoem vez da senha normal para essa credencial, que você usará nas etapas a seguir.
Passo 2: Este script Powershell enviará um e-mail através do servidor smtp do Google usando suas próprias credenciais fornecidas. Defina os campos adequadamente, escolhendo um assunto específico e exclusivo (por exemplo, "@TRIGGERMYVBA21") que você anotará em sua regra do 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
Salve o script como um arquivo .ps1.
Etapa 3:Certifique-se de criar regras no Outlook que possam "executar script" como uma ação. Se não puder, você precisará usar o regedit para acessar HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security
e adicionar um novo DWORD (valor de 32 bits) intitulado, "EnableUnsafeClientMailRules"
com valor 1.
Passo 4: Crie uma regra que encontre:
- O endereço do Gmail que você usará no script Powershell para acionar a regra
- A linha de assunto exclusiva que você criou no script Powershell (por exemplo, "@TRIGGERMYVBA21")
e então:
- Exclui o e-mail,
- E executa um script
Etapa 5: Configure uma regra do Agendador de tarefas que acione o script Powershell nos momentos em que você deseja executá-lo. Você selecionará "iniciar um programa" como a ação, depois digitará "powershell" para o programa e, finalmente, "-File directory\script.ps1" na caixa de adição de argumentos.
Para que conste, estou usando isso para adiar e-mails até que sejam acionáveis usando o script VBA de movimentação de pastas. Eu movo e-mails para pastas específicas e eles são movidos de volta para a caixa de entrada quando a regra é acionada para essa pasta específica.
Esse script está incluído aqui para completar:
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