我编写了这段代码来查看 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”。此操作失败,因为对 IID 为“{00063034-0000”的接口的 COM 组件上的 QueryInterface 调用-0000-C000-000000000046}' 由于以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE))。"
您能帮我解决这个错误吗?
不久前我不得不解决像你这样的问题。
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
希望有帮助。
这里的问题是
_explorer.CurrentFolder.Items
可以包含更多的对象,而不仅仅是 MailItem
(PostItem
是其中之一)。
在检查其属性之前尝试检查该项目是否有效
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());
}
}
以下代码在我测试时运行良好。但我必须提到,我参考的是“Microsoft Outlook 14.0 对象库”。您碰巧使用其他版本吗?
公开课展望 { 只读 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(); 公共展望() { _ns = _application.Session; _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); _items = _inbox.Items; foreach(_items 中的 var item) { 字符串主题= string.Empty; var mail = item as Microsoft.Office.Interop.Outlook.MailItem; if (邮件!= null) var subject = mail.Subject; 别的 Debug.WriteLine("项目不是 MailItem"); } } }
请注意,在 Outlook 中,许多项目都有一些共同的属性(例如过期时间),因此您可以作为绝望的解决方法,使用“动态”数据类型 - 要么作为未知项目类型的后备方案,要么作为默认值(如只要您对性能影响感到满意即可)。
不错!稍微调整一下解决方案,这对我来说效果很好
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>");
}
}
我遇到了这个问题,因为我的 Outlook 文件夹中有一封电子邮件是发送失败的电子邮件。
请确保从文件夹中删除此类邮件,然后重试。对我来说,从文件夹中删除电子邮件无需对代码进行任何更改。