我已编写此代码以查看Outlook邮箱中的未读项目,以下是代码:
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());
}
}
但在foreach循环中我收到此错误:
“无法将类型为'System .__ ComObject'的COM对象转换为接口类型'Microsoft.Office.Interop.Outlook.MailItem'。此操作失败,因为QueryInterface调用COM组件上的IID为{00063034的接口-0000-0000-C000-000000000046}由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。“
您能帮我解决一下这个错误吗?
答案 0 :(得分:23)
我不得不在一段时间内解决你的问题。
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
希望有所帮助。
此处的问题是_explorer.CurrentFolder.Items
可以包含的对象多于MailItem
(PostItem
是其中之一)。
答案 1 :(得分:6)
在检查项目属性之前,尝试检查项目是否有效mailitem
:
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());
}
}
答案 2 :(得分:4)
以下代码在我测试时运行正常。但我必须提到我的参考是“Microsoft Outlook 14.0对象库”。你碰巧使用另一个版本吗?
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"); } } }
请注意,在Outlook中,许多项目都有一些常见属性(例如到期时间),因此您可以使用“动态”数据类型作为绝望的解决方法 - 作为未知项类型的后备方案或作为默认值(只要你对性能的影响很好)。
答案 3 :(得分:0)
好!稍微调整了解决方案,对我来说效果很好
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>");
}
}