Agendar execução do script VBA do Outlook por vez

Agendar execução do script VBA do Outlook por vez

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\Securitye 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

informação relacionada