ASP.. NET网页从outlook获取电子邮件的问题

本文关键字:电子邮件 问题 获取 outlook NET 网页 ASP | 更新日期: 2023-09-27 18:01:28

我们刚刚启动了一个新任务,使用asp.net web应用程序从exchange服务器检索不同帐户的电子邮件。我过去没有这样的经历,但在网上搜索后,我发现了一个可以与outlook通信并从中获取电子邮件的代码片段。然而,每次我测试代码时都会出现一个异常:

"无法强制转换类型为COM的对象的系统。__ComObject'到接口类型"Microsoft.Office.Interop.Outlook.PostItem"。操作失败,原因是在COM上调用QueryInterface组件,用于具有IID的接口"{00063024 - 0000 - 0000 - c000 - 00063024}"失败,由于以下错误(异常from HRESULT: 0x80004002(E_NOINTERFACE))。"

有人知道原因吗?

顺便说一下,任何建议帮助从exchange服务器直接获取邮件是非常感谢的!

我的代码:

        Microsoft.Office.Interop.Outlook.Application app = null;
        Microsoft.Office.Interop.Outlook._NameSpace ns = null;
        Microsoft.Office.Interop.Outlook.PostItem item = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
        Microsoft.Office.Interop.Outlook.MAPIFolder subFolder = null;
        try
        {
            app = new Microsoft.Office.Interop.Outlook.Application();
            ns = app.GetNamespace("MAPI");
            ns.Logon("user", "password", false, false);
            inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("Folder Name:{0},EntryId:{1}", inboxFolder.Name, inboxFolder.EntryID);
            sb.AppendFormat(" Num Items:{0}", inboxFolder.Items.Count.ToString());
            Response.Write(sb);
            for (int i = 1; i <= inboxFolder.Items.Count; i++)
            {
                item = (Microsoft.Office.Interop.Outlook.PostItem)inboxFolder.Items[i];//this is the exception happened line
                Console.WriteLine("Item: {0}", i.ToString());
                Console.WriteLine("Subject: {0}", item.Subject); 
                Console.WriteLine("Sent: {0} {1}" item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString());
                Console.WriteLine("Categories: {0}", item.Categories);
                Console.WriteLine("Body: {0}", item.Body);
                Console.WriteLine("HTMLBody: {0}", item.HTMLBody); 
            }
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            ns = null;
            app = null;
            inboxFolder = null;
        }

ASP.. NET网页从outlook获取电子邮件的问题

开始:

用这些行…

Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);

…您正在创建对用户收件箱的引用。到目前为止一切顺利。

但是这里…

for (int i = 1; i <= inboxFolder.Items.Count; i++)
{
    item = (Microsoft.Office.Interop.Outlook.PostItem)inboxFolder.Items[i];
    //other stuff...
}

…您说,"对于收件箱中的每个条目,假设该条目是PostItem。"

根据MSDN, PostItem:

表示公用文件夹中的文章让其他人可以浏览。

用户的收件箱不会满是帖子。它将包含表示用户邮件的MailItem对象。在这种情况下,这行代码应该是

item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[i];

警告:我不太了解Outlook的API来理解是否有可能在收件箱中有Outlook项目对象而不是MailItem对象,但我打赌不会。作为参考,Outlook项目对象的完整列表在这里。

使用方法如下:

// not PostItem
item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[i];