Outlook アドインの有効・無効に関連するレジストリ

Outlook では、アドインの有効・無効に関連する様々なレジストリがあり、それぞれ用途が異なります。
そのため、用途が異なるレジストリを誤って使用すると、想定した結果が得られないことになります。
今回は、優先度が高い順にそれぞれの用途を説明します。

1.ポリシーの AddinList


キー:
HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\16.0\Outlook\Resiliency\AddinList

名前:
アドインの ProgID

種類:
REG_SZ

値:
0 = 無効、1 = 有効、2 = ユーザー設定

用途:
管理者が特定のアドインの有効化または無効化を強制したいときに使用します。
このレジストリで設定を行うとユーザーが有効・無効の変更ができなくなるため、最も優先順位が高いといえます。
ただし、キーとしては HKEY_LOCAL_MACHINE で設定はできず、あくまでもユーザー単位のポリシーで設定するものとなります。
なお、設定する値が数値ですが、値の種類が REG_SZ となる点に注意が必要です。
また、DLL ファイルの破損やレジストリ設定の不備、アドイン自体の不具合などの理由でアドインの読み込みが失敗する場合、このレジストリで有効化を強制してもアドインを有効にすることはできません。

2.HKEY_CURRENT_USER の DisabledItems と CrashingAddinList


キー 1:
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Resiliency\DisabledItems

キー 2:
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Resiliency\CrashingAddinList

名前:
8 桁のランダムな 16 進数

種類:
REG_BINARY

値:
アドインの DLL のパスを含むバイナリデータ

用途:
Outlook がアドインの実行によるクラッシュやロードの失敗などを検知して無効化した場合に、無効化したアドインの情報を保存するために使用します。
上記のレジストリに登録されているアドインについては、Outlook の正常な動作を保つため、後述の LoadBehavior で 3 が指定されていても、アドインは無効となります。

3.HKEY_CURRENT_USER の LoadBehavior


キー:
HKEY_CURRENT_USER\Software\Microsoft\Office\Outlook\Addins

名前:
アドインの ProgID

種類:
REG_DWORD

値:
0-2 = 無効、3  = 有効

用途:

ユーザーが指定したアドインの起動時の読み込みを行うかどうかの設定です。
ユーザー単位でインストールされたアドインにはもともとキーが存在しており、インストール時に値が設定されます。
一方、マシン単位でインストールされたアドインでも、ユーザーがアドイン設定のダイアログで有効・無効の設定を変更すると、こちらの LoadBehavior が設定され、この設定が HKEY_LOCAL_MACHINE の設定より優先されます。

4.HKEY_LOCAL_MACHINE の LoadBehavior


キー:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins

名前:
アドインの ProgID

種類:
REG_DWORD

値:
0-2 = 無効、3  = 有効

用途:

マシン単位でインストールされたアドインの起動時の読み込み設定の初期値です。
アドインのインストーラーで設定されますが、前述の通りユーザーで設定が変更されると HKEY_CURRENT_USER に設定が行われ、そちらが優先されます。
そのため、この設定でアドインの有効・無効を管理者が制御することはできません。

5.HKEY_CURRENT_USER の DoNotDisableAddinList


キー:
HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Resiliency\DoNotDisableAddinList

名前:
アドインの ProgID

種類:
REG_DWORD

値:
アドインが無効になった理由を示す値

用途:

Outlook により自動的に無効化されたアドインについて、ユーザーが無効化しないよう指定するものです。
この設定は DisabledItems に設定されたアドインでも有効にすることができるので、その点に関しては優先度が高いといえます。
しかし、ユーザーが意図的に無効化し、LoadBehavior が 0 や 2 になっている場合は、その設定が優先されてアドインが無効になります。
つまり、あくまでもユーザーが設定することを目的としているものであり、管理者がこの設定でアドインの有効化を強制することはできません。
無効化されたアドインを有効化するためのレジストリとして紹介されていることもあるため、このレジストリを展開してアドインの有効化を強制しようと考えてしまうこともあるかと思いますが、前述の通り管理者がアドインの有効化を強制するためには AddinList というレジストリ設定があり、DoNotDisableAddinList を使用するのは不適切かつ不十分です。
また、設定する値によっては、ユーザーに対して「このアドインにより Outlook の起動が遅くなりました。」のように、実際には発生していない事象が発生したかのように表示されるため、ユーザーの不安を煽る可能性があります。

コンテキスト メニューでフォルダーの移動を行う Outlook の VSTO アドイン

コメントにて以下のご要望をいただきました。


いつも素晴らしいVBA、その他の情報ご提供ありがとうございます。
アイテム右クリックメニューについてお伺いします。かなり以前ですが、「右クリックメニューにフォルダーの移動コマンドを追加するマクロ」を公開いただいておりました。
ここで紹介いただいたApplication_ItemContextMenuDisplay というVBAのイベントは、Web上の情報でサポートされなくなったと聞きました。実際、同マクロは動作しないようです。
現時点で、例えば、特定メールを右クリックしてフォルダに移動する等のコマンドを実行する方法はありますでしょうか? 企業の o365のパッケージ上での Outlook を想定しています


コメントのご指摘の通り、ItemContextMenuDisplay は現在のバージョンでは使用できなくなっています。
現在のバージョンでコンテキスト メニューを拡張するには IRibbonExtensibility オブジェクトを使用してリボンのカスタマイズを行う必要があるのですが、このオブジェクトはマクロでは使用できず、アドインとして実装しなければなりません。
そこで、今回はコンテキスト メニューでフォルダーの移動を行う VSTO アドインの作成方法について説明します。

まず、Outlook の VSTO アドインを作成する方法 に記載されている手順の「アドインのコードの記述」まで実行します。

次にコンテキスト メニューを追加するコードの記述なのですが、その前にメニューを定義した Ribbon XML を作成します。
手順は以下の通りです。

  1. [プロジェクト] の [新しい項目の追加] をクリックする
  2. [新しい項目の追加] で [すべてのテンプレートの表示] をクリックする
  3. [新しい項目の追加 – プロジェクト名] で [リボン (XML)] を選択する
  4. [名前] に適切な名前 (“MyItemMove” など) を入力する
  5. [OK] をクリックする
  6. 右ペインの [ソリューション エクスプローラー] に追加された XML ファイルをダブルクリックする
  7. 既定で追加される XML を以下の XML で置き換える

    <?xml version="1.0" encoding="UTF-8"?>
    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
      <contextMenus>
        <contextMenu idMso="ContextMenuMailItem">
          <button id="ButtonMoveAAA" label="AAA に移動" onAction="MoveToAAA" />
          <button id="ButtonMoveBBB" label="BBB に移動" onAction="MoveToBBB" />
        </contextMenu>
      </contextMenus>
    </customUI>

上記の XML において、label はボタンに表示されるテキスト、onAction はボタンをクリックすると呼び出されるメソッドを意味します。
メニューを増やす場合は、<button … の行を追加し、idlabelonAction にそれぞれ一意のものを指定します。
そして、呼び出されるメソッドは XML を追加した際に同時に追加された vb (例: MyItemMove.vb) ファイルの Public Class MyItemMove から End Class の間のどこかに以下のように記載します。

' AAA というフォルダーに移動
Public Sub MoveToAAA(ByVal control As Office.IRibbonControl)
    MoveToFolder("AAA")
End Sub
' BBB というフォルダーに移動
Public Sub MoveToBBB(ByVal control As Office.IRibbonControl)
    MoveToFolder("BBB")
End Sub
' 指定した名前のフォルダーに移動
Private Sub MoveToFolder(strFolder As String)
    Dim fldDest As Folder
    Dim objMove As Object
    '
    Try
        With Globals.ThisAddIn.Application
             fldDest = .Session.GetDefaultFolder(OlDefaultFolders.olFolderInbox).Folders(strFolder)
             For Each objMove In .ActiveExplorer.Selection
                 objMove.Move(fldDest)
            Next
         End With
     Catch ex As System.Exception

    End Try
End Sub

今回は、アイテムを移動するという共通処理を MoveToFolder というメソッドとして実装し、メニューから呼び出されるメソッド内でフォルダー名を指定して呼び出す形にしました。
ちなみに、Outlook の Application オブジェクトを VSTO アドインで使用する場合、ThisAddin.vb の中であれば Me.Application として参照可能ですが、それ以外のモジュールから参照する場合は Globals.ThisAddin.Application とします。

最後に、このコンテキスト メニューを使用できるように、既定で追加される ThisAddin.vb の中の Public Class ThisAddIn から End Class の間のどこかに以下の記述を追加します。

Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility
     Return New MyItemMove()
End Function

今回の例ではリボン XML の追加の際に MyItemMove という名前を付けたので、Return New MyItemMove() となっていますが、他の名前を付けた場合は Return New リボン名() というコードになります。

この後は、Outlook の VSTO アドインを作成する方法 に記載されている手順のアドインのビルド以降を実行して完成です。

Outlook の VSTO アドインを作成する方法

これまで、様々なマクロを公開し、多くの方に使っていただいているようです。
ただ、Outlook のマクロは異なる端末に配布して使うという方法がサポートされていないため、複数のユーザーで同じマクロを使いたい場合にはそれぞれの端末に手作業でコピーする必要があります。
また、マクロを更新したような場合は、それぞれの端末で改めてコピーしなおさなければならないこともあります。

これを回避するにはマクロの内容を VSTO アドインとして実装し、展開する必要があります。
アドインの開発となると敷居が高いように感じるかもしれませんが、Visual Studio で VSTO アドインを作る場合、実はそれほど難しくありません。
特に、言語として Visual Basic を使えば、マクロのコードをちょっと変更するだけでアドインとして実装できる場合もあります。

今回は遅延配信を行うマクロを例にして、VSTO アドインの開発について説明しましょう。

Visual Studio 2022 Community Edition のダウンロードとインストール

VSTO アドインの開発には Visual Studio 製品が必要となります。
個人あるいは小規模の組織であれば、無償で Community エディションを使用することが可能ですので、今回は最新の Visual Studio 2022 Community Edition を使って説明します。
ダウンロードは以下のページから可能です。

Visual Studio 2022 コミュニティ エディション – 最新の無料バージョンをダウンロードする (microsoft.com)

このページの [ダウンロード] というボタンをクリックすると VisualStudioSetup.exe というファイルがダウンロードされるので、これを実行してインストールを開始します。
インストール画面でインストールするコンポーネントの選択がありますが、ここでは [Office/SharePoint 開発] をオンにして [インストール] をクリックします。

あとはしばらく待てばインストールは完了です。

新しいプロジェクトの作成

インストールが完了したら、VSTO アドインのためのプロジェクトを作成します。
手順は以下の通りです。

  1. Visual Studio 2022 を起動する
  2. [新しいプロジェクトの作成] をクリックする
  3. 右ペインからアイコンの右上に VB と書かれている [Outlook VSTO アドイン] ([Outlook Web アドイン] ではないので注意) をクリックし、[次へ] をクリックする
  4. プロジェクト名に適切な名前 (今回の場合は “DeferredSend” など) を入力し、[フレームワーク] を選択して [作成] をクリックする

これにより、ThisAddIn_Startup と ThisAddIn_Shutdown という二つのイベントが追加済みのプロジェクトが作成されます。

なお、フレームワークは VSTO アドインが動作する .NET Framework のバージョンの指定です。
既定でも問題はないと思いますが、古い環境などがあり最新の .NET Framework が使えないという場合、古いバージョンを選択する必要があるかもしれません。

アドインのコードの記述

起動時にアドインで処理が必要なら、ThisAddIn_StartUp イベントに記述することになります。

これ以外のイベント、例えば NewMailEx や ItemSend イベントを追加したい場合、コードエディタ上部の 3 つのドロップダウンのうち、中央のドロップダウンで Application を選択してから、右のドロップダウンでイベントを選択します。
今回はメール送信時の処理を追加するので、ItemSend を選択します。

すると、以下のようなコードが追加されます。

    Private Sub Application_ItemSend(Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

    End Sub

送信時に遅延配信を設定する場合、Item として渡された MailItem の DeferredDeliveryTime に遅延配信したい時刻を設定します。
例えば、1 分遅延させたければ DateAdd 関数で現在時刻に 1 分追加した時刻を DeferredDeliveryTime に設定するということになります。

ただし、Item には MailItem だけでなく MeetingItem などのオブジェクトが格納される場合もあるため、Item 自体は Object 型の変数として定義されています。
これを MailItem として使うために別途 MailItem 型の変数を定義し、その変数に Item を代入して使用します。

また、その際に MailItem 以外のオブジェクトが格納されていた場合は例外が発生するので、例外発生によりアドインが無効化されないよう、Try Catch 構文を使用します。
上記を踏まえ、遅延配信をするように ItemSend にコードを追加すると以下のようになります。

    Private Sub Application_ItemSend(Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend
         Const DEFERRED_MIN = 1
         Dim mlItem As MailItem
         '
         Try
             mlItem = Item
             mlItem.DeferredDeliveryTime = DateAdd("n", DEFERRED_MIN, Now)
         Catch ex As System.Exception

         End Try
     End Sub

今回は、コードの記述はこれだけです。

アドインのビルド

ビルドとはアドインを実行するための DLL を生成する作業です。
コードの記述が完了したら、[ビルド]-[ソリューションのビルド] でアドインをビルドします。
エラーが発生したらコードを見直してみてください。
例えば、Try と入力して自動的に挿入される Catch ex As Exception をそのままにしておくとエラーとなります。
これは、Outlook オブジェクト モデルに含まれる Exception というクラスが .NET Framework の System.Exception と競合するためです。
明示的に Catch ex As System.Exception と記載することでエラーを回避できます。

アドインのデバッグ

作成したアドインが正常に動作するかを確認するため、Visual Studio を使ってデバッグ実行してみましょう。
[プロジェクト]-[プロジェクト名 のデバッグ] をクリックし、[デバッグ] タブの [開始動作] で [外部プログラムの開始] を選択して、[参照] により Office がインストールされているフォルダーから Outlook.exe を選択します。
インストール形態にもよりますが、以下のいずれかになるでしょう。

C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE
C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE
C:\Program Files\Microsoft Office\Office16\OUTLOOK.EXE
C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE

そして、Outlook が終了した状態で F5 キーを押すと、作成したアドインを読み込んで Outlook が起動します。
この状態でメールを送信し、1 分遅延して送信されれば、アドインが正常に動作したと判断できます。

アドインの展開

アドインが完成したら、他の PC にも展開するための作業を行います。
具体的には DLL をインストールしてアドインとして登録する Setup.exe を作成するということです。

といっても、実際には右ペインに表示されている [ソリューション エクスプローラー] の中のプロジェクト名のアイコンを右クリックし、[発行] をクリックするだけです。
アプリケーションを公開する場所に Setup.exe を作成するフォルダー パスを指定して [完了] をクリックすると、そのフォルダーに Setup.exe とインストールに必要な様々なファイルが生成されます。
このフォルダーをファイル サーバーや USB メモリなどで共有し、Setup.exe を実行することで、アドインがインストールできます。

さらに、この Setup.exe による公開方法は ClickOnce と呼ばれるもので、アドインを更新した際に再度インストールをしなくてもクライアント側で自動的に更新できるという機能があります。
例えば、組織内のファイル サーバーにアドインのセットアップ ファイルを発行している場合、更新バージョンを発行すると Outlook が起動時にインストール元のファイル サーバー上のファイル バージョンを確認し、更新されていたら新しいバージョンを自動的にインストールするのです。

以上で、VSTO アドインの作成は完了です。