将ASP.NET Intranet应用程序与Outlook日历集成的技术

时间:2010-12-01 20:34:54

标签: .net asp.net outlook exchange-server ews-managed-api

我可以不再忽视用户的操作。他们想要一个任务调度系统,在某些时候我必须提供。我正在考虑制作自己的(不能很难),但是用户会有两个并排的任务管理系统,因为他们已经使用Outlook进行同样的事情。

就Outlook日历/任务集成而言,我发现了两种可能的方法:

1)使用JavaScript和自动化

我似乎记得可以在JavaScript中进行自动化。

PROS:

  • 我之前做过自动化。

CONS:

  • 自动化很可怕!
  • 一些持久性(Outlook 实体)是责任 客户端代码,其余的 服务器端的责任 码。这感觉太可怕了。
  • 可能的安全问题/
    阻止IT部门。

2)使用某些.NET API直接与Exchange Server交互

Intranet使用单点登录,因此希望这会使安全问题更容易。

PROS:

  • 所有持久性代码都是 服务器端。

CONS:

  • 我甚至不知道这样的API 存在。

与往常一样,我喜欢站在巨人的肩膀上。任何曾经走过这条道路的人都可以给我一些指导吗?

2 个答案:

答案 0 :(得分:7)

我们最近使用Exchange Web Services Managed API为我们的Intranet应用程序进行了同样的集成。这将成为第二种选择的一种方式。我从来没有尝试使用JavaScript,所以不知道。

关于评论1的查询:您需要一个AD用户,您将用它来模拟和使用其他用户帐户。请参考以下示例:

假设我有一个名为fabrikam\myappname的Active Dir帐户,密码为Fabi$Gre@t2010

void CreateFolder(string targetUserEmail) {
    string appName = "myappname";
    string appPassword = "Fabi$Gre@t2010";
    string emailDomain = "fabrikam";
    string appEmail = string.Format("{0}@{1}.com", appName, emailDomain);

    ExchangeService service = new ExchangeService();
    service.Credentials = new NetworkCredential(appName, appPassword, emailDomain);
    service.AutodiscoverUrl(appEmail);

    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, targetUserEmail);

    Folder newFolder = new Folder(service);
    newFolder.DisplayName = "TestFolder1";

    newFolder.Save(WellKnownFolderName.Inbox);
}

请查看文章Configuring Exchange Impersonation以使模拟正常运行。

希望有所帮助。

答案 1 :(得分:0)

如果由于某种原因您不想启用模拟(因为它是全局的),您还可以让每个用户与运行应用程序的配置文件(CodeCanvas示例中的appName)共享其日历。一旦他们给出了相应的许可(读/写/编辑),您就可以将约会添加到他们的日历中,如下所示:

myappointment = new Appointment(service);
myappointment.Subject = "subject";
myappointment.Body = "body";
myappointment.Start = myStartTime;
myappointment.End = myStartTime.AddHours(1);
myMailbox = new Mailbox("username@domain.com");
myFolder = new FolderId(WellKnownFolderName.Calendar, myMailbox);
myappointment.Save(myFolder, SendInvitationsMode.SendToNone);
/* get the appointment id so your app can access it later to update or delete */ 
myexchangeid = myappointment.Id.UniqueId;