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名のユーザーで再現するそうです。
いったいなぜそんなことが起こってしまうのか、いまのところ不明のままです。
んが。
#対策は、もちろんサイズの取得方法を変更しました。
0 件のコメント:
コメントを投稿