【问题标题】:Outlook Automation from a web application to create appointments来自 Web 应用程序的 Outlook 自动化以创建约会
【发布时间】:2009-10-28 12:50:55
【问题描述】:

使用 ActiveX 技术从 Web 应用程序自动执行 Outlook 是一种标准做法吗?这与 Telerik 的 RadScheduler + Telik 的 Exchange Provider 这样的 Web 调度程序相比如何从 Web 应用程序本身安排约会?

谢谢,
森迪尔

【问题讨论】:

  • 我不相信在这个领域有任何广泛的“标准”实践。这类事情的标准往往更本地化,即对您的企业而言。我会说后者会更好,因为最好避免在您的服务器上运行客户端应用程序,例如 Outlook。
  • 感谢拉撒路的输入。很抱歉我没有提供更多背景信息。我们的申请是合法的。当用户单击新约会(与案例相关)时,在案例屏幕的 Web 应用程序中:我们在客户端机器上自动化 Outlook(使用 activex 控件连接到正在运行的 Outlook 实例弹出约会预填充了用户可以编辑的数据和保存)创建一个新约会。

标签: asp.net automation scheduling outlook-2007 appointment


【解决方案1】:

您需要提供有关您要完成的任务的更多详细信息,而不仅仅是在 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>

【讨论】:

  • 感谢乔恩的输入。我们的申请是合法的。在案例屏幕的 Web 应用程序中,当用户单击新约会(与案例相关)时,我们会在客户端计算机上自动执行 Outlook 以创建新约会。
【解决方案2】:

您可以通过一些方法从 asp.net 应用程序自动化 MS Office,但这样做需要您自担风险。如果我没记错的话,您很可能需要使用模拟来使 dcom 正常运行,这样做可能会在您的 Web 应用程序中留下一个很大的安全漏洞。

我建议使用 Open Office XML,因为 MS 不推荐也不支持从 Web 应用程序中自动化 Office。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2010-11-21
    • 1970-01-01
    • 2017-06-08
    • 2014-07-12
    • 2010-10-08
    • 2016-04-04
    • 2012-01-17
    相关资源
    最近更新 更多