我正在尝试使用ASP.Net c#application在客户端打开Outlook 2013 New Appointment窗口。我的代码工作正常,它只是一个简单的按钮。当我从客户端计算机上单击该按钮时,此应用程序将在服务器/主机上打开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); }
由于
答案 0 :(得分:1)
您的代码在IIS下的服务器上运行,因此您最终在服务器计算机上使用Outlook。并且Outlook不能在服务(例如IIS)中使用。
您的选择是:
客户端Java脚本。仅限IE。必须信任您的站点才能创建COM对象(" Outlook.Applicatuion")。
在服务器上创建iCal(ICS)文件。当最终用户打开它时,保存它将在Outlook中创建约会。
答案 1 :(得分:0)
我认为实现这一目标的最佳方法是在服务器上生成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());
}
}