簡體   English   中英

使用 Microsoft.Office.Interop.Outlook C# 在客戶端打開 Outlook 2013 新約會窗口

[英]Open Outlook 2013 New Appointment window at Client side with Microsoft.Office.Interop.Outlook C#

我正在嘗試使用 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)中使用。

您的選擇是:

  1. 客戶端 Java 腳本。 僅瀏覽器。 必須信任您的站點才能創建 COM 對象(“Outlook.Applictuion”)。

  2. 在服務器上創建 iCal (ICS) 文件。 當最終用戶打開它時,保存它會在 Outlook 中創建一個約會。

我認為實現這一目標的最佳方法是在服務器上生成一個 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());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM