Incapaz de objeto COM fundido - Microsoft Outlook & C #
-
09-10-2019 - |
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?
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>");
}
}