【问题标题】:How can I identifiy a specific appointment item in outlook如何在 Outlook 中识别特定的约会项目
【发布时间】:2022-04-19 23:56:54
【问题描述】:

我们面临一个问题,即我们需要在 Outlook 中识别特定约会,即使它是定期约会。但由于GlobalAppointmentID 对整个循环系列来说是独一无二的,我们不知道如何。

据我所知,如果是定期约会,则单个约会没有特定的唯一 ID。所以我们认为我们通过将 Ticks 中的 Start-Time 添加到 GlobalAppointmentID 来生成我们自己的 ID,但是我们需要/希望将这个新 ID 保存在约会对象中(因为 StartTime 可能会更改)。

我的问题:有没有办法识别特定约会,如果没有,我如何在特定约会中保存一个值,每个收件人都可以随时访问并且是最新的?

//编辑:更具体一点:我们有一个允许将文件上传到我们的服务器的 Outlook 插件,该插件必须映射到特定的约会(以及所有收件人)。对于正常的单次会议,我们只需要 GlobalAppointmentID。如果是定期约会,则仍需要将其映射到一个特定的“会议”。大多数时候,这次会议/约会不包含任何时间例外或其他任何情况。所以我需要在 C# 中获取这个特定的 ID。

【问题讨论】:

    标签: c# .net outlook office-interop


    【解决方案1】:

    这是旧的,但它仍然出现在搜索中,所以我会尝试改进答案,因为我刚刚在我们公司经历过这个。

    正如 Dmitry 所写,重复约会的出现是不存在的,除非并且直到它们成为例外,因为用户在出现时更改了某些内容。这也意味着他们没有独立的ID。

    但是,如果没有更改,每个异常都有其发生的原始日期。对于每个非异常事件,该日期只是事件的开始日期。

    表示

    您可以使用全局约会 id 和原始日期的组合来获取一个唯一标识约会的 ID,即使它是一个事件:

        public struct AppointmentId : IEquatable<AppointmentId>
        {
            private readonly string GlobalAppointmentId;
            private readonly LocalDate? OriginalDate;
    
            public AppointmentId(string globalAppointmentId)
            {
                this.GlobalAppointmentId = globalAppointmentId;
                this.OriginalDate = null;
            }
    
            public AppointmentId(string globalAppointmentId, LocalDate originalDate)
            {
                this.GlobalAppointmentId = globalAppointmentId;
                this.OriginalDate = originalDate;
            }
    
            public bool Equals(AppointmentId other)
            {
                return this.GlobalAppointmentId.Equals(other.GlobalAppointmentId, StringComparison.Ordinal) &&
                    this.OriginalDate == other.OriginalDate;
            }
    
            public override bool Equals(object obj) =>
                obj is AppointmentId other && this.Equals(other);
    
            public override int GetHashCode()
            {
                unchecked
                {
                    int hash = 62207;
                    hash += 3 * this.GlobalAppointmentId.GetHashCode();
                    hash += (5 * this.OriginalDate?.GetHashCode() ?? 0);
                    return hash;
                }
            }
    
            public override string ToString()
            {
                if (this.GlobalAppointmentId == null) return "<None>";
                if (this.OriginalDate == null)
                {
                    return $"{this.GlobalAppointmentId}";
                }
                return $"{OriginalDate.Value)} / {GlobalAppointmentId}";
            }
    
            public static bool operator ==(AppointmentId x, AppointmentId y) => x.Equals(y);
            public static bool operator !=(AppointmentId x, AppointmentId y) => !(x == y);
        }
    

    这里我使用来自 NodaTime 的 LocalDate 来表示没有时间组件的原始日期。

    访问

    可以轻松访问全局约会 ID。如前所述,并非例外的事件的原始日期只是约会开始的日期部分。

    当您只有AppointmentItem 而没有来自RecurrencePatternException 对象时,例外情况会更加麻烦,因为原始日期不能直接获得。但是你可以通过PropertyAccessor获得它:

            public static LocalDate GetOriginalDate(this AppointmentItem appointment)
            {
                // The original date is stored in a property called ExceptionReplaceTime but this
                // property is not exposed in the OOM so we need to use PropertyAccessor
                // See: https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidexceptionreplacetime-canonical-property
                using (var props = appointment.PropertyAccessor.AsOwnedResource())
                {
                    var p = props.Resource.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82280040");
                    DateTime exceptionReplaceTime = (DateTime)p;
                    return props.Resource.UTCToLocalTime(exceptionReplaceTime).ToLocalDate();
                }
            }
    

    【讨论】:

      【解决方案2】:

      请记住,定期约会的实例实际上并不存在(想想没有结束日期的约会)。如果您有异常(作为附件存储在主约会上),它有 2 个 id - 主约会 id 和实例 id,它从主 id 派生并嵌入异常日期。

      查看与OutlookSpy 的约会(我是它的作者 - 单击 IMessage 按钮)并查看http://msdn.microsoft.com/en-us/library/ee157690(v=exchg.80).aspx 的约会 ID 格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多