标签: outlook-object-model

检索显示奇怪行为的日历项(Outlook API,WebDAV)

我们正在编写一个MS Outlook插件.为了满足我们的业务逻辑,它应检查某些日期之间的所有约会.从日历中检索所有项目时遇到了一些问题.我们尝试了两种选择:

  1. Outlook API.我们使用MSDN中描述的标准逻辑 - 按[开始]对项目进行排序,设置IncludeRecurrencesTrue日历项目并在此处运行Find\Restrict查询.它在我们的测试环境中工作正常.但是,在我们客户的环境中:对于定期约会,开始和结束日期设置为"主约会"的相应日期.例如,在某个房间的日历中,我们有一个在1月创建的每周约会,如果我们试图在8月找到所有项目,我们会获得此定期约会的四个项目,但其开始和结束日期设置为1月.但Outlook在同一日历中显示正确的日期...

  2. 很糟糕,但我们还有WebDAV!我们编写一个简单的测试应用程序,并尝试使用WebDAV查询日历中的所有项目.当然,我们没有重新发明轮子,只是粘贴了文档中的代码.之前的问题已经解决,但下一个问题出现了:它不会返回大约六个月前创建的重复项目.我没有线索 - 没有限制'旧'项目的参数!

怎么了?我们缺少重要的东西吗?

技术细节:Exchange 2003,Outlook 2003-2010.坦率地说,如果我们打开缓存Exchange模式,第一个错误就会消失,但我们不能这样做.

var nameSpace = application.GetNamespace("MAPI");
var recepient = nameSpace.CreateRecipient(roomEMail);
recepient.Resolve();
var calendar = nameSpace.GetSharedDefaultFolder(recepient, OlDefaultFolders.olFolderCalendar);
var filter = string.Format("[Start]<'{1}' AND [End]>'{0}'",
  dateFrom.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture), dateTo.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture)
);
var allItems = calendar.Items;
allItems.Sort("[Start]");
allItems.IncludeRecurrences = true;
var _item = allItems.Find(filter);
while (_item != null) {
  AppointmentItem item = _item as AppointmentItem;
  if (item != null) {
    if (item.Subject != "some …
Run Code Online (Sandbox Code Playgroud)

outlook exchange-server webdav outlook-object-model

79
推荐指数
1
解决办法
5858
查看次数

检测Outlook自动回复/外出电子邮件

谷歌搜索,没有找到任何东西......

有没有人知道,如果有一种方法,给定一个Outlook电子邮件项目,以检测它是否是由"外出办公室助手"发送的?Outlook是否在对象或任何标题信息上设置了标识电子邮件的属性?我希望不必解析"外出"等主题.

如果有一些标准会很好,所以也可以检测到来自其他电子邮件服务(如Gmail)的自动回复,但对我来说,Outlook是最高优先级.

email-headers outlook-object-model

23
推荐指数
4
解决办法
3万
查看次数

我可以遍历包含子文件夹的文件夹中的所有Outlook电子邮件吗?

我有一个文件夹,其中包含许多电子邮件和子文件夹.在这些子文件夹中有更多电子邮件.

我想写一些VBA,它将遍历某个文件夹中的所有电子邮件,包括任何子文件夹中的电子邮件.我们的想法是从每封电子邮件中提取SenderEmailAddressSenderName使用它.

我尝试将文件夹导出为仅包含这两个字段的CSV,虽然这有效,但它不支持导出子文件夹中保存的电子邮件.因此需要编写一些VBA.

在我重新发明轮子之前,是否有人有任何代码片段或链接到网站,给定文件夹名称,显示如何获取MailItem该文件夹后续子文件夹中的每个电子邮件的对象?

outlook vba mailitem outlook-object-model outlook-vba

13
推荐指数
2
解决办法
4万
查看次数

如何在c#中运行时连接到Outlook 2010?

我想要做的是向winform客户端添加一个"Email To ..."按钮,该客户端打开一个新的Outlook邮件窗口并附加一个文件,以便用户可以转发它.如果outlook还没有运行,我可以让outlook集成工作得很好.这是一个C#.NET 4.0 winforms应用程序,使用Outlook 14.0互操作库,在Windows 7 64位计算机上运行Outlook 2010 32位.由于其他原因,我已将应用程序编译为x86,因此我怀疑它是32/64位问题.这是我的代码:

// Connect to outlook and create a new mail item
var app = new Outlook.Application();
var ns = app.GetNamespace("MAPI");
var mailItem = (Outlook.MailItem)ns.Application.CreateItem(Outlook.OlItemType.olMailItem);

// create the mail item and attach the file
mailItem.To = "";
mailItem.Subject = "Emailing: " + Path.GetFileName(_currentFilePath);
mailItem.Attachments.Add(_currentFilePath, Outlook.OlAttachmentType.olEmbeddeditem);

// show the email dialog window
mailItem.Display(true);
Run Code Online (Sandbox Code Playgroud)

如果outlook没有运行,它可以完美运行.一旦打开,我在第一行尝试创建Outlook.Application对象时收到以下错误:

由于以下错误,检索具有CLSID {0006F03A-0000-0000-C000-000000000046}的组件的COM类工厂失败:80080005服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)).

任何想法会导致什么?这是某种版本的冲突吗?

email-integration ms-office office-interop outlook-object-model winforms-interop

12
推荐指数
2
解决办法
7158
查看次数

Outlook中没有应用程序退出事件?

我正在使用12.0 Interop库,这是Outlook 2007的默认值.我实际上的目标是将Outlook 2003到2010集成到一个注册到退出事件的代码示例.

即使文档说Outlook应用程序有一个应用程序Quit 事件,我也无法在Outlook.Application对象实现中找到它.

Visual Studio 2010似乎确定Quit为一种方法:

退出似乎是一种方法,而不是一个事件

题:

如何注册Outlook应用程序的Quit事件?(如果有一个,或者在应用程序退出时触发的任何事件)如果可能,请提供一些示例代码.

谢谢!

c# outlook outlook-object-model quit

6
推荐指数
2
解决办法
3873
查看次数

搜索全球地址列表/簿

我正在开发一个应用程序,允许用户查看他们有权访问的收件箱的内容。我很难找到一种搜索全局地址列表的方法,而不是

AddressEntries entries = global.AddressEntries;
AddressEntry entry = entries["search value"];
Run Code Online (Sandbox Code Playgroud)

这有效但只返回一个实例,它是第一个找到的实例。如果有多个结果,我基本上想向用户提供一个列表。

其次,我希望能够查看联系方式,但是当我使用

ContactItem contact = entry.GetContact();
Run Code Online (Sandbox Code Playgroud)

它总是返回null,我认为是因为它正在查看当前用户的联系人个人列表

如果有意义的话,我想我正在尝试在 Outlook 中创建一个简单版本的全局通讯簿窗口。

无论如何,如果有人有任何想法或参考,我将不胜感激!

谢谢帕特里克

c# outlook-object-model

6
推荐指数
2
解决办法
1万
查看次数

从Outlook获取收件箱

我在Outlook 2010中配置了两个Exchange帐户,但是我无法找到如何到达第二个帐户的收件箱.Session.GetDefaultFolder()总是返回第一个.

甚至枚举Session.Accounts,找到正确的帐户并调用Session.Account(found one).Store.GetDefaultFolder()返回错误的收件箱(来自默认的交换帐户,而不是辅助帐户).

outlook vba outlook-object-model outlook-vba outlook-addin

5
推荐指数
1
解决办法
5836
查看次数

如何使用唯一且稳定的标识符访问 Outlook 邮件?

我正在构建一个应用程序来分析 Outlook 电子邮件,存储分析的信息,然后允许用户打开满足特定条件的邮件。

我希望我会从每封电子邮件中提取 Message-ID,将其存储在我的数据库中,然后通过稍后向 Outlook 提供 Message-ID 来要求 Outlook 打开一条消息。但是,我似乎错过了一些东西。

通过 Outlook 互操作 API,我可以获得一个 EntryID,但据我所知,EntryID 只能保证在给定的文件夹(或者可能是给定的商店)中稳定。如果将邮件移动到不同的文件夹,则 EntryID 可能会更改。此外,API 要求在通过 EntryID 查找消息时提供 StoreID。同样,如果消息在存储之间移动,则该信息可能是无效的。

我见过很多与 Office 相关的产品,它们似乎具有我上面描述的功能。如何高效查找 Outlook 可访问的邮件,而不管商店等如何?

目前,我的备份计划是为我扫描的每个 Message-ID 存储 EntryID 和 StoreID 信息,然后尝试我为给定 MessageID 记录的所有各种 EntryID/StoreID 组合,直到成功为止。但这似乎是 Outlook 应该已经知道如何为我完成的工作。

谢谢,

-帕特里克

c# office-interop outlook-object-model

5
推荐指数
1
解决办法
5636
查看次数

使用 VSTO 更改 Outlook 设置

我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索/设置 Microsoft Outlook 2010 的 Outlook 设置。我所说的“设置”是指文件/选项/邮件下的设置。我想做的是检索用户设置的设置列表,自动化我们每天需要在某些消息上运行的整个打印过程,然后恢复设置。到他们原来的。

我注意到在 Word 中,下面的代码可用于通过 Word.Application.Options 设置某些设置,但我在 Outlook 中找不到任何属性或方法来实现此目的。任何帮助都感激不尽。

Word.Application application = (Word.Application)initialiseApps(AppNames.Word);
Word.Options options = application.Options; 

wordSettings.PrintDrawingObjects = options.PrintDrawingObjects;
wordSettings.PrintBackgrounds = options.PrintBackgrounds;
wordSettings.PrintProperties = options.PrintProperties;
wordSettings.PrintHiddenText = options.PrintHiddenText;
wordSettings.UpdateFieldsAtPrint = options.UpdateFieldsAtPrint;
wordSettings.PrintFieldCodes = options.PrintFieldCodes;
wordSettings.MapPaperSize = options.MapPaperSize;

application.Quit();
Marshal.ReleaseComObject(options);
Marshal.ReleaseComObject(application);
Run Code Online (Sandbox Code Playgroud)

c# outlook vsto application-settings outlook-object-model

5
推荐指数
0
解决办法
1068
查看次数

MailItem.GetInspector.WordEditor始终在Outlook 2013 AddIn上为NULL

我们有一个C#Outlook加载项,允许最终用户单击功能区中的一个按钮以在新电子邮件中插入一些内容.我们正在使用MailItem.GetInspector.WordEditor来执行此操作.然而,奇怪的是我们的程序无法一直获得WordEditor.到目前为止,它只在我的机器上.

我们会像这样得到例外

System.Runtime.InteropServices.COMException (0x9CD04005): The operation failed.
   at Microsoft.Office.Interop.Outlook._Inspector.get_WordEditor()
Run Code Online (Sandbox Code Playgroud)

最后4位数字总是4005,而前4位数字可能会改变.前4个应该引用发生错误的组件.

我在我的机器上安装了outlookspy,它也无法获得WordEditor.
在此输入图像描述

我通过互联网进行了一些搜索并发现了这个链接:system.Runtime.InteropServices.COMException(0xB5904005):操作失败,因此它表明我们会在Activate事件上获取WordEditor以确保WordEditor完全初始化,但是在新的电子邮件,它应该已经根据我们的理解激活,除非我们在这里遗漏了一些东西 另外,我在一封新邮件上多次运行OUtlookSpy,每次WordEditor都为空.所以它似乎不应该是初始化问题.

有人可以对我们应该在这里调查的内容有所了解吗?

c# ms-office outlook-object-model outlook-addin outlook-2013

3
推荐指数
1
解决办法
1083
查看次数

如何从单个出现的Outlook约会系列主

当预约实例打开时,我需要获得会议系列的主要约会.

我尝试了以下(currentAppointment变量的类型为AppointmentItem)

DateTime sd = currentAppointment.GetRecurrencePattern().PatternStartDate;
DateTime st = currentAppointment.GetRecurrencePattern().StartTime;

AppointmentItem ai = currentAppointment.GetRecurrencePattern().GetOccurrence(sd+st.TimeOfDay);
Run Code Online (Sandbox Code Playgroud)

然而,虽然这让我获得了该系列中的第一个约会,但它有一个复制状态为olApptOccurrence.

我怎样才能获得对olApptMaster的引用 - 即会议系列?

outlook vsto outlook-object-model

2
推荐指数
1
解决办法
1668
查看次数

从Exchange中存储的ContactInfo获取Smtp电子邮件

我使用VSTO作为我的Outlook加载项.目前我正在处理所有Outlook联系人的电子邮件地址.如果EmailAddress1Type是"SMTP",则ContactInfo的实例没有问题.

但是如何获取Exchange联系人的电子邮件地址(Email1AddressType ="EX")?

Redemption库对我来说不是解决方案,因为解决这个问题很昂贵.

先感谢您,

杜尚

outlook vsto exchange-server outlook-object-model outlook-addin

2
推荐指数
1
解决办法
1532
查看次数

Outlook对象模型 - 检测邮箱

我有一个Delphi 2006 BDS应用程序,其中包含以下代码,用于迭代Outlook邮箱,然后迭代邮箱中的收件箱和已发送邮件:

  try
    nameSpace := outlook.GetNameSpace('MAPI');
    // load the mailboxes
    mailbox := NameSpace.Folders;

    for i := 1 to mailbox.Count do
      if Pos('MAILBOX', UpperCase(mailbox.Item[i].Name)) > 0 then
      begin
        rootNode := trvwOutlookFolders.Items.AddChildObject(nil, mailbox.Item[i].Name, nil);

        for j := 1 to mailbox.Item[i].Folders.Count do
          if (Pos('INBOX', UpperCase(mailbox.Item[i].Folders[j].Name)) > 0) or
             (Pos('SENT ITEMS', UpperCase(mailbox.Item[i].Folders[j].Name)) > 0) then
          begin
        // do processing
          end;

      end;

  finally
    outlook := Unassigned;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

该代码在Outlook 2007下正常工作,但在2010年没有,因为邮箱不包含"邮箱"一词.因此,我采用另一种方法从Outlook中提取JUST邮箱(不是公用文件夹等)及其子序列收件箱和已发送的项目文件夹.有任何想法吗?

delphi automation ole outlook-object-model

0
推荐指数
1
解决办法
2003
查看次数