【问题标题】:Open Outlook 2013 New Appointment window at Client side with Microsoft.Office.Interop.Outlook C#使用 Microsoft.Office.Interop.Outlook C# 在客户端打开 Outlook 2013 新约会窗口
【发布时间】:2016-03-30 20:12:42
【问题描述】:

我正在尝试使用 ASP.Net c# 应用程序在客户端打开 Outlook 2013 新约会窗口。我的代码运行良好,它是一个简单的按钮。当我单击客户端计算机上的按钮时,此应用程序会在服务器/主机上打开 Outlook 窗口,但不在客户端计算机上。

我可以使用什么来使用 ASP.Net C# 在客户端计算机上打开 Outlook 约会窗口。

我正在使用以下代码:

    private void OpenOutlookAppt() {

     Microsoft.Office.Interop.Outlook.Application app = null;
     Microsoft.Office.Interop.Outlook.AppointmentItem appt = null;
     app = new Microsoft.Office.Interop.Outlook.Application();

     appt = (Microsoft.Office.Interop.Outlook.AppointmentItem)app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olAppointmentItem);

        appt.Subject = "Customer Review";
        appt.MeetingStatus = Outlook.OlMeetingStatus.olMeeting;
        appt.Location = "36/2021";
        appt.Start = Convert.ToDateTime("3/30/2016 01:30:00 PM");
        appt.End = Convert.ToDateTime("3/30/2016 02:30:00 PM");
        Outlook.Recipient recipRequired =
            appt.Recipients.Add("abc@domain.com");
        recipRequired.Type =
            (int)Outlook.OlMeetingRecipientType.olRequired;
        Outlook.Recipient recipOptional =
            appt.Recipients.Add("abc@domain.com");
        recipOptional.Type =
            (int)Outlook.OlMeetingRecipientType.olOptional;
        Outlook.Recipient recipConf =
           appt.Recipients.Add("Conf Room 36/2021 (14) AV");
        recipConf.Type =
            (int)Outlook.OlMeetingRecipientType.olResource;
        appt.Recipients.ResolveAll();
        appt.Display(true); }

谢谢

【问题讨论】:

    标签: c# asp.net .net outlook


    【解决方案1】:

    您的代码在 IIS 下的服务器上运行,因此您当然最终会在服务器计算机上使用 Outlook。并且 Outlook 不能用于服务(如 IIS)。

    您的选择是:

    1. 客户端 Java 脚本。仅限 IE。必须信任您的网站才能创建 COM 对象(“Outlook.Applicatuion”)。

    2. 在服务器上创建 iCal (ICS) 文件。当最终用户打开它时,保存它会在 Outlook 中创建一个约会。

    【讨论】:

      【解决方案2】:

      我认为实现这一点的最佳方法是在服务器上生成一个 ICS 文件供网络用户下载和打开。

      ICS 文件格式很简单:

      BEGIN:VCALENDAR
      VERSION:2.0
      BEGIN:VEVENT
      STATUS:TENTATIVE
      DTSTART:20160330T013000Z
      DTEND:20160330T023000Z
      SUMMARY;ENCODING=QUOTED-PRINTABLE:Customer Review
      LOCATION;ENCODING=QUOTED-PRINTABLE:Conf Room 36/2021  (14) AV 
      DESCRIPTION;ENCODING=QUOTED-PRINTABLE:Customer Review Meeting
      END:VEVENT
      END:VCALENDAR
      

      生成文件内容的代码:

      public class CalendarFile
      {
          private CfStatus _status = CfStatus.Busy;
          private string _location = "";
          private string _description = "";
      
          public CalendarFile(string title, DateTime startDate, DateTime endDate)
          {
              if (startDate > endDate)
                  throw new Exception("Attept to initialize a calendar event with start date after end date");
      
              Summary = title;
              StartDate = startDate;
              EndDate = endDate;
          }
      
          public enum CfStatus { Free, Busy, Tentative, OutOfTheOffice };
      
          override public string ToString()
          {
              var calEvent = new StringBuilder();
              calEvent.AppendLine("BEGIN:VCALENDAR");
              calEvent.AppendLine("VERSION:2.0");
              calEvent.AppendLine("BEGIN:VEVENT");
      
              switch (Status)
              {
                  case CfStatus.Busy:
                      calEvent.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:BUSY");
                      break;
                  case CfStatus.Free:
                      calEvent.AppendLine("TRANSP:TRANSPARENT");
                      break;
                  case CfStatus.Tentative:
                      calEvent.AppendLine("STATUS:TENTATIVE");
                      break;
                  case CfStatus.OutOfTheOffice:
                      calEvent.AppendLine("X-MICROSOFT-CDO-BUSYSTATUS:OOF");
                      break;
                  default:
                      throw new Exception("Invalid CFStatus");
              }
      
              if (AllDayEvent)
              {
                  calEvent.AppendLine("DTSTART;VALUE=DATE:" + ToCFDateOnlyString(StartDate));
                  calEvent.AppendLine("DTEND;;VALUE=DATE:" + ToCFDateOnlyString(EndDate));
              }
              else
              {
                  calEvent.AppendLine("DTSTART:" + ToCFString(StartDate));
                  calEvent.AppendLine("DTEND:" + ToCFString(EndDate));
              }
      
              calEvent.AppendLine("SUMMARY;ENCODING=QUOTED-PRINTABLE:" + ToOneLineString(Summary));
      
              if (Location != "") calEvent.AppendLine("LOCATION;ENCODING=QUOTED-PRINTABLE:" + ToOneLineString(Location));
              if (Description != "") calEvent.AppendLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" + ToCFString(Description));
      
              calEvent.AppendLine("END:VEVENT");
              calEvent.AppendLine("END:VCALENDAR");
      
              return calEvent.ToString();
          }
      
          public string Summary { get; set; }
      
          public DateTime StartDate { get; private set; }
      
          public DateTime EndDate { get; private set; }
      
          public string Location
          {
              get { return _location; }
              set { _location = value; }
          }
      
          public string Description
          {
              get { return _description; }
              set { _description = value; }
          }
      
          public bool AllDayEvent { get; set; }
      
          public CfStatus Status
          {
              get { return _status; }
              set { _status = value; }
          }
      
          private static string ToCFString(DateTime val)
          {
              //format: YYYYMMDDThhmmssZ where YYYY = year, MM = month, DD = date, T = start of time character, hh = hours, mm = minutes,
              //ss = seconds, Z = end of tag character. The entire tag uses Greenwich Mean Time (GMT)
              return val.ToUniversalTime().ToString("yyyyMMddThhmmssZ");
          }
      
          private static string ToCFDateOnlyString(DateTime val)
          {
              //format: YYYYMMDD where YYYY = year, MM = month, DD = date, T = start of time character, hh = hours, mm = minutes,
              //ss = seconds, Z = end of tag character. The entire tag uses Greenwich Mean Time (GMT)
              return val.ToUniversalTime().ToString("yyyyMMdd");
          }
      
          private static string ToCFString(string str)
          {
              return str.Replace("r", "=0D").Replace("n", "=0A");
          }
      
          private static string ToOneLineString(string str)
          {
              return str.Replace("r", " ").Replace("n", " ");
          }
      }
      

      ASP.NET WebForms 页面:

      public partial class Appointment : System.Web.UI.Page
      {
          protected void Page_Load(object sender, EventArgs e)
          {
              var calFile = new CalendarFile("My Event", new DateTime(2016,3, 30, 5),
                  new DateTime(2016,3, 30, 6));
              calFile.Location = "Conf Room 36/2021";
              calFile.Description = "Review meeting";
              calFile.Status = CalendarFile.CfStatus.Busy;
              calFile.allDayEvent = false;
              Response.AddHeader("content-disposition", "attachment; filename=PTO%20Request.ics");
              Response.ContentType = "text/x-vCalendar";
              Response.Write(calFile.ToString());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 2018-01-12
        • 2015-05-09
        • 2017-01-02
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        相关资源
        最近更新 更多