Pregunta

He escrito el código para ver los elementos no leídos en mi buzón de correo de Outlook y aquí está el código:

 Microsoft.Office.Interop.Outlook.Application app;
 Microsoft.Office.Interop.Outlook.Items items; 
 Microsoft.Office.Interop.Outlook.NameSpace ns; 
 Microsoft.Office.Interop.Outlook.MAPIFolder inbox;

 Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application();
        app = application;
        ns =  application.Session;
        inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        items = inbox.Items;
        foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
        {
            if (mail.UnRead == true)
            {
                MessageBox.Show(mail.Subject.ToString());
            }
        }

pero en el bucle foreach que estoy recibiendo este error:

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

¿Puede usted por favor me ayude cómo resolver este error?

¿Fue útil?

Solución

tuviera que moverse algo así como su problema hace un tiempo.

        foreach (Object _obj in _explorer.CurrentFolder.Items)
        {
            if (_obj is MailItem)
            {
                 MyMailHandler((MailItem)_obj);
            }
        }

Espero que ayude.

El problema aquí es que _explorer.CurrentFolder.Items puede contener más objetos que simplemente MailItem (PostItem es uno de ellos).

Otros consejos

tratar de comprobar este elemento es un mailitem válida antes de comprobar sus propiedades:

foreach (Object mail in items)
{
    if ((mail as Outlook.MailItem)!=null && (mail as Outlook.MailItem).UnRead == true)
    {
        MessageBox.Show((mail as Outlook.MailItem).Subject.ToString());
    }
}

El siguiente código funciona bien cuando lo probé. Pero debo mencionar que mi referencia era a "Microsoft Outlook 14.0 Object Library". ¿Por casualidad utilizar otra versión?

    public class Outlook
    {
    readonly Microsoft.Office.Interop.Outlook.Items       _items;
    readonly Microsoft.Office.Interop.Outlook.NameSpace   _ns;
    readonly Microsoft.Office.Interop.Outlook.MAPIFolder  _inbox;
    readonly Microsoft.Office.Interop.Outlook.Application _application = new Microsoft.Office.Interop.Outlook.Application(); 

    public Outlook()
    {
        _ns    = _application.Session;
        _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        _items = _inbox.Items;

        foreach (var item in _items)
        {
            string subject= string.Empty;
            var mail    = item as Microsoft.Office.Interop.Outlook.MailItem;
            if (mail    != null)
                var subject = mail.Subject;
            else
                Debug.WriteLine("Item is not a MailItem");
        }
    }
    }

Tenga en cuenta que en Outlook, muchos artículos tienen algunas propiedades comunes (por ejemplo, tiempo de expiración), por lo que puede, como una solución desesperada, utilice un tipo de datos "dinámico" - ya sea como un escenario de reserva para este tipo de producto es desconocido o como predeterminado (siempre y cuando usted está muy bien con el impacto en el rendimiento).

Niza! adaptada la solución un poco, esto funcionó bien para mí

foreach (dynamic item in mailItems)
        {
            if (item is MailItem)
            {
                Response.Write("Sender: ");
                Response.Write(item.SenderEmailAddress);
                Response.Write(" - To:");
                Response.Write(item.To);
                Response.Write("<br>");
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top