2012-05-04 12 views
5

Hola Tengo que leer el archivo adjunto y la imagen en línea por separado en el directorio local de Outlook 2010 con C#. He usado el concepto de identificación de propiedad y contenido para esto. Estoy usando el siguiente código para hacer eso, pero ahora está funcionando.Cómo diferenciar entre la imagen en línea y el archivo adjunto en 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); 
     } 
    } 
} 

favor ayuda trabajo en progreso ....

+0

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

Respuesta

2

Vine aquí en busca de una solución pero no me gustó la idea de buscar "cid:" en todo el HTMLBody. En primer lugar, es lento hacer eso para cada nombre de archivo y, en segundo lugar, si "cid:" estaba presente en el texto del cuerpo obtendría un falso positivo. Además, realizar ToLower() en HTMLBody no es una buena idea.

En su lugar terminé usando una expresión regular una vez en el HTMLBody para buscar cualquier instancia de la etiqueta <img>. Por lo tanto, no hay forma de asociar falsamente "cid:" en el texto del cuerpo (por improbable que sea).

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

Estoy bastante seguro de que podría haber escrito una expresión regular para devolver sólo los nombres de los archivos y que probablemente sería más eficiente. Pero preferiría el gasto adicional en aras de la legibilidad para aquellos que no son gurús de Regex que tienen que mantener el código.

+0

Esto no funcionará si el Correo tiene una firma con algún tipo de imagen. Outlook no se incluirá en la etiqueta . – Steinfeld

+0

Sí, esto no funciona cuando se hace referencia a la imagen incrustada desde una propiedad css. Además, noté que accediendo a HtmlBody y RtfBody establecí el correo sucio (solicite guardar al cerrar) como un efecto secundario: / – Yaurthek

Cuestiones relacionadas