C# outlook:无法将类型 'System._ComObject' 的 COM 对象转换为接口类型 'Microsoft.Office.Interop.Outlook.MailItem.'

C# outlook : Unable to cast COM object of type 'System._ComObject' to Interface type 'Microsoft.Office.Interop.Outlook.MailItem.'

我是 c# 新手。

自 1 周以来,我一直在尝试自己解决这个问题,直到我别无选择,只能在这里寻求帮助。

我的目标是创建一个控制台应用程序,它会在辅助邮箱[mailboxB@gmail.com]/第二个 outlook 帐户上查找未读邮件,并根据主题回复这些邮件。

代码在我的机器上工作正常

不幸的是,当在其他机器上部署相同的 exe 时,会生成以下错误:

无法转换类型为 'microsoft.office.interop.outlook.mailitem' 的 com 对象。此操作失败,因为 COM 组件上的 QueryInterface 调用具有 IID'{00063034-0000- 0000-C000-000000000046}' 由于以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE))

请注意,我已经尝试了以下方法来解决问题,但问题仍然存在:

  1. 以管理员身份重新启动 Outlook。

    在属性->兼容性下将应用程序的兼容性更改为运行作为管理员

  2. 检查了 16.0 的 outlook 版本,代码中使用了相同的 ref。

请在下面找到我的代码:

            Outlook.Application oApp = new Outlook.Application();
            Outlook.NameSpace oNS = (Outlook.NameSpace)oApp.GetNamespace("MAPI");
            
            MAPIFolder theInbox = oNS.Folders["mailboxB@gmail.com"].Folders["Inbox"];
            
            Outlook.Items unreadItems = theInbox.Items.Restrict("[Unread]=true");
            string t = "Test Mail";
            try
            {
                foreach (Outlook.MailItem it in unreadItems)
                {
                    if (it.Subject == t)
                    {
                        Outlook.MailItem replyMail = it.Reply();
                        it.HTMLBody = DateTime.Now.ToString("HH:mm:ss");
                        
                        
                        replyMail.Send();
                        it.Unread=false;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

我们将不胜感激任何形式的帮助。

您的收件箱文件夹中可以有 MailItem 以外的项目,例如ReportItemMeetingItem.

将您的代码更改为

foreach (object obj in unreadItems)
{
   if (obj is Outlook.MailItem it)
   {
      ...