C# 使用Microsoft.Office.Interop.Outlook C在客户端打开Outlook 2013新约会窗口#

C# 使用Microsoft.Office.Interop.Outlook C在客户端打开Outlook 2013新约会窗口#,c#,asp.net,.net,outlook,C#,Asp.net,.net,Outlook,我正在尝试使用ASP.Net c#应用程序在客户端打开Outlook 2013新约会窗口。我的代码运行良好,只是一个简单的按钮。当我单击客户端计算机上的按钮时,此应用程序会在服务器/主机上打开outlook窗口,但不会在客户端计算机上打开 如何使用ASP.Net C#在客户端计算机上打开Outlook约会窗口 我正在使用以下代码: private void OpenOutlookAppt() { Microsoft.Office.Interop.Outlook.Applica

我正在尝试使用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); }

谢谢

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

你的选择是:

  • 客户端Java脚本。我只知道。必须信任您的站点才能创建COM对象(“Outlook.application”)

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


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

    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());
        }
    }