Расписание запуска скрипта Outlook VBA на определенное время

Расписание запуска скрипта Outlook VBA на определенное время

Этот вопрос представляет собой другую (упрощенную) версию этого поста SO (связь).

У меня есть определенный скрипт Outlook VBA, который я хочу запускать автоматически в 14:00 каждый день (и другие в несколько других моментов времени). Запуск на стороне клиента — это нормально, так как компьютер всегда включен. Как мне сделать это надежно?

(связанный) В посте SO изложены несколько подходов, которые я попробовал, иэтот пост ТАК— это общий вопрос о подходах, из которого родился мой конкретный вопрос о беге за раз.

решение1

Краткое содержание

Мы создадим скрипт Powershell, который будет отправлять электронное письмо через smtp-сервер Google. Этот скрипт можно запустить через планировщик задач, что позволяет запускать его по расписанию. Когда электронное письмо получено в Outlook, правило, которое ищет это электронное письмо, запустит скрипт Outlook VBA. Виола.

Шаг 1: Создайте защищенный файл учетных данных для учетной записи Gmail, которую вы будете использовать для отправки «триггерного» письма для запуска скрипта VBA.

В Powershell запустите

read-host -assecurestring | convertfrom-securestring | out-file $Home\autopass.txt

Это сохранит защищенную версию вашего пароля для этой учетной записи gmail в вашем каталоге пользователей. Обратите внимание, что если вы используете двухфакторную аутентификацию, вам нужно будет получитьпароль приложениявместо обычного пароля для этих учетных данных, который вы будете использовать в следующих шагах.

Шаг 2: Этот скрипт Powershell отправит электронное письмо через smtp-сервер Google, используя предоставленные вами учетные данные. Задайте поля соответствующим образом, выбрав определенную уникальную тему (например, "@TRIGGERMYVBA21"), которую вы укажете в правиле 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

Сохраните скрипт как файл .ps1.

Шаг 3:Убедитесь, что вы можете создать правила в Outlook, которые могут "запускать скрипт" как действие. Если вы не можете, вам нужно будет использовать regedit, чтобы перейти HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Securityи добавить новый DWORD (32-битный параметр) с названием, "EnableUnsafeClientMailRules"со значением 1.

Шаг 4: Создайте правило, которое находит:

  • Адрес электронной почты Gmail, который вы будете использовать в скрипте Powershell для запуска правила.
  • Уникальная тема, созданная вами в скрипте Powershell (например, «@TRIGGERMYVBA21»).

а потом:

  • Удаляет электронное письмо,
  • И запускает скрипт

Шаг 5: Настройте правило планировщика задач, которое запускает скрипт Powershell в то время(а), когда вы хотите его запустить. Выберите «запустить программу» в качестве действия, затем введите «powershell» для программы и, наконец, «-File directory\script.ps1» в поле добавления аргументов.

Для справки, я использую это, чтобы откладывать письма, пока они не станут пригодными для выполнения с помощью скрипта перемещения папок VBA. Я перемещаю письма в определенные папки, а затем они возвращаются в папку «Входящие», когда правило срабатывает для этой конкретной папки.

Этот скрипт включен сюда для полноты картины:

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

Связанный контент