2012-05-04 9 views
5

Witam Muszę czytać załącznik i obraz liniowy oddzielnie w lokalnym katalogu z programu Outlook 2010 przy użyciu C#. Użyłem w tym celu koncepcji własności i treści. Używam następujący kod do tego, ale teraz działa.Jak rozróżnić obraz Inline i załącznik w programie 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); 
     } 
    } 
} 

pomóż w toku ....

+0

Łańcuch SchemaPR_ATTACH_CONTENT_ID = @ "http://schemas.microsoft.com/mapi/proptag/0x3712001E"; – zytham

Odpowiedz

2

Przyszedłem tutaj, szukając rozwiązania, ale nie podoba mi się pomysł wyszukiwania "cid:" w całym HTMLBody. Po pierwsze, powolne jest robienie tego dla każdej nazwy pliku, a po drugie, jeśli "cid:" był obecny w tekście głównym, uzyskałbym fałszywy alarm. Ponadto wykonywanie ToLower() w HTMLBody nie jest dobrym pomysłem.

Zamiast tego użyłem raz wyrażeń regularnych na HTMLBody w celu wyszukania dowolnego wystąpienia znacznika <img>. Tak więc nie ma możliwości fałszywego dopasowania "cid:" w tekście zasadniczym (choć jest to mało prawdopodobne).

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

Jestem całkiem pewien, że mogłem napisać wyrażenie regularne, aby zwrócić tylko nazwy plików i że prawdopodobnie będzie bardziej wydajne. Ale wolałbym dodatkowy koszt ze względu na czytelność dla tych, którzy nie są guru Regex, którzy muszą zachować kod.

+0

To przyniesie efekt, jeśli Mail ma podpis z jakimś obrazkiem. Program Outlook nie będzie uwzględniany w tagu . – Steinfeld

+0

Tak, to nie działa, gdy do obrazu osadzonego odwołuje się właściwość css. Zauważyłem również, że dostęp do HtmlBody i RtfBody ustawił zabrudzenie poczty (pytanie o zapisanie na zamknięcie) jako efekt uboczny: / – Yaurthek

Powiązane problemy