メール送信ミスを防止!C#で作成するOutlook用カスタムアドインの開発ガイド

このC#プログラムは、Microsoft Outlookのアドイン(追加機能)として機能し、Outlookのメール送信イベントにフックして特定の処理を行うように設計されています。この記事では、プログラムの主要な部分について詳しく説明し、その機能と使用方法について解説します。

プログラムの概要

このOutlookアドインは、Outlookが送信する各メールを検査し、特定の条件(コマンドライン引数で指定された文字列)に基づいて警告を表示するか、メールの送信をキャンセルすることができます。このプログラムは、企業や個人が特定のメールアドレスへのメール送信を間違って行うのを防ぐために役立つ可能性があります。

プログラム

using System;
using System.Windows.Forms;
using Outlook = Microsoft.Office.Interop.Outlook;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;

public class OutlookAddIn{
    public static string[] commandLineArgs;
    public static Microsoft.Office.Interop.Outlook.Application outlookApp; // Outlookアプリケーションの静的フィールド
    public static void Main(string[] args){
        try{
            commandLineArgs = args;
            Process outlookProcess = null;
            try{
                outlookApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
                Process[] outlookProcesses = Process.GetProcessesByName("OUTLOOK");
                if (outlookProcesses.Length == 0) {
                    Console.WriteLine("Outlookが実行されていません。");
                    return;
                }
                outlookProcess = outlookProcesses[0];
            }catch{
                outlookApp = null; 
            }
            if (outlookApp == null){
                Console.WriteLine("Outlookアプリケーションの初期化に失敗しました。");
                Console.ReadLine();
                return;
            }
            
            outlookApp.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(OutlookAddIn_ItemSend);
            // Outlookのプロセスが終了するまで待機
            outlookProcess.WaitForExit();
            Console.WriteLine("Outlookアドインを終了します。");
        }catch (System.Exception ex){ 
            Console.WriteLine("例外: " + ex.Message);
            Console.ReadLine();
        }
    }
    // ContainsExclusionメソッド: 対象文字列に除外対象文字列が含まれているか確認するメソッド
    static bool ContainsExclusion(string target, string exclusion){
        // 対象文字列に除外対象文字列が含まれている場合はtrueを返す
        return target.Contains(exclusion);
    }
    private static void OutlookAddIn_ItemSend(object Item, ref bool Cancel){
        try{
            Microsoft.Office.Interop.Outlook.MailItem mailItem = Item as Microsoft.Office.Interop.Outlook.MailItem;
            if (mailItem == null){
                Console.WriteLine("ItemはMailItemではありません。");
                return;
            }
            if (commandLineArgs == null){
                commandLineArgs = null;
                Console.WriteLine("コマンドライン引数が提供されていません。");
            }
            string mailTo = mailItem.To;
            string mailCc = mailItem.CC;
            string mailBCc = mailItem.BCC;
            string deriverAddress;
    
            if (mailTo == null){
                mailTo = "";
            }else{
                mailTo = mailTo.Replace(";", "\r\n");
            }
            if (mailCc == null){
                mailCc = "";
            }else{
                mailCc = mailCc.Replace(";", "\r\n");
            }
            if (mailBCc == null){
                mailBCc = "";
            }else{
                mailBCc = mailBCc.Replace(";", "\r\n");
            }
            deriverAddress= mailTo + ";" + mailCc + ";" + mailBCc;
            deriverAddress = deriverAddress.Replace(";", "\r\n");
            Console.WriteLine (deriverAddress);
            foreach (var recAddress in deriverAddress.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)){
                foreach (var arg in commandLineArgs){
                    // 対象文字列
                    string targetString = recAddress.ToString();
                    // 除外対象文字列
                    string exclusionString = arg.ToString();
                    // 対象文字列に除外対象文字列が含まれているか確認
                    if (ContainsExclusion(targetString, exclusionString)){
                        MessageBox.Show("対象文字列に除外対象文字列が含まれています。", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        Cancel = false;
                        return ;
                    }
                }
            }
        }catch(System.Exception ex){ 
            Console.WriteLine("例外: " + ex.Message);
            Console.WriteLine("スタックトレース: " + ex.StackTrace); // スタックトレースを出力
            Console.ReadLine();
        }
    }

主要な機能

  • Outlookのインスタンス検出: プログラムは、Marshal.GetActiveObjectを使用して既に実行中のOutlookアプリケーションのインスタンスを取得します。これにより、アドインは既存のOutlookセッションに統合されます。
  • メール送信イベントのフック: ItemSend イベントは、Outlookがメールを送信する際にトリガーされます。このイベントは、送信されるメールアイテムを検査し、特定のロジックに基づいて処理を行います。
  • 送信先アドレスの検査: メールの宛先(To, CC, BCC)は、コマンドライン引数で指定された文字列に基づいてチェックされます。指定された文字列が宛先に含まれている場合、警告メッセージが表示され、送信がキャンセルされます。

使用方法

  1. プログラムのコンパイル: このC#プログラムをコンパイルし、実行可能なアプリケーションを作成します。
  2. コマンドライン引数: プログラムを実行する際に、除外したいメールアドレスまたは文字列をコマンドライン引数として指定します。
  3. Outlookの実行: プログラムは、Outlookが既に実行中であることを要求します。Outlookが開いていない場合、プログラムは終了します。
  4. メールの送信: メールを送信する際、指定した除外文字列が宛先に含まれているかどうかがチェックされ、条件に一致する場合は警告が表示されます。

注意点

  • このアドインは、Outlookの既存のインスタンスに依存しています。Outlookが実行されていない場合、アドインは動作しません。
  • エラーハンドリング: プログラムは例外を捕捉し、エラーメッセージとスタックトレースを出力します。これにより、問題の診断が容易になります。
  • GUIへの依存: このプログラムはMessageBoxを使用しています。したがって、GUI環境での実行が必要です。

まとめ

このOutlookアドインは、メール送信の過程で特定の条件に基づいてチェックを行い、誤ったメール送信を防ぐための有用なツールです。企業環境や個人のデータ保護において、このようなカスタムアドインは重要な役割を果たす可能性があります。

スポンサーリンク

-IT関連