2012-05-04 31 views
5

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

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); 
     } 
    } 
} 

これは私のために働いたものです

+0

文字列SchemaPR_ATTACH_CONTENT_ID = @ "" http://schemas.microsoft.com/mapi/proptag/0x3712001E "; – zytham

答えて

2

私はここで解決策を探してきましたが、HTMLBody全体で "cid:"を検索するというアイデアは好きではありませんでした。まず、すべてのファイル名でそれを行うのが遅いです。第2に、 "cid:"が本文に存在する場合、私は偽陽性になります。また、HTMLBodyでToLower()を実行するのは良い考えではありません。

代わりに、HTMLBodyで正規表現を使用して<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")); 
    } 

ファイル名だけを返す正規表現を書いている可能性があり、おそらくより効率的になるはずです。しかし、私はむしろ、コードを維持しなければならないRegexの指導者ではない人のために、読みやすさのために余分な費用を払っています。

+0

メールに何らかの種類の画像が入った署名がある場合、これはうまくいきません。 Outlookはタグの下には含まれません。 – Steinfeld

+0

埋め込みイメージがCSSプロパティから参照されている場合は、これは機能しません。また、私はHtmlBodyにアクセスし、RtfBodyが副作用としてメールをダーティに設定していることに気づいた。 – Yaurthek

関連する問題