Outlook VBA スクリプトをスケジュールして実行する

Outlook VBA スクリプトをスケジュールして実行する

この質問は、このSO投稿の別の(簡略化された)バージョンです(リンク)。

毎日午後 2 時に自動的に実行したい特定の Outlook VBA スクリプトがあります (他のスクリプトは複数の時間に実行します)。コンピューターは常にオンになっているため、クライアント側で実行しても問題ありません。これを確実に実現するにはどうすればよいでしょうか。

リンクされた) SOの投稿では私が試したいくつかのアプローチを概説しており、このSOの投稿これは、一度に実行することについての私の具体的な質問が生まれたアプローチに関する一般的な質問です。

答え1

まとめ

Google の SMTP サーバー経由でメールを送信する Powershell スクリプトを作成します。このスクリプトはタスク スケジューラで実行でき、スケジュールに従って実行できます。Outlook でメールを受信すると、そのメールを検索するルールによって Outlook VBA スクリプトがトリガーされます。Viola。

ステップ1: VBA スクリプトをトリガーするための「トリガー」メールを送信するために使用する Gmail アカウントの安全な資格情報ファイルを作成します。

Powershellで実行

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

これにより、そのGmailアカウントのパスワードの安全なバージョンがユーザーディレクトリに保存されます。2要素認証を使用する場合は、アプリパスワード次の手順で使用するこの資格情報の通常のパスワードの代わりに使用します。

ステップ2: この Powershell スクリプトは、ユーザーが独自に指定した資格情報を使用して、Google の SMTP サーバー経由でメールを送信します。フィールドを適切に設定し、Outlook ルールに記録する特定の非常に固有の件名 (例: "@TRIGGERMYVBA21") を選択します。

   # 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: 以下を検出するルールを作成します。

  • ルールをトリガーするためにPowershellスクリプトで使用するGmailのGmailアドレス
  • 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

関連情報