使用 C# 和 Exchange 2019 在员工的 Outlook 日历中创建约会

Create appointments in Outlook calenders of employees using C# and Exchange 2019

我还不能在这里显示任何代码,因为我还在分析是否有可能实现这一点。

在我们公司,我们有一个虚拟系统来制作和管理请假申请。我现在应该检查是否可以在申请人的 Outlook 日历中输入批准的假期。

我需要一个中央解决方案来远程访问日历并输入约会。我们目前使用 Mircosoft Exchange 2019 和 Office 365 的本地解决方案。

在我的研究过程中,我遇到了 EWS,但 Exchange 2019 似乎不再支持它。我可以使用另一种解决方案吗?基本上我想用 C# 实现一个解决方案,但我也可以实现一个 Powershell 或 Java 解决方案。但大多数时候我没有找到真正的解决方案。

大多数情况下,这些示例始终位于计算机本地或使用较旧的 Exchange Server(如 2013)。我还没有找到 2019 年的可靠信息。我希望这里有人可以帮助我或给我提示。或者如果不可能的话,说一下也会有帮助。

此致!


我目前正在研究解决方案。成功后我会post代码!**

Exchange 2019 完全支持 EWS。

EWS 仍然是 API 访问 Exchange 的首选,即使 Microsoft 没有向其添加任何新功能。

在客户端,您可以使用 Outlook 对象模型及其 Namespace.GetSharedDefaultFolder 方法。拥有 MAPIFolder 对象的实例后,您可以使用 MAPIFolder.Items.Add 创建新约会。

我确实选择了一些不同的方法,但我能够让它充分发挥作用。我现在可以创建事件并在需要时删除它们。

    public void UpdateCalender()
    {
        ExchangeService Service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
        Uri Url = new Uri("https://localmaildomain.sys/EWS/Exchange.asmx");
        Service.Url =  Url;
        Service.Credentials = new NetworkCredential("service_user","service_password");

        Folder inboxFolder = Folder.Bind(Service, new FolderId(WellKnownFolderName.Calendar, Temp.UserMail));

        foreach (var entry in Temp.Positions)
        {
            if (!entry.Storno)
            {
                try
                {
                    Appointment appointment = new Appointment(Service);
                    appointment.Subject = $"Urlaub/Vacation ({entry.Type})";
                    appointment.Body = $"{entry.Comment}";
                    appointment.IsAllDayEvent = true;
                    appointment.Start = entry.Date.AddSeconds(1);
                    appointment.End = entry.Date.AddSeconds(1);
                    appointment.LegacyFreeBusyStatus = LegacyFreeBusyStatus.OOF;
                    appointment.Save(inboxFolder.Id, SendInvitationsMode.SendToNone);
                }
                catch (Exception Ex)
                {
                    Console.WriteLine($"Calender item could not be created! Exception: {Ex.ToString()}");
                }
            }
            else
            {
                CalendarView view = new CalendarView(entry.Date, entry.Date);
                FindItemsResults<Appointment> results = Service.FindAppointments(inboxFolder.Id,view);

                foreach (var appointment in results)
                {
                    if (appointment.Subject == $"Urlaub/Vacation ({entry.Type})" && appointment.Start == entry.Date)
                    {
                        try
                        {
                            appointment.Delete(DeleteMode.MoveToDeletedItems);
                        }
                        catch(Exception Ex)
                        {
                            Console.WriteLine($"Calender item could not be deleted! Exception: {Ex.ToString()}");
                        }
                        break;
                    }
                }
            }
        }
    }