我设法通过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上。
答案 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);