使用 ActiveX 技术从 Web 应用程序自动执行 Outlook 是一种标准做法吗?这与 Telerik 的 RadScheduler + Telik 的 Exchange Provider 这样的 Web 调度程序相比如何从 Web 应用程序本身安排约会?
谢谢,
森希尔
使用 ActiveX 技术从 Web 应用程序自动执行 Outlook 是一种标准做法吗?这与 Telerik 的 RadScheduler + Telik 的 Exchange Provider 这样的 Web 调度程序相比如何从 Web 应用程序本身安排约会?
谢谢,
森希尔
您将需要提供有关您要完成的工作的更多详细信息,而不仅仅是在 Web 应用程序中说明 Outlook 的自动化。我这么说的原因是因为它真的取决于你想要做什么。如果您要做的只是创建约会,那么不,您不需要activex。
这是您可以研究或调查的内容。立即进入 Outlook,创建约会。然后转到文件菜单并执行“另存为”并将约会保存到您的桌面上。您会注意到该文件存储为 .ics 文件。您实际上可以在记事本或 word 中打开此文件并查看其内容。
例如,这里是它在记事本中的样例:
开始:VCALENDAR 产品:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN 版本:2.0 方法:发布 X-MS-OLK-FORCEINSPECTOROPEN:真 开始:事件 类别:公共 创建:20091028T125325Z 描述:测试\n DTEND:20091028T133000Z DTSTAMP:20091028T125325Z DTSTART:20091028T130000Z 最后修改:20091028T125325Z 优先级:5 序列:0 摘要;LANGUAGE=en-us:test 传输:不透明 UID:040000008200E00074C5B7101A82E008000000005062431CAC57CA01000000000000000 0100000003E756880D89B504BBA9FF0FDC7D16F43 X-ALT-DESC;FMTTYPE=文本/html:\n\n\n\n\n\n\n\n\n测试\n\n\n X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-重要性:1 X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MS-OLK-ALLOWEXTERNCHECK:TRUE X-MS-OLK-CONFTYPE:0 开始:VALARM 触发器:-PT15M 动作:显示 描述:提醒 结束:VALARM 结束:事件 结束:VCALENDAR
所以现在想一想,你可以使用 asp.net / asp 来生成约会,因为你可以访问一个 StreamWriter 和一个内存流。这究竟是什么意思,这意味着您可以像这样生成一个文本文件,并猜测如果您生成这样一个文本文件,那么您刚刚创建了一个约会。这是我为日历项目编写的示例,我编写了一个工具来跟踪我工作的公司的假期/休假请求。经理想要的功能之一是将员工请求添加到经理日历的方法。由于经理们总是在 Outlook 内部,他们想快速浏览一下 Outlook 日历,看看谁在办公室,谁不在办公室。当然,他们可以手动创建 Outlook 日历项目,但过多的手动工作并不理想。
所以我使用了一个 StreamWriter 和一个内存流来生成一个 Outlook 日历项。
这是一个例子:
<%@ Page Language="vb" ContentType="text/html" ResponseEncoding="iso-8859-1" Debug="True" trace="False"%>
<%@ import Namespace="System.IO" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title></head>
<body>
<script runat="server">
Sub Page_Load(Sender As Object, E As EventArgs)
'PARAMETERS
Dim beginDate as Date
Dim endDate as Date
Dim VType as String = Request.QueryString("vtype")
Dim h As Double = Request.QueryString("hours")
If h = 8 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 4:00 PM"
ElseIf h = 4 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 12:00 PM"
ElseIf h = 1 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 8:00 AM"
ElseIf h = 2 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 9:00 AM"
ElseIf h = 3 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 10:00 AM"
ElseIf h = 5 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 12:00 PM"
ElseIf h = 6 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 1:00 PM"
ElseIf h = 7 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 2:00 PM"
ElseIf h = 9 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 5:00 PM"
ElseIf h = 10 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 6:00 PM"
ElseIf h = 11 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 7:00 PM"
ElseIf h = 12 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 8:00 PM"
ElseIf h = 13 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 9:00 PM"
ElseIf h = 14 Then
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 10:00 PM"
Else
beginDate = Request.QueryString("vdate") & " 7:00 AM"
endDate = Request.QueryString("vdate") & " 12:00 AM"
End If
Dim myLocation as String = Request.QueryString("location")
Dim mySubject as String = Request.QueryString("subject")
Dim myDescription as String = Request.QueryString("Description")
'INITIALIZATION
Dim mStream As new MemoryStream()
Dim writer As new StreamWriter(mStream)
writer.AutoFlush = true
'HEADER
writer.WriteLine("BEGIN:VCALENDAR")
writer.WriteLine("PRODID:-//Flo Inc.//FloSoft//EN")
writer.WriteLine("BEGIN:VEVENT")
'BODY
writer.WriteLine("DTSTART:" & beginDate.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z") )
writer.WriteLine("DTEND:" & endDate.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z") )
writer.WriteLine("LOCATION:" & myLocation)
writer.WriteLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" & myDescription)
writer.WriteLine("SUMMARY:" & mySubject)
writer.WriteLine("X-MICROSOFT-CDO-BUSYSTATUS:FREE")
'FOOTER
writer.WriteLine("PRIORITY:5")
writer.WriteLine("END:VEVENT")
writer.WriteLine("END:VCALENDAR")
'MAKE IT DOWNLOADABLE
Response.Clear() 'clears the current output content from the buffer
Response.AppendHeader("Content-Disposition", "attachment; filename=Add2Calendar.vcs")
Response.AppendHeader("Content-Length", mStream.Length.ToString())
Response.ContentType = "application/download"
Response.BinaryWrite(mStream.ToArray())
Response.End()
End Sub
</script>
</body>
</html>
有一些方法可以让您从 asp.net 应用程序自动化 MS Office,但这样做需要您自担风险。如果我没记错的话,您很可能需要使用模拟来使 dcom 正常运行,这样做可能会在您的 Web 应用程序中留下一个很大的安全漏洞。
我建议使用Open Office XML,因为 MS 不推荐也不支持从 Web 应用程序中自动化 Office。