2013-11-01 25 views
1

我需要一個小手把我的CFML cfexchange標記轉換爲EWS API。我使用的是CF 9.0.1,需要將郵件/日曆項目添加到託管Exchange服務器。CFML和Exchange - CFexchange標記已停止工作

我得到以下錯誤:

Error: 
Could not log in to the Exchange server. 
________________________________________ 
connection="exchangeConn" 
server="EXVMBX016-5.exch016.msoutlookonline.net" 
username="exch016\j_ttt" 
mailboxname="[email protected]" 
password="[removed]" 
Protocol="http" 
port="80" 
formbasedauthentication="TRUE" 
formbasedauthenticationURL="https://owa016.msoutlookonline.net/owa/auth/logon.aspx" 


我想出了下面的代碼爲止;

<cffunction name="EWSAddEvent" output="false" returntype="Boolean"> 
    <!--- EWS added by vjl 2013/10/31 ---> 
    <!--- 
     CFExchange in CF server 9 or older will not talk with Exchange 2010 at all, it is promissed to be fixed in CF 10. 
     As a solution you can use the EWS API. Read the stuff below. I hope my hint is helpfull to you. 
     ---------------------------------------------------------------------- ---------------------- 
     With Exchange 2007 Microsoft abandoned WebDav as an interface to Exchangeserver. 
     The standard Coldfusion Tags relied on WebDav and will not work anymore. 
     Since I needed a way to interface with Exchange Server a started looking for possible solutions and this is what i came up with. 
     In december 2010 Microsoft released the Exchange Managed Services Library for java. 
     You can find it here: http://archive.msdn.microsoft.com/ewsjavaapi/Release/ProjectReleases.a spx?ReleaseId=5691 
     In the getting started document it tells you it depends on 4 3rd party libraries which you need to be download separately: 
     - Apache Commons HttpClient 3.1 (commons-httpclient-3.1.jar) 
     - Apache Commons Codec 1.4 (commons-codec-1.4.jar) 
     - Apache Commons Logging 1.1.1 (commons-codec-1.4.jar) 
     - JCIFS 1.3.15 (jcifs-1.3.15.jar) 
     With Coldfusion 9.1 (the version I tested with) you only need 
     - JCIFS 1.3.15 (jcifs-1.3.15.jar) which you can download here: http://jcifs.samba.org/src/ 
     Place the EWS Jar and the JCIFS Jar in your Coldfusion libray folder and after restarting CF server the following code should work. 
     If you understand this you will be able to figure out your specific needs from the EWS API documentation. 
     ---> 
    <cfargument name="EmailAddress" type="String" required="True" /> 
    <cfargument name="EventName" type="String" /> 
    <cfargument name="EventStartDateTime" type="Date" /> 
    <cfargument name="EventEndDateTime" type="Date" /> 
    <cfargument name="EventSubject" type="String" /> 
    <cfargument name="EventDescription" type="String" /> 
    <cfargument name="EventLocation" type="String" Required="False" Default="" /> 
    <!--- <cfargument name="EventSensitivity" type="String" Required="False" Default="Normal" /> 
     <cfargument name="EventImportance" type="String" Required="False" Default="Normal" /> ---> 
    <cfargument name="EventReminder" type="String" Required="False" default=0 /> 
    <!--- <cfargument name="Organizer" type="String" Required="False" Default="" /> ---> 
    <cfargument name="OptionalAttendees" type="String" Required="False" Default="" /> 
    <cfargument name="leadID" type="numeric" required="no" default="0" /> 
    <cfargument name="serviceID" type="numeric" required="no" default="0" /> 
    <cfargument name="userID" type="numeric" required="no" default="0" /> 
    <cfargument name="companyID" type="numeric" required="no" default="0" /> 
    <cfargument name="serviceTypeID" type="numeric" required="no" default="0" /> 
    <cfmail to="[email protected]" from="[email protected]" subject="Exchange EWSAddEvent debug Arguments" type="html"><cfdump var="#Arguments#"></cfmail> 
    <!--- Build Mailbox ---> 
    <cfset UserName = Left(Arguments.EmailAddress,Find("@",Arguments.EmailAddress)-1) /> 
    <cfset Arguments.UserName = Application.Exchange.Domain & "\" & lcase(UserName) & Application.Exchange.MailboxPostFix /> 
    <cfset Arguments.Pword = Trim(FetchExchangePassword(Arguments.EmailAddress)) />   
    <!--- 1. I need an instance of the ExchangeService class ---> 
    <cfobject type="Java" class="microsoft.exchange.webservices.data.ExchangeService" name="service"> 
    <cfset service.init()> 
    <cfmail to="[email protected]" from="[email protected]" subject="Exchange EWSAddEvent debug service" type="html"><cfdump var="#service#"></cfmail> 
    <!--- 2. I need to set the credentials ---> 
    <!--- 2a. Create an instance of the WebCredentials class ---> 
    <cfobject type="Java" class="microsoft.exchange.webservices.data.WebCredentials" name="credentials"> 
    <!--- 2b. Set the credentials ---> 
    <cfset credentials.init("#arguments.UserName#","#Arguments.Pword#", "t.com")> 
    <!--- 2c. Set the credentials in the service object ---> 
    <cfset service.setCredentials(credentials) /> 
    <!--- 3. In need to set the URL to Exchange (stay away from autodsicovery) ---> 
    <!--- 3a. Create an instance of the Uri class ---> 
    <cfobject type="Java" class="java.net.URI" name="uri"> 
    <!--- 3b. Set the full path ---> 
    <cfset uri.init("https://mail.t.com/ews/Exchange.asmx")> 
    <!--- 3c. Set the url in the service object ---> 
    <cfset service.setUrl(uri) /> 
    <!--- These are the steps you need to create valid a service object. ---> 
    <!--- Now we need to do something with it. ---> 
    <!--- I create a test message to my own mailbox to see if it works ---> 
    <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")> 
    <cfset message.SetBody(messageBody)> 
    <cfset message.ToRecipients.Add("[email protected]") > 
    <cfmail to="[email protected]" from="[email protected]" subject="Exchange EWSAddEvent debug message" type="html"><cfdump var="#message#"></cfmail> 
    <cfoutput> 
     #message.SendAndSaveCopy()# 
    </cfoutput> 
    <cfreturn True /> 
</cffunction> 
+0

沒什麼。絕對沒有。 – user990016

+0

那是週末,我懷疑大多數與Exchange交易的人都是他們工作的一部分,因此,很少有人願意在週五/週六/週日觀看。我添加了一些應該提供更多可見性的標籤。 –

+0

此外,[這個問題](http://stackoverflow.com/questions/14652813/ews-api-and-coldfusion-how-to-reference-returned-values)似乎有工作代碼從CF連接到EWS - 也許給一個嘗試? –

回答

0

您是否使用EWS進行過任何操作?或者在嘗試發送郵件時遇到問題?如果EWS本身不能爲你工作,你可以嘗試下面的代碼片段(更改URL,用戶名和密碼)的代碼?

<cfscript> 
service = createObject("java", "microsoft.exchange.webservices.data.ExchangeService"); 
service.init(); 
serviceURI = createObject("java", "java.net.URI"); 
serviceURI.init("http://10.192.37.30/ews/Exchange.asmx"); 
service.setUrl(serviceURI); 
credentials = createObject("java", "microsoft.exchange.webservices.data.WebCredentials"); 
credentials.init("user", "password"); 
service.setCredentials(credentials); 
folderAPI = createObject("java", "microsoft.exchange.webservices.data.Folder"); 

folderName = createObject("java", "microsoft.exchange.webservices.data.WellKnownFolderName"); 

result = folderAPI.bind(service, folderName.Inbox); 
writeOutput(result.getDisplayName()); 

相應的Java代碼

ExchangeService service = new ExchangeService(); 
URI url = new URI("http://10.192.37.30/ews/Exchange.asmx"); 
service.setUrl(url); 
service.setCredentials(new WebCredentials("username", "password")); 
System.out.println("Created ExchangeService"); 
Folder folder = Folder.bind(service, WellKnownFolderName.Inbox); 
System.out.println(folder.getDisplayName()); 

如果一切正常,我們可以嘗試更復雜的操作。

請確保您使用的是正確的ASMX URL,用戶名和密碼。嘗試訪問瀏覽器中的網址。提供用戶名和密碼。如果你能夠看到WSDL,那就很好。

另外請確保您在Exchange Server中使用基本身份驗證。

謝謝, 保羅

+0

我一直在等待所有這一次讓我的服務器主機(LayeredTech)作出迴應。我無法從我的Web服務器上ping交換服務器。他們似乎無法找出導致連接失敗的原因和原因。我會盡快給您回覆。 – user990016

+0

我完全失去了這篇文章的軌道。我已經就同一主題開始了一篇新文章。 – user990016