leer desde correos correo conectar con buzon c# visual-studio-2008 outlook

correos - leer correo outlook desde c#



Enumerando el buzón de Outlook usando Visual Studio (2)

Tengo la siguiente clase que tiene como objetivo devolver el asunto de todos los correos electrónicos en una carpeta

Es Visual Studio 2008 contra Outlook 2007 ejecutándose en Windows 7 64bit

using System; using System.Windows; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Interop.Outlook; namespace MarketingEmails { public class MailUtils { public static string[] processMailMessages(object outlookFolder) // Given an Outlook folder as an object reference, return // a list of all the email subjects in that folder { // Set a local object from the folder passed in Folder theMailFolder = (Folder)outlookFolder; string[] listSubjects = new string[theMailFolder.Items.Count]; int itemCount = 0; // Now process the MAIL items foreach (MailItem oItem in theMailFolder.Items) { listSubjects[itemCount] = oItem.Subject.ToString(); itemCount++; } return listSubjects; } }

}

Sin embargo, el código arroja la excepción a continuación:

No se puede convertir el objeto COM de tipo ''System .__ ComObject'' al tipo de interfaz ''Microsoft.Office.Interop.Outlook.MailItem''. Esta operación falló porque la llamada a QueryInterface en el componente COM para la interfaz con IID ''{00063034-0000-0000-C000-000000000046}'' falló debido al siguiente error: No se admitió dicha interfaz (Excepción de HRESULT: 0x80004002 (E_NOINTERFACE)) .

Entiendo que el error ha ocurrido porque está tratando de procesar un ReportItem en el buzón seleccionado.

Lo que no entiendo es por qué está tratando de procesar elementos no enviados por correo cuando he especificado:

foreach (MailItem oItem in theMailFolder.Items)

Si quisiera que procesara las entradas del elemento del informe en el buzón que habría escrito:

foreach (ReportItem oItem in theMailFolder.Items)

Me gustaría saber si esto es un error o si es solo mi error de comprensión

Saludos, Nigel Ainscoe


El motivo es que los elementos de recopilación contienen instancias de MailItem y de ReportItem. Especificar MailItem a la izquierda no filtra la lista, simplemente indica qué tipo espera que esté en la lista.

Lo que tiene que hacer es filtrar en el tipo que desea, así

foreach ( MailItem oItem in theMailFolder.Items.OfType<MailItem>()) { .. }

El método OfType solo devolverá los valores dentro de la colección que coincidan con ese tipo particular.


La declaración de tipo en el bucle foreach no se filtra por tipo; en su lugar arroja una excepción, como habrás notado.

Hace esto porque foreach se introdujo en C # 1.0, que no contenía genéricos. Por lo tanto, no hay forma de que el compilador sepa qué tipo devuelve IEnumerator . (Esto sigue siendo cierto si la colección no implementa IEnumerable<T> ). Nitpickers : Sé que incluso en C # 1 es posible escribir un enumerador fuertemente tipado (como List<T> hace); la gran mayoría no lo es.

En aquel entonces, si coloca accidentalmente el tipo incorrecto en el foreach , preferiría hacer que arroje una excepción en lugar de hacer misteriosamente nada.

Como explicó JaredPar, debes usar el método OfType .