はじめに
Outlookのメールアイテムの追加をトリガにメールの内容をSlackに送信したいことがありました。
そのトリガ方法を、備忘録としてまとめます。
※本当はPowerAutomateのフローでやりたかったのですが、社内環境のもろもろの影響できず、アドインで実現することにしました。
アドインなので、Outlookをのアプリを起動しないと、処理が実行されません。
メールアイテムの受信をトリガ
※前提として、VisualStudioのOutlookアドインのテンプレートでプロジェクトを作成しています。
メールの受信イベントを探すと、Application.NewMailExイベントがヒットします。
このイベントは、Outlook 受信したアイテムに対して1回だけ発生します。
フォルダの移動などでは発生しないので、今回はこちらを使いました。
また、イベントからは、EntryIDCollectionというパラメーターが渡ってきます。
これは、受信トレイに受信したアイテムのIDを表す文字列です。
このIDを使用して、受信したメールアイテムを取得できます。
メールアイテムの取得には、Microsoft.Office.Interop.Outlook.Applicationクラスにある、Namespaseというオブジェクトを使います。
このオブジェクトは、Outlookアプリケーション内の予定表やメールボックスやフォルダなどへのアクセスを提供するオブジェクトです。
例えば、Namespaceオブジェクトを使用して、ユーザーのメールボックスやその中のフォルダにアクセスできます。例えば、受信トレイ、送信済みアイテム、削除済みアイテムなどのフォルダにアクセスできます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace Sample
{
public partial class ThisAddIn
{
private async void ThisAddIn_Startup(object sender, System.EventArgs e)
{
// イベントを購読
Application.NewMailEx += Application_NewMailEx;
}
private void Application_NewMailEx(string EntryIDCollection)
{
var item = Application.GetNamespace("MAPI").GetItemFromID(EntryIDCollection);
// メール以外の場合は何もしない
if (item is Outlook.MailItem mailItem == false) return;
// メール本文を加工してSlackに送信する処理
// ...
}
}
}
さいごに
あとは、MailItemオブジェクトから本文を取り出して加工して、Slackに送信するだけです。
Slackへの送信方法はこちらの記事にまとめてあります。