Exchange EWS Coldfusion - 需要将WebDav转换为EWS

时间:2014-03-21 18:11:39

标签: coldfusion exchangewebservices exchange-server-2007

我设法通过EWS连接到我的交换服务器并发送电子邮件。我需要一个如何创建日历项的示例。

Coldfusion 9 Exchange 2007

<cfobject type="Java" class="microsoft.exchange.webservices.data.ExchangeService" name="service">
<cfobject type="Java" class="microsoft.exchange.webservices.data.ExchangeVersion" name="version">
<cfset service.init(version.Exchange2007_SP1)>
<cfobject type="Java" class="microsoft.exchange.webservices.data.WebCredentials" name="credentials">
<cfset credentials.init("z@x.com","password")>
<cfset service.setCredentials(credentials) />
<cfobject type="Java" class="java.net.URI" name="uri">
<cfset uri.init("server URL")>
<cfset service.setUrl(uri) />
<cfobject type="Java" action="create" class="microsoft.exchange.webservices.data.EmailMessage" name="message">
<cfset message = message.init(service) />
<cfset message.SetSubject("EWSTest")>
<cfset messageBody = CreateObject("java", "microsoft.exchange.webservices.data.MessageBody")>
<cfset messageBody.init("My EWS test message again")>
<cfset message.SetBody( messageBody )>
<cfset message.ToRecipients.Add("email@gmail.com") >
<cfset message.SendAndSaveCopy() >

我尝试了以下代码,但只得到一个错误,只说#34;主题&#34 ;;

<cfobject type="Java" class="microsoft.exchange.webservices.data.ExchangeService" name="appointment">
<cfset appointment.Subject = "Dentist Appointment">
<cfset appointment.Body = "The appointment is with Dr. Smith.">
<cfset appointment.Start = createDateTime(Year('2014/03/22'), Month('2014/03/22'), 
 Day('2014/03/22'), Hour('09:00'), Minute('09:00'), 0)>
<cfset appointment.End = createDateTime(Year('2014/03/22'), Month('2014/03/22'), 
 Day('2014/03/22'), Hour('09:00'), Minute('09:00'), 0)>
<cfset appointment.Save(SendInvitationsMode.SendToNone)>

(编辑) - 当前代码:

    <cfset StartDateTime = createDateTime(Year('2014/03/22'), Month('2014/03/22'), Day('2014/03/22'), Hour('09:00'), Minute('09:00'), 0)>
<cfset EndDateTime = createDateTime(Year('2014/03/22'), Month('2014/03/22'), Day('2014/03/22'), Hour('09:30'), Minute('09:30'), 0)>
<cfscript>
    exchangeService = createObject("java", "microsoft.exchange.webservices.data.ExchangeService");
    exchangeVersion = createObject("java", "microsoft.exchange.webservices.data.ExchangeVersion");
    service = exchangeService.init(exchangeVersion.Exchange2007_SP1);
    webCredentials = createObject("java", "microsoft.exchange.webservices.data.WebCredentials");
    service.setCredentials(webCredentials.init("z@x.com","password"));
    serviceURI = createObject("java", "java.net.URI").init("https://owa016.msoutlookonline.net/EWS/Exchange.asmx?wsdl"));
    service.setUrl(serviceURI);
    appointment = createObject("java", "microsoft.exchange.webservices.data.Appointment").init(service);
    appointment.Start = "#StartDateTime#";
appointment.End = "#EndDateTime#";
    appointment.Subject = "Dentist Appointment";
    appointment.Body = "The appointment is with Dr. Smith.";
    appointment.Save(SendInvitationsMode.SendToNone);
</cfscript> 

(编辑2) - 部分解决方案;

<cfset StartDateTime = createDateTime(Year('2014/03/22'), Month('2014/03/22'), Day('2014/03/22'), Hour('09:00'), Minute('09:00'), 0)>
<cfset EndDateTime = createDateTime(Year('2014/03/22'), Month('2014/03/22'), Day('2014/03/22'), Hour('09:30'), Minute('09:30'), 0)>
<!--- <cfoutput>Start=#StartDateTime#<br>End=#EndDateTime#</cfoutput><cfabort> --->
<cfscript>
    exchangeService = createObject("java", "microsoft.exchange.webservices.data.ExchangeService");
    exchangeVersion = createObject("java", "microsoft.exchange.webservices.data.ExchangeVersion");
    service = exchangeService.init(exchangeVersion.Exchange2007_SP1);
    webCredentials = createObject("java", "microsoft.exchange.webservices.data.WebCredentials");
    service.setCredentials(webCredentials.init("z@x.com","password"));
    serviceURI = createObject("java", "java.net.URI").init("https://owa016.msoutlookonline.net/EWS/Exchange.asmx?wsdl");
    service.setUrl(serviceURI);
    appointment = createObject("java", "microsoft.exchange.webservices.data.Appointment").init(service);
    appointment.setStartTimeZone(microsoft.exchange.webservices.data.TimeZoneDefinition)
    appointment.setStart("#StartDateTime#");
    appointment.setEnd("#EndDateTime#");
    appointment.setSubject("Dentist Appointment");
    MessageBody = createObject("java", "microsoft.exchange.webservices.data.MessageBody");
    appointment.setBody( MessageBody.init("The appointment is with Dr. Smith.") );
    SendInvitationsMode = createObject("java", "microsoft.exchange.webservices.data.SendInvitationsMode");
    appointment.Save(SendInvitationsMode.SendToNone);
</cfscript> 

这是我得到的错误; 设置Start,End,IsAllDayEvent或Recurrence属性时需要StartTimeZone。在尝试更新约会之前,您必须加载或分配此属性。

这听起来像Exchange 2010和我在Exchange 2007上。

1 个答案:

答案 0 :(得分:1)

(评论太长了......)

虽然不是一个完整的答案,但有一些关于代码的观察:

  • 使用java对象时,真正的错误通常包含在堆栈跟踪中,而不是错误标头中。始终检查堆栈跟踪。在这种情况下,它会报告

    java.lang.NoSuchFieldException: SUBJECT  at coldfusion.runtime.StructBean.bindName(StructBean.java:243)


  • 出现该错误的最可能原因是您使用的是错误类型的对象。您尝试设置的属性在ExchangeService类中不存在。我相信您需要创建一个Appointment对象的实例,它具有subject,startdate和etcetera属性。与此C# example中显示的内容类似。

    (旁注,我个人更喜欢cfscript for java code,因为语法非常相似。使用原始示例作为基础,这些内容如下:)

    exchangeService = createObject("java", "microsoft.exchange.webservices.data.ExchangeService");
    exchangeVersion = createObject("java", "microsoft.exchange.webservices.data.ExchangeVersion");
    service = exchangeService.init(exchangeVersion.Exchange2007_SP1);
    
    webCredentials = createObject("java", "microsoft.exchange.webservices.data.WebCredentials");
    service.setCredentials(webCredentials.init("z@x.com","password") );
    
    serviceURI = createObject("java", "java.net.URI").init("server URL");
    service.setUrl(serviceURI);
    
    appointment = createObject("java", "microsoft.exchange.webservices.data.Appointment").init(service);
    // ... set subject, date, etcetera properties 
    



  • 如果您使用C#示例作为基础,请记住语法并不总是完全转换。理论上,CF支持使用以下语法直接分配属性,但仅限于"[the] class conforms to the JavaBeans pattern."

    <cfset appointment.Subject = "Dentist Appointment">

    EWS类可能不是这种情况。您可能需要明确调用这些方法:

    <cfset appointment.setSubject("Dentist Appointment")>

  • "Body" property不是简单的字符串。您需要创建microsoft.exchange.webservices.data.MessageBody的实例。

  • SendInvitationsMode也是一个类。您需要先创建它的实例,然后才能在此处使用其属性:

    appointment.Save(SendInvitationsMode.SendToNone);