2

メール アイテムから添付ファイルを保存しています。真の添付ファイルのみを取得できるように、最初に本文の形式を確認しています。以下の if else ステートメントは無視してください。次のステートメントはコメントのみです。問題を解決したら、それをコーディングします。今、私の問題は、RichText 本文形式のメールの添付ファイルのファイル名を取得するときにこのエラーが発生することです。すべてがプレーンな HTML 形式で問題ありません。

「currentMailItem.Attachments[1].FileName」は、タイプ「System.Runtime.InteropServices.COMException」の例外をスローしました。ベース {System.Runtime.InteropServices.ExternalException}: {"Outlook は、このタイプの添付ファイルに対してこのアクションを実行できません。"}

public static void SaveData(MailItem currentMailItem)
{
    if (currentMailItem != null)
    {       
        string PR_ATTACH_METHOD = "http://schemas.microsoft.com/mapi/proptag/0x37050003";
        string PR_ATTACH_FLAGS = "http://schemas.microsoft.com/mapi/proptag/0x37140003";

        if (currentMailItem.Attachments.Count > 0)
        {
            for (int i = 1; i <= currentMailItem.Attachments.Count; i++)
            {
                var attachMethod = currentMailItem.Attachments[i].PropertyAccessor.GetProperty(PR_ATTACH_METHOD);
                var attachFlags = currentMailItem.Attachments[i].PropertyAccessor.GetProperty(PR_ATTACH_FLAGS);

                if (currentMailItem.BodyFormat == OlBodyFormat.olFormatPlain)
                    //no attachment is inline
                else if (currentMailItem.BodyFormat == OlBodyFormat.olFormatRichText)
                {
                    if (attachMethod == 6)
                        //attachment is inline
                    else
                        //attachment is normal
                }
                else if (currentMailItem.BodyFormat == OlBodyFormat.olFormatHTML)
                {
                    if (attachFlags == 4)
                        //attachment is inline
                    else
                        //attachment is normal
                }
                currentMailItem.Attachments[i].SaveAsFile(@"C:\TestFileSave\" + currentMailItem.Attachments[i].FileName);
            }
        }
    }   
}
4

2 に答える 2

2

RTF 形式の場合、添付ファイルのプレビューを表示し、その場で編集するために、RTF 本文で使用される OLE オブジェクトを埋め込んでいます。このような添付ファイルを添付ファイルの種類 (Attachment.Type == olAttachmentType.olOLE (6)) で除外するか、または次のいずれかを使用して添付ファイル データを抽出できます。

  1. 拡張 MAPI (C++ または Delphi のみ) - IAttach::OpenProperty(PR_ATTACH_DATA_OBJ, IID_IStorage, ...) を呼び出して添付データを IStorage として開き、IStorage ストリームの 1 つからファイル データを抽出します。正確なストリーム名と形式は、それを作成するために使用される特定のアプリケーション (Word、Adobe、Paintbrush、Excel など) によって異なります。OutlookSpyでデータを表示できます。そのような添付ファイルを含むメッセージを選択し、OutlookSpy リボンの IMessage ボタンをクリックし、GetAttachmentTable タブに移動し、添付ファイルをダブルクリックし、PR_ATTACH_DATA_OBJ プロパティを選択し、右クリックして OpenProperty を選択し、IID_IStorage を選択します。 .

  2. Redemption (任意の言語): そのRDOAttachmentオブジェクトは、SaveAsFile を呼び出すか、FileName プロパティにアクセスしたときに、OLE 添付ファイルの実際のファイル データを抽出するのに十分スマートです。

于 2014-08-25T22:58:40.630 に答える
0

これは古い質問かもしれません...

私は同様の問題を見てきました。リッチ テキスト形式の mailItem の本文に画像が添付されている場合、同様の例外が発生します。

ただし、添付ファイルが画像でない場合、たとえば .doc 拡張子の場合、エラーは表示されません。私が理解している限り、問題は添付画像のファイル名を取得することです。Outlook が、リッチ テキスト形式の電子メール アイテムから本文に添付された画像のファイル名を取得する方法を認識していないことがあります。

于 2014-08-25T22:39:53.950 に答える