5

こんにちは、C# を使用して Outlook 2010 からローカル ディレクトリにある添付ファイルとインライン イメージを別々に読み取る必要があります。これには、プロパティとコンテンツ ID の概念を使用しました。それを行うために次のコードを使用していますが、現在は機能しています。

if (mailItem.Attachments.Count > 0)
{
    /*for (int i = 1; i <= mailItem.Attachments.Count; i++)
    {
    string filePath = Path.Combine(destinationDirectory, mailItem.Attachments[i].FileName);
    mailItem.Attachments[i].SaveAsFile(filePath);
    AttachmentDetails.Add(filePath);
    }*/

    foreach (Outlook.Attachment atmt in mailItem.Attachments)
    {
        MessageBox.Show("inside for each loop" );
        prop = atmt.PropertyAccessor;
        string contentID = (string)prop.GetProperty(SchemaPR_ATTACH_CONTENT_ID);
        MessageBox.Show("content if is " +contentID);

        if (contentID != "")
        {
            MessageBox.Show("inside if loop");
            string filePath = Path.Combine(destinationDirectory, atmt.FileName);
            MessageBox.Show(filePath);
            atmt.SaveAsFile(filePath);
            AttachmentDetails.Add(filePath);
        }
        else
        {
            MessageBox.Show("inside else loop");
            string filePath = Path.Combine(destinationDirectoryT, atmt.FileName);
            atmt.SaveAsFile(filePath);
            AttachmentDetails.Add(filePath);
        }
    }
}

進行中の作業を手伝ってください....

4

3 に答える 3

2

私は解決策を探してここに来ましたが、HTMLBody 全体で「cid:」を検索するという考えは好きではありませんでした。第一に、すべてのファイル名に対してこれを行うには時間がかかります。第二に、本文に「cid:」が存在する場合、誤検知が発生します。また、HTMLBody で ToLower() を実行することはお勧めできません。

代わりに、HTMLBody で 1 回正規表現を使用して <img> タグのインスタンスを探すことになりました。したがって、本文の "cid:" を誤って一致させる方法はありません (可能性は低いですが)。

     Regex reg = new Regex(@"<img .+?>", RegexOptions.Singleline | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
     MatchCollection matches = reg.Matches(mailItem.HTMLBody);

     foreach (string fileName in attachments.Select(a => a.FileName)
     {
        bool isMatch = matches
           .OfType<Match>()
           .Select(m => m.Value)
           .Where(s => s.IndexOf("cid:" + fileName, StringComparison.InvariantCultureIgnoreCase) >= 0)
           .Any();

        Console.WriteLine(fileName + ": " + (isMatch ? "Inline" : "Attached"));
     }

ファイル名だけを返す正規表現を書くこともでき、おそらくもっと効率的だろうと確信しています。しかし、コードを維持しなければならない正規表現の達人ではない人にとって読みやすさのために、余分な費用がかかります。

于 2015-03-04T02:16:00.840 に答える