C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

c#で outlook 受信トレイ監視が出きなくなった /いとこんにゃく (25/09/08(Mon) 10:56) #103858
Re[1]: c#で outlook 受信トレイ監視が出きなくなった /ゆーち (26/01/13(Tue) 12:34) #103901
Re[1]: c#で outlook 受信トレイ監視が出きなくなった /とくま (26/01/13(Tue) 14:02) #103902
│└ Re[2]: c#で outlook 受信トレイ監視が出きなくなった /とくま (26/01/15(Thu) 17:19) #103908
Re[1]: c#で outlook 受信トレイ監視が出きなくなった /魔界の仮面弁士 (26/01/14(Wed) 09:02) #103906
  └ Re[2]: c#で outlook 受信トレイ監視が出きなくなった /魔界の仮面弁士 (26/01/16(Fri) 16:19) #103909


親記事 / ▼[ 103901 ] ▼[ 103902 ] ▼[ 103906 ]
■103858 / 親階層)  c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ いとこんにゃく (1回)-(2025/09/08(Mon) 10:56:52)

分類:[C#] 

Outlookの受信トレイを監視する為の監視アプリをC#で作成しております。
コードの一部は以下の通りです。
数年間問題なく動作しておりましたが、Windowsアップデートで23H2を採用した途端にエラーが出現し動作不良になりました。


private Outlook.Application OutlookApp;
private Outlook._NameSpace OutookNameSpace;

・・・・
OutlookApp = new Outlook.Application();
OutookNameSpace = (Outlook._NameSpace)OutlookApp.GetNamespace("MAPI");  <=ここで以下のエラーが出ます。

****
System.InvalidCastException:型 'Microsoft.Office.Interop.Outlook.ApplicationClass' の COMオブジェクトをインターフェイス型 'Microsoft.Office.Interop.Outlook._Application'にキャストできません。
****

メニューに
Outlookの他に
Outlook(new)が出現したことも関係するのかもしれません。

ただ、同じように1 VBSで
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim sh : Set sh = CreateObject("WScript.Shell")

' Outlookアプリのイベント(NewMailEx)に接続
Dim olApp: Set olApp = WScript.CreateObject("Outlook.Application", "OutApp_")
Dim olNS : Set olNS = olApp.GetNamespace("MAPI")
で実行した場合は問題ありません。

同じような経験されているからいらっしゃいますでしょうか?


開発(実行)環境:
Windows 11 (23H2)
Visual Studio 2022 C#
[ □ Tree ] 返信 編集キー/

▲[ 103858 ] / 返信無し
■103901 / 1階層)  Re[1]: c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ ゆーち (1回)-(2026/01/13(Tue) 12:34:13)
ゆーち さんの Web サイト
No103858 (いとこんにゃく さん) に返信
はずしてるかもしれませんが。
GetNamespace("MAPI") って使ったことないかも・・・
私のほうでは、
OutookNameSpace = OutlookApp.Session;
で Outlook.NameSpace を取得するようにしています。

あと、必ず finally で Marshal.ReleaseComObject やってます。
[ 親 103858 / □ Tree ] 返信 編集キー/

▲[ 103858 ] / ▼[ 103908 ]
■103902 / 1階層)  Re[1]: c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ とくま (1回)-(2026/01/13(Tue) 14:02:55)
No103858 (いとこんにゃく さん) に返信
ソースコード云々以前に、
>Windowsアップデートで23H2を採用した途端
とOutlookでという時点で「最新のOutlookを強制的にインストールするWindowsアップデート」
という情報に辿り着くのは容易いはず。

そうでなくとも
>メニューに
>Outlookの他に
>Outlook(new)が出現したことも関係するのかもしれません。
新しいアプリがインストールされていることが明白。

パソコンなにそれレベルの素人が質問してるならともかく、
開発環境のバージョンを書けるし、VBSのソースも書くような技術者が
Outlookのバージョンに関してのみ、一切、触れないという
ものすごくキモい質問だから誰も近づかないのでしょう。

そもそもアップグレードを許すのか、ダウングレードを実行してから
過去のバージョンで運用するかを決める必要がありますし、
アップグレードを許すなら、アップグレード対応して下さいって話。
[ 親 103858 / □ Tree ] 返信 編集キー/

▲[ 103902 ] / 返信無し
■103908 / 2階層)  Re[2]: c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ とくま (2回)-(2026/01/15(Thu) 17:19:12)
No103902 (とくま さん) に返信
スタートメニューで Outlook(new) が表示されている端末で、Outlook(new) を起動して設定が移行されると、
Outlook(new)→Outlook
(旧)Outlook→Outlook (classic)
になるみたいですね。
インストールされただけの状態なのか?(new)を起動したことがあるのか?でもまた設定変わってそう。。。

手順によっては両方残る場合もあるみたい?
https://solutions.vaio.com/5394

アイコンは引き継がれるようなので、元のアイコンが違うなら、実機では見た目で区別できるかもしれません。
掲示板で質問するときは、名称も何を指してるのか分かるような表現をしないと混乱するんでしょうね。


Outlook Web版 (ウェブ版・Outlook on the web)
Outlook アプリ版 (デスクトップ版・モバイル版(iOSとAndroid))
の違いも含めてどれのことを言ってるのか、調べるときも区別しないといけませんね。
[ 親 103858 / □ Tree ] 返信 編集キー/

▲[ 103858 ] / ▼[ 103909 ]
■103906 / 1階層)  Re[1]: c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ 魔界の仮面弁士 (3906回)-(2026/01/14(Wed) 09:02:55)
No103858 (いとこんにゃく さん) に返信
> OutlookApp = new Outlook.Application();
> OutookNameSpace = (Outlook._NameSpace)OutlookApp.GetNamespace("MAPI");  <=ここで以下のエラーが出ます。

手元に "Outlook (new)" を動かせる環境が無いうえに、
普段ブラウザ版 Outlook を使っているため、デスクトップアプリ版の
Outlook のオートメーション操作については詳しくありませんが、状況からすると

・NameSpace の dual interface の vtable 側に不整合が起きている
・あるいは TypeLib の参照が正しく解決されていない

といった可能性が考えられます。
Outlook の TypeLib は後方互換性を重視しているため、
実際にインターフェイスが変更されたとは考えにくいのですが、
vtable 側と TypeLib の整合性が崩れたなら「変更されたように見える」挙動になりえます。

原因が Office 側の更新か、Windows 側の更新かは判断が難しいところです。


> ' Outlookアプリのイベント(NewMailEx)に接続
> Dim olApp: Set olApp = WScript.CreateObject("Outlook.Application", "OutApp_")
> Dim olNS : Set olNS = olApp.GetNamespace("MAPI")
> で実行した場合は問題ありません。

VBScript が動くということは、IDispatch (遅延バインディング) 側は正常ということになります。
一方で C# の事前バインディングは vtable (IUnknown) 側を使うため、
dual interface の vtable 側だけが壊れていると、型変換に失敗する可能性があります。

そのため、C# でも dynamic を使った遅延バインディングにした場合は動作するかもしれません。


まず、事前バインディングで取得した Application オブジェクトが
本当に従来 Outlook の CLSID を返しているか確認してみてください。

var app = new Outlook.Application();
// 通常であれば「0006f03a-0000-0000-c000-000000000046」が返される
Console.WriteLine(app.GetType().GUID);

念のため、Marshal.IsComObject(app) が true を返すかも確認しておきましょう。


ちなみに PowerShell の COM 呼び出しは、VBScript 同様、常に IDispatch(遅延バインディング)なので、
C# からの事前バインディング(参照設定で呼び出した場合)とは結果が異なる可能性があります。

 $o = New-Object -COM "Outlook.Application"
 $o.GetType().Guid # → 0006f03a-0000-0000-c000-000000000046

 $n = $o.GetNamespace("MAPI")
 $n.GetType().Guid # → 0006308b-0000-0000-c000-000000000046

 # 一応、解放処理も書いておく
 #
 # $objs = @($mail, $items, $folder, $n, $o)
 $objs = @($n, $o)

 foreach ($obj in $objs) {
  if ($obj -ne $null -and [System.Runtime.InteropServices.Marshal]::IsComObject($obj)) {
   [System.Runtime.InteropServices.Marshal]::ReleaseComObject($obj) | Out-Null
  }
 }

 # $mail = $items = $folder = $n = $o = $null
 $n = $o = $null


比較のため、C# でも遅延バインディングを試してみてください。特に星印の部分です。
(イベント処理も遅延バインドでやろうとすると大変なので、あくまで検証目的ですが)

 OutlookApp = new Outlook.Application(); // early-bind
 dynamic outlookDynApp = OutlookApp;
 dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind
 OutookNameSpace = outookDynNameSpace; // ☆

または最初から遅延バインディングで起動する方法:

 // OutlookApp = new Outlook.Application();
 dynamic outlookDynApp = Activator.CreateInstance(Type.GetTypeFromProgID("Outlook.Application")); // late-bind
 dynamic outookDynNameSpace = outlookDynApp.GetNamespace("MAPI"); //★ late-bind
 OutookNameSpace = outookDynNameSpace; // ☆

さらに、実際に返ってきた COM オブジェクトの CLSID を確認するには:
 IntPtr unk = Marshal.GetIUnknownForObject(outlookDynApp);
 object real = Marshal.GetObjectForIUnknown(unk);
 Console.WriteLine(real.GetType().GUID);


サポートされる IID を調べる場合は、スタートメニューから
 [Visual Studio] > [Developer Command Prompt]
を起動(あるいは管理者起動)し、左ペインから
 [Type Libraries] > [Microsoft Outlook 16.0 Object Library]
をダブルクリックすることで確認できます。

・interface
⇒ C# の参照設定で使われる事前バインディング用 (vtable / IUnknown ベース)

・dipinterface
⇒ PowerShell や VBScript 、あるいは C# で dynamic + Activator.CreateInstance で
 使われる遅延バインディング用 (IDispatch.Invoke ベース)

※dual interface の場合、事前バインディング では vtable 側が使われます。


> メニューに
> Outlookの他に
> Outlook(new)が出現したことも関係するのかもしれません。

"Outlook (new)" の実体は WebView2 ベースと聞いていますが、
COM オートメーションをどこまでサポートし続けているかは不明です。


試しに "Outlook (new)" を無効化して従来版を強制起動して
挙動が変わるかどうかを確認すると、原因の切り分けに役立つかもしれません。

 HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Options\General
  DisableNewOutlook = 1 (DWORD)

365 導入企業の場合はこちらも参考になるかもしれません。
https://www.prins.co.jp/knowledge/column/20250523-5234/
[ 親 103858 / □ Tree ] 返信 編集キー/

▲[ 103906 ] / 返信無し
■103909 / 2階層)  Re[2]: c#で outlook 受信トレイ監視が出きなくなった
□投稿者/ 魔界の仮面弁士 (3907回)-(2026/01/16(Fri) 16:19:56)
No103906 (魔界の仮面弁士) に追記
>> Outlookの受信トレイを監視する為の監視アプリをC#で作成しております。

(対応策1) 新しい Outlook へ移行せず、従来版 Outlook を維持して COM 操作を継続する

(対応策2) COM ベースの捜査から、新しい API 操作に切り替える


>>メニューに
>>Outlookの他に
>>Outlook(new)が出現したことも関係するのかもしれません。
> "Outlook (new)" の実体は WebView2 ベースと聞いていますが、
> COM オートメーションをどこまでサポートし続けているかは不明です。

新しい Outlook は Web 技術ベースで設計されているため、
従来の Outlook が提供していた COM Automation(Outlook Object Model)は
新しい Outlook では提供されていません(COM add-ins も非サポート)。

下記でも「Microsoft が新しい Outlook から Outlook Desktop COM API を削除した」とあります。
(新しい Outlook は Web 技術ベースで設計されており、MAPI の追加サポートも計画されていません)
https://docs.uipath.com/ja/activities/other/latest/productivity/new-outlook-impacts-outlook-desktop-activities

new Outlook for Windows の技術情報について、下記を参照してください。
https://learn.microsoft.com/ja-jp/microsoft-365-apps/outlook/overview-new-outlook-windows?WT.mc_id=DT-MVP-8907


以上のように、新しい Outlook は従来の COM/MAPI ベースの拡張を前提としていないため、
今後はクラウド API 主体の開発が必要になってきます。

また、UIAutomation や Selenium を用いる手法を見かけることもありますが、
新しい Outlook の UI は WebView2 内で動的に構築されるため、
要素構造が安定せず、実用的な自動化は困難です。


過去には、"Outlook REST API" という技術もあったのですが、こちらは
v1.0 が 2019年11月に、v2.0 が 2024年3月にそれぞれ廃止されており、
現在は "Microsoft Graph API" が利用されます。

・MAPI → それ自体に変更は無いが、クラウド版からは利用不可
・Outlook REST API v1.0 → 廃止(2019/11)
・Outlook REST API v2.0 → 廃止(2024/3)
・Exchange Web Services → 非推奨
・Azure AD Graph API → 廃止(2025/6)
・Microsoft Graph API → すべての新機能の中心



>> OutookNameSpace = (Outlook._NameSpace)OutlookApp.GetNamespace("MAPI");  <=ここで以下のエラーが出ます。
現在のところ、新しい Outlook は MAPI をサポートしていないようです。

https://support.microsoft.com/ja-jp/office/a3f77cbb-2476-4d09-b051-f38a4afe9e23?WT.mc_id=DT-MVP-8907
「この問題は、新しい Outlook が現在 MAPI 統合をサポートしていないために発生します。」
「新しい Outlook が MAPI 統合のサポートを追加するまでは、MAPI アプリケーションから送信される電子メールを管理するために、従来の Outlook をインストールして構成できます。」


Exchange Online についてみてみると、
 ・MAPI over HTTP は内部実装としては残されているが、外部 API としては推奨されない
 ・新しい Outlook は Graph API を前提に設計
という流れになっています。

先に述べた通り、新しい Outlook ではクラウド API(Microsoft Graph)を中心に設計されているため、
COM を用いた MAPI ベースの監視プログラムではなく、Microsoft Graph API ベースの監視が要求されます。

Microsoft Graph API による監視方法としては、
 ・Delta Query(差分取得)
 ・Webhook(通知サブスクリプション)
があります。

Delta Query は「定期的に差分を取りに行くポーリング方式」で、
Webhook は「サーバー側から通知を受け取るプッシュ通知方式」です。

Webhook の場合は、受信用のエンドポイントの準備(証明書やドメインなど)が必要で
実装コストが高いため、今回の要件なら Delta Query の方が良いかもしれません。

Microsoft Graph API は OAuth 2.0 (Azure AD) / OpenID Connect による認証が必須のため、
どのアプリがどのメールボックスにアクセスするかを Azure AD に登録して
 ・クライアント ID
 ・テナント ID
 ・シークレットまたは認証フロー
を準備しておく必要があります。

C# で実装する場合は "Microsoft.Graph" (と "Microsoft.Identity.Client") を NuGet します。
PowerShell で接続する場合は Microsoft Graph PowerShell SDK を用います。


Learn > Microsoft Graph > Outlook メール API の概要
https://learn.microsoft.com/ja-jp/graph/outlook-mail-concept-overview?WT.mc_id=DT-MVP-8907

Microsoft 365 > Microsoft Graph > Changelog
https://developer.microsoft.com/en-us/graph/changelog?WT.mc_id=DT-MVP-8907

note > なぜMicrosoft Graphは沼なのか
https://note.com/japan_d2/n/n0c6b1ba5a849
[ 親 103858 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -