Exception iterating thru inbox mailitems

S

Stuart Parker

Hi

If I use a For Each to iterate through the inbox mailitems, I get the
following exception after a few items are processed:

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)).

What's going on ?

Cheers
 
S

Stuart Parker

OK, The item it's failing on is a Non-Delivery Report returned by Exchange
which is in the inbox.

Is there something strange about NDRs, I assume they aren't of type mailitem
then?
 
C

cainrandom

OK, The item it's failing on is a Non-Delivery Report returned by Exchange
which is in the inbox.

Is there something strange about NDRs, I assume they aren't of type mailitem
then?

Their message class is "IPM.Note.NDR", so they're a sub-type of
MailItem. I'd be surprised if it wouldn't create a MailItem from one,
but I haven't tried. Either way, when iterating through a collection,
you're always best off putting the conversion from the dispatch to the
MailItem in a try/catch. If it fails, what you have can't be used as
a MailItem.
 
S

Stuart Parker

Their message class is "IPM.Note.NDR", so they're a sub-type of
MailItem. I'd be surprised if it wouldn't create a MailItem from one,
but I haven't tried. Either way, when iterating through a collection,
you're always best off putting the conversion from the dispatch to the
MailItem in a try/catch. If it fails, what you have can't be used as
a MailItem.

thanks!

Is there a way to pre-empt this? can I check the type of the item before I
try and cat it to a mailitem?
 
C

cainrandom

thanks!

Is there a way to pre-empt this? can I check the type of the item before I
try and cat it to a mailitem?

You can do yourself what the ATL wrapper is doing for you: call
QueryInterface. But it's easier just to cast it and catch the
exception.
 
S

Stuart Parker

Their message class is "IPM.Note.NDR", so they're a sub-type of
MailItem. I'd be surprised if it wouldn't create a MailItem from one,
but I haven't tried. Either way, when iterating through a collection,
you're always best off putting the conversion from the dispatch to the
MailItem in a try/catch. If it fails, what you have can't be used as
a MailItem.

It's actually of class "REPORT.IPM.Note.NDR" .. could that explain why I
can't cast it to a mailitem?

However, I can cast it to a ReportItem :)

Now I'm using a table object to get a list of my items, and then casting to
the correct type based on the messageclass column in the table (using
namespace.getitemfromID)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top