问题
I have written this code to view the unread items in my outlook mail box and here is the code:
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());
}
}
but on the foreach loop I am getting this error:
"Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00063034-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."
Can you please assist me how to resolve this error?
回答1:
I had to get around something like your problem a while back.
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
Hope that helps.
The issue here is that _explorer.CurrentFolder.Items
can contain more objects than just MailItem
(PostItem
being one of them).
回答2:
try to check the item is a valid mailitem
before checking its properties :
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());
}
}
回答3:
The following code worked fine when I tested it. But I must mention that my reference was to "Microsoft Outlook 14.0 Object Library". Do you happen to use another version?
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"); } } }
Please note that in Outlook, many items have some common properties (e.g. expiration time), so you can, as a desperate workaround, use a "dynamic" datatype - either as a fallback scenario for unknown item types or as your default (as long as you're fine with the performance hit).
回答4:
Nice! adapted the solution a bit, this worked well for me
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>");
}
}
来源:https://stackoverflow.com/questions/4656360/unable-to-cast-com-object-microsoft-outlook-c-sharp