Этот вопрос представляет собой другую (упрощенную) версию этого поста 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