【问题标题】:ASP.NET web page getting emails from outlook problemASP.NET 网页从 Outlook 问题中获取电子邮件
【发布时间】:2011-08-13 20:06:36
【问题描述】:

我们刚刚启动了一项新任务,使用 asp.net Web 应用程序从交换服务器检索不同帐户的电子邮件。我过去没有这样的经验,但是在网上搜索后我发现了一个可以与outlook通信并从那里获取电子邮件的代码sn-p。但是,每次我测试代码时都会发生异常:

"无法转换 COM 类型的对象 'System.__ComObject' 到接口类型 'Microsoft.Office.Interop.Outlook.PostItem'。 此操作失败,因为 COM 上的 QueryInterface 调用 带有 IID 的接口组件 '{00063024-0000-0000-C000-000000000046}' 由于以下错误而失败:否 支持此类接口(异常 从 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;
        }

【问题讨论】:

  • 您必须使用互操作,还是可以像大多数使用 POP 从邮件服务器检索消息的应用程序一样使用互操作?
  • @Eariz,没必要,但我需要一种从 Exchange 服务器检索电子邮件的方法。
  • @Mike,很高兴知道,我会读的。谢谢。

标签: c# asp.net outlook exchange-server


【解决方案1】:

这里是:

用这些线...

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。”

According to MSDN, a PostItem

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

用户的收件箱不会装满帖子。它将包含代表用户电子邮件的MailItem 对象。既然如此,那这行代码大概应该是

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

警告:我对 Outlook 的 API 了解不足,无法了解收件箱中是否可能存在 Outlook 项目对象而不是 MailItem 对象,但我敢打赌不会。供参考,full list of Outlook Item Objects is here

【讨论】:

    【解决方案2】:

    如下图使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2017-10-09
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多