【问题标题】:Outlook access shared calendarOutlook 访问共享日历
【发布时间】:2018-06-22 09:38:53
【问题描述】:

我正在 Embarcadero Delphi 中构建一个应用程序,其中希望从与当前用户共享的 Outlook 日历中读取约会。

我的问题是不知道在文件夹结构中的哪里可以找到这些。

在我的桌面上,我使用连接到 Exchange 服务器的 Outlook 2010(14.0.7188.5002 32 位)。我可以将同事共享的日历添加到我在 Outlook 中的日历视图中:

我可以看到有关他们约会的选定信息,主要是他们是免费的还是预订的。正是我的外部工具想知道的。

现在我想通过 Outlook 对象模型访问这些日历。

(对于发布 Delphi 代码,我深表歉意,但它主要是直接进入导入的 TLB,在其他地方按广告宣传)

我尝试像这样使用GetSharedDefaultFolder()

Recipient := FOutlook.NameSpace.CreateRecipient('bernie@someplace.com');
Recipient.Resolve;
SharedFolder := FOutlook.Namespace.GetSharedDefaultFolder(Recipient, olFolderCalendar);

但不幸的是,这在调用GetSharedDefaultFolder() 时失败了。收件人是正确的,它解决得很好。抛出的错误(作为 Delphi 异常)是:

EOleException - Der versuchte Vorgang konnte nicht ausgeführt werden. Ein Objekt wurde nicht gefunden

这翻译回英文为:“无法完成尝试的操作。找不到对象”。

如果我仅通过对象模型选择共享日历,我将不胜感激有关如何访问 Outlook 在 UI 中向我显示的相同信息的任何输入。

提前感谢您的宝贵时间, 玛丽安

【问题讨论】:

  • 看到忙/闲并不表示共享。如果not shared。如果您只需要忙/闲信息,请尝试Recipient.FreeBusy。注意:我的 VBA 经验是电子邮件地址总是解析,而是使用名称。
  • 如果查看 Recipient.Address 属性,它是 EX 还是 SMTP 类型的地址?
  • > 看到忙/闲并不表示共享。我通过执行“Kalender hinzufügen”->“Freigegebenen Kalender öffnen”添加了我在屏幕截图中涂黑的日历。我将其翻译回“添加日历”->“打开共享日历”。这是我唯一表明我感兴趣的日历已与我共享的迹象。我已经用对 Recipient.FreeBusy 的调用替换了对共享日历的访问,但这给了我相同的 Element not found 错误。这是否意味着没有找到收件人,即使它解决得很好,甚至日历也没有问题?
  • Recipient.Address 以“name.firstname@domain.tld”格式为我提供地址。 Recipient.AddressEntry.Type 说“SMTP”。我已经尝试过您按名称而不是地址创建收件人的建议,但以这种形式无法解决。
  • 由于无法解析名称,您可能错过了创建收件人的步骤。这是VBA中的过程。 stackoverflow.com/a/5626512/1571407 请注意,您的 cmets 在将用户名发送给特定用户之前需要一个 @。帖子所有者始终会收到通知。

标签: vba delphi outlook


【解决方案1】:

我因未能展示我的整个代码、真实代码和完整代码而感到内疚。

@nitons 评论,特别是链接答案中声称非共享日历只会显示为空,这促使我玩得更多。

我确实错过了对Recipient.Resolve 的呼叫。我真正的代码是遍历分发列表的成员,但我认为这并不重要,因为它正在工作。所以实际上我并没有创建一个新的Recipient 并解决它,但我有:

for i := 1 to DistList.MemberCount do
  begin
    Recipient := DistList.GetMember(i);
    if not Recipient.Resolved 
      then Recipient.Resolve;
    Folder := FOutlook.NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);
    // ...
  end;

如前所述,此操作失败。我无条件地拨打了Resolve,但仍然失败。

对我有用的是从DistList.GetMember返回的Recipient创建一个新的DistList.GetMember,如下所示:

Recipient := DistList.GetMember(i);
Recipient := FOutlook.NameSpace.CreateRecipient(Recipient.Address);
Recipient.Resolve;
Folder := FOutlook.NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);

这很好用。调用Recipient.FreeBusy 替换对日历的访问也是如此。

非常感谢 Dmitry 和 niton,你们帮了我很多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多