PHP-EWS – 订阅/推送通知 – 完整示例
发布时间:2020-12-13 15:56:49 所属栏目:PHP教程 来源:网络整理
导读:经过两个令人沮丧的日子,我放弃了. 我有一个虚拟机器“admx”与Win2012R2 Exchange 2013(Trailversion)和 一个带有IIS-Webserver PHP的虚拟机器“webserver”. 制作新的订阅 – sub.php: ?PHPfunction __autoload($class_name){ // Start from the base pat
经过两个令人沮丧的日子,我放弃了.
我有一个虚拟机器“admx”与Win2012R2 Exchange 2013(Trailversion)和 一个带有IIS-Webserver PHP的虚拟机器“webserver”. 制作新的订阅 – sub.php: <?PHP function __autoload($class_name) { // Start from the base path and determine the location from the class name,$base_path = 'php-ews'; $include_file = $base_path . '/' . str_replace('_','/',$class_name) . '.php'; //$include_file = str_replace('_',$class_name) . '.php'; return (file_exists($include_file) ? require_once $include_file : false); } $server = "admx"; $host = $server; $username = "administrator@testdom.local"; $password = "secret123"; $version = "Exchange2013"; $url = "http://webserver/testexchange/log.php"; $keepAliveFrequency = 1; $ews = new ExchangeWebServices($server,$username,$password,$version); $subscribe_request = new EWSType_SubscribeType(); $pushSubscription = new EWSType_PushSubscriptionRequestType(); $pushSubscription->StatusFrequency = $keepAliveFrequency; $pushSubscription->URL = $url; $folderIDs = new EWSType_NonEmptyArrayOfBaseFolderIdsType(); $eventTypes = new EWSType_NonEmptyArrayOfNotificationEventTypesType(); $folderIDs->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType(); $folderIDs->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::INBOX; $eventTypes->EventType = "NewMailEvent"; $pushSubscription->FolderIds = $folderIDs; $pushSubscription->EventTypes = $eventTypes; $subscribe_request->PushSubscriptionRequest = $pushSubscription; $response = $ews->Subscribe($subscribe_request); var_dump($response); ?> 输出: object(stdClass)#10 (1) { ["ResponseMessages"]=> object(stdClass)#11 (1) { ["SubscribeResponseMessage"]=> object(stdClass)#12 (4) { ["ResponseCode"]=> string(7) "NoError" ["ResponseClass"]=> string(7) "Success" ["SubscriptionId"]=> string(64) "EgBhZG14LnRlc3Rkb20ubG9jYWwQAAAA3keYE/U5Mkacz2FAg6DfHKdXyqelf9II" ["Watermark"]=> string(40) "AQAAAF57K7d1ihJLl9odwZ02gVahGgAAAAAAAAA=" } } } 因此,订阅已成功注册. <?PHP echo "<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/exchange/services/2006/messages"> <SOAP-ENV:Body> <ns1:SendNotificationResult> <ns1:SubscriptionStatus>OK</ns1:SubscriptionStatus> </ns1:SendNotificationResult> </SOAP-ENV:Body> </SOAP-ENV:Envelope>"; file_put_contents("C:exlogonly_ok_".time().".txt",print_r($_REQUEST,1)); ?> 现在我得到了每一分钟(因为$keepAliveFrequency = 1;)来自Exchange-Server的新的respone / StatusCheck.当我发送电子邮件到administrator@testdom.local时,我也会立即收到新的通知(因为收件箱中的“NewMailEvent”). 但是在日志文件(only_ok_1435488594.txt)中只有…… Array() 更新log.php以获取通知信息: <?PHP class ewsService { public function SendNotification( $arg ) { file_put_contents("C:exloglogfile2_".time().".txt",print_r($arg,1)); $result = new EWSType_SendNotificationResultType(); $result->SubscriptionStatus = 'OK'; //$result->SubscriptionStatus = 'Unsubscribe'; return $result; } } $server = new SoapServer( 'php-ews/wsdl/NotificationService.wsdl',array( 'uri' => 'http://webserver/testexchange/log.php')); $server->setObject( $service = new ewsService() ); $server->handle(); ?> 现在日志文件的更多信息为“array()”: stdClass Object ( [ResponseMessages] => stdClass Object ( [SendNotificationResponseMessage] => stdClass Object ( [ResponseCode] => NoError [ResponseClass] => Success [Notification] => stdClass Object ( [SubscriptionId] => EgBhZG14LnRlc3Rkb20ubG9jYWwQAAAAvfY+2ehqCEOXroWYNAsn+mD+ZBQYf9II [PreviousWatermark] => AQAAAF57K7d1ihJLl9odwZ02gVZNGAAAAAAAAAA= [MoreEvents] => [StatusEvent] => stdClass Object ( [Watermark] => AQAAAF57K7d1ihJLl9odwZ02gVZNGAAAAAAAAAA= ) ) ) ) ) 问题: 我从GoogleSearch下载了NotificationService.wsdl. <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2007 Microsoft Corporation. All rights reserved. --> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://schemas.microsoft.com/exchange/services/2006/messages" schemaLocation="messages.xsd"/> </xs:schema> </wsdl:types> <wsdl:message name="SendNotificationSoapIn"> <wsdl:part name="request" element="tns:SendNotification" /> </wsdl:message> <wsdl:message name="SendNotificationSoapOut"> <wsdl:part name="SendNotificationResult" element="tns:SendNotificationResult" /> </wsdl:message> <wsdl:portType name="NotificationServicePortType"> <wsdl:operation name="SendNotification"> <wsdl:input message="tns:SendNotificationSoapIn" /> <wsdl:output message="tns:SendNotificationSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="NotificationServiceBinding" type="tns:NotificationServicePortType"> <wsdl:documentation> <wsi:Claim conformsTo="http://ws-i.org/profiles/basic/1.0" xmlns:wsi="http://ws-i.org/schemas/conformanceClaim/" /> </wsdl:documentation> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <wsdl:operation name="SendNotification"> <soap:operation soapAction="http://schemas.microsoft.com/exchange/services/2006/messages/SendNotification" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="NotificationServiceBinding12" type="tns:NotificationServicePortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <wsdl:operation name="SendNotification"> <soap12:operation soapAction="http://schemas.microsoft.com/exchange/services/2006/messages/SendNotification" /> <wsdl:input> <soap12:body use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="NotificationServices"> <wsdl:port name="NotificationServicePort" binding="tns:NotificationServiceBinding"> <soap:address location="" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 我也添加了这个,因为没有它我得到一个“绑定错误” <wsdl:service name="NotificationServices"> <wsdl:port name="NotificationServicePort" binding="tns:NotificationServiceBinding"> <soap:address location="" /> </wsdl:port> </wsdl:service> 我不是SOAP的专家……这里出了什么问题? 解决方法
这是一个工作和完整的例子:
https://github.com/jamesiarmes/php-ews/issues/280 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |