使用 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;
}
}
}
}
}
我还不能在这里显示任何代码,因为我还在分析是否有可能实现这一点。
在我们公司,我们有一个虚拟系统来制作和管理请假申请。我现在应该检查是否可以在申请人的 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;
}
}
}
}
}