Outlook アドインで添付ファイル参照する際、リストの順序が入れ替る場合がある


こんにちは。日本マイクロソフト Outlook サポート チームです。

Outlook 2010 のアドインで添付ファイルを参照する際、リストの順序が入れ替る問題が発生するというお問い合わせをいただいています。

今回はこの動作と対処方法についてご紹介いたします。

 

現象

以下のようなプログラムで、Attachment オブジェクトをリストから 1 件ずつ参照して SaveAsFile メソッドを実行する際、添付ファイルの追加方法によってはリストの順序が途中で入れ替わる現象が発生します。

 

private void OnItemSend(object objItem, ref bool cancel)

{

    Outlook.MailItem objMailItem = objItem as Outlook.MailItem;

    Outlook.Attachments objAttachments = objMailItem.Attachments;

    foreach (Outlook.Attachment objAttachment in objAttachments)

    {

        objAttachment.SaveAsFile(“C:\test\” + objAttachment.FileName);

    }

}

 

再現手順

1. 97-2003 形式で保存したファイル A を右クリックし [送る]-[メール受信者] の順にクリックします。

2. 別のファイル B をさらに添付し、送信ボタンをクリックします。

3. ItemSend イベント内で添付ファイルに対して 1 件ずつ SaveAsFile メソッドを実行します。

4. for 文の 1 回目と 2 回目で参照する添付ファイル オブジェクトがどちらもファイル A になります。

 

解説

上記現象は Outlook 2010 の以下の動作によって発生します。

 

・ローカルの 97-2003 形式 のファイルを右クリックし、[送る]-[メール受信者] の順にメールを送るとき、Attachment.SaveAsFile を実行すると、MAPI とメモリ上のテーブルが同期され添付ファイルのソートが発生する

・ソートの際、[送る]-[メール受信者] を行ったファイルはリストの最後に追加される

 

具体的には以下の動作となります。

 

– Outlook 2010 の動作

Outlook では、添付ファイルの情報として、MAPI とメモリ上でそれぞれ添付ファイル情報のテーブルを保持しています。

ローカルの 97-2003 形式 のファイルを右クリックし、[送る]-[メール受信者] の順にメールを送るとき、Attachment. SaveAsFile を実行すると、このタイミングで MAPI とメモリ上のテーブルが同期され添付ファイルのソートが発生します。

 

アドインの動作

処理に沿って動作をご説明いたします。

 

foreach (Outlook.Attachment objAttachment in objAttachments) –> <A>

{

    objAttachment.SaveAsFile(“C:\test\” + objAttachment.FileName); –> <B>

}

 

以下の順で添付ファイルを追加するとします。

Book1.xls (デスクトップ の [送る]-[メール受信者] で追加)

Book2.xlsx (Outlook メール画面の [挿入]-[ファイルの添付] で追加)

Book3.xlsx (Outlook メール画面の [挿入]-[ファイルの添付] で追加)

 

<A> Attachments オブジェクトは、この段階ではソートされていません。

ループの 1 回目の処理では以下のようなリストであり、ソート前の追加した順で Attachment が取得され、objAttachment Book1.xls を差します。

 

Book1.xls

Book2.xlsx

Book3.xlsx

 

しかし、<B> SaveAsFile が実行されるとソートが行われ、リスト内容は以下のように変わります。

 

Book2.xlsx

Book3.xlsx

Book1.xls

 

[送る]-[メール受信者] を行ったファイルはリストの最後に追加されます。

そのためこの例において、ループの 2 回目の処理では objAttachment Book3.xls3 回目の処理では objAttachment Book1.xls となります。

 

対処方法

Attachments のリストから直接 Attachment 取得するのではなく、Attachment 型の配列を別に作成し、Attachments のリストをすべて配列に移し替え、配列から添付ファイルを取り出すことで、上述の順番が入れ替わる問題を発生させないようにすることができます。

 

追加情報 (2016/6/9)
上記はローカルの 97-2003 形式 のファイルを右クリックし、[送る]-[メール受信者] の順にメールを送った場合に発生する事象ですが、その他にも以下の条件にすべて合致する場合に同様の事象が発生することがわかりました。

・ 97-2003 形式ファイルが複数添付されているメールを転送する
・ アドイン内でアイテムを Save する
・ Outlook 2010 の詳細バージョンを 14.0.7155.5000 (2015 年 8 月の修正 KB3055041 適用) 以降とする

この追加の添付ファイルが入れ替わる事象は、97-2003 形式のファイルを SaveAsFile する際に添付ファイルのリストが名前順でソートされること、及び Outlook 2010 の 2015 年 8 月の修正以降、テーブルのソート順としてファイル名が利用されるよう変更になったことに伴って発生します。


本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。