2016年6月13日月曜日

MailItem.Copy() でコピーされたメールを MailItem.Delete()で削除するとオリジナルが消えてしまう?

Outlook のアドイン開発では、メールアイテム(Outlook.MailItem)のインターフェースを多用します。

メールのサイズを取得するには、MailItem.Size オブジェクトを参照すればいいのだけど、新規に作成され編集中のメールの場合、保存処理がされていないため、MailItem.Size には 0 が設定されてしまっています。
この値を取得するため、コピーメールを保存して値を取得後、削除してしまえばいいじゃん。
ということで、次のようなコードを書いたのでした。

        public static ulong GetMailSize(Outlook.MailItem item)
        {
            ulong size = 0;
            //
            //削除済みアイテム格納フォルダを取得する
            Outlook.MAPIFolder dustboxFolder = getDustboxFolder(item.Application, item.SendUsingAccount);
            try
            {
                // Copy+Save+Deleteによるメールサイズの取得
                if (dustboxFolder != null)
                {
                    //メールのコピーを作成する。
                    Outlook.MailItem dummy = item.Copy() as Outlook.MailItem;
                    //メールを保存する
                    dummy.Save();             
                    //メールのサイズを取得。
                    size = (uint)dummy.Size;
                    //削除済みメールかどうかを検査
                    Outlook.MAPIFolder parentFolder = dummy.Parent as Outlook.MAPIFolder;
                    if (dustboxFolder.EntryID != parentFolder.EntryID)
                    {
                        //コピーしたメールを「削除済みアイテム」に移動させる
                        dummy.Move(dustboxFolder);
                    }
                    //削除済みアイテムのコピーしたメールの要素番号を取得
                    int index = getFolderIndex(dustboxFolder, dummy);
                    //コピーしたメールを削除する(※ここ!)
                    dummy.Delete();
                    if (0 < index)
                    {
                        //削除済みアイテムの保存メールを削除する
                        dustboxFolder.Items.Remove(index);
                    }
                    return size;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
     return 0;
    }

なんとまぁめんどくさい処理なんでしょ。
で、こいつを実行するとですね、dummy.Delete(); の部分で、なんとコピー元のオリジナルメールが消されてしまうんです(削除済みアイテムに保存された状態になる)

んなことあるわけないやん!って思うでしょ?
実際、私の環境じゃそんな現象は発生しません。

600人のユーザーのうち、10名のユーザーで再現するそうです。

いったいなぜそんなことが起こってしまうのか、いまのところ不明のままです。
んが。
#対策は、もちろんサイズの取得方法を変更しました。