我有一个有趣的难题,我希望至少有人能告诉我,如果我可能的解决方案实际上是可能的。
我有一个PHP站点,我正在创建一个页面来创建和跟踪交换日历约会及其通知的响应。
用户添加事件的所有相关信息并保存它,事件信息存储在数据库中,创建电子邮件并发送给收件人。我正在编写ics代码,因此当接收方收到它时,它看起来就像一个约会通知,就好像它是从交换客户端发送的一样。到目前为止,一切都是金色的。
但我们的想法是使用电子邮件,其唯一目的是跟踪这些回复和事件。然后,我将在单独的服务器上使用EWS设置一个服务,因为该站点位于LAMP服务器上,它将定期检查此地址上的事件响应,并使用响应更新mysql数据库,以便它们可以显示在事件的页面上。
问题是当我创建事件并从PHP发送电子邮件时,没有为主机地址创建事件,因此当收件人选择响应选项(接受,拒绝,暂定)时,主机什么也收不到,因为响应是对它没有的事件。
是否有办法通过PHP创建事件?
或者我可以在我已经拥有的服务中添加一个方法,该方法将在主机地址上创建事件并从PHP调用它?
正如您所写:参与者对发送的邀请的反应是无用的,因为约会(您的活动)的组织者没有关于此约会的任何信息。
你可以做的是在ExchangeServer的主机日历中添加一个关于用户用PHP网页创建的事件的约会。当您使用适当的保存方法保存约会时,邀请将自动发送,如果您订阅了主持人的日历文件夹事件(EWS订阅事件不是您的),并且您将定期检查它,您可以使用参与者的回复更新您的记录。
你可以这样创建约会:
Appointment app = new Appointment(_service);
app.Start = DateTime.Now.AddMinutes(30);
app.End = DateTime.Now.AddHours(2);
app.Subject = "Test appointment";
app.RequiredAttendees.Add("joe@example.com");
app.RequiredAttendees.Add("tom@example.com");
app.Save(WellKnownFolderName.Calendar, SendInvitationsMode.SendOnlyToAll);
和订阅日历文件夹:
var subscription = _service.SubscribeToPullNotifications(new FolderId[] { WellKnownFolderName.Calendar }, 5, null, EventType.Created, EventType.Deleted, EventType.Modified, EventType.FreeBusyChanged);
上面的代码创建了关于超时5分钟的日历事件的订阅(因此,如果您没有至少每5分钟检查一次,订阅将从服务器上删除),并且订阅将包含关于创建,修改,删除或其空闲/繁忙状态更改的项目的事件队列。
要查询事件的订阅,您可以这样做:
var events = subscription.GetEvents();
if (events.AllEvents.Count > 0)
{
foreach (var itemEvent in events.ItemEvents)
{
switch (itemEvent.EventType)
{
case EventType.Created:
break;
case EventType.Modified:
break;
case EventType.Copied:
break;
case EventType.FreeBusyChanged:
break;
}
}
}
当你得到你感兴趣的项目的事件类型时,你可以更新你的数据库