Giter Club home page Giter Club logo

php-ews's Introduction

PHP Exchange Web Services

The PHP Exchange Web Services library (php-ews) is intended to make communication with Microsoft Exchange servers using Exchange Web Services easier. It handles the NTLM authentication required to use the SOAP services and provides an object-oriented interface to the complex types required to form a request.

Scrutinizer Total Downloads

Dependencies

  • Composer
  • PHP 5.4 or greater
  • cURL with NTLM support (7.30.0+ recommended)
  • Exchange 2007 or later

Note: Not all operations or request elements are supported on all versions of Exchange.

Installation

The prefered installation method is via Composer, which will automatically handle autoloading of classes.

{
    "require": {
        "php-ews/php-ews": "~1.0"
    }
}

Usage

The library can be used to make several different request types. In order to make a request, you need to instantiate a new \jamesiarmes\PhpEws\Client object:

use \jamesiarmes\PhpEws\Client;

$ews = new Client($server, $username, $password, $version);

The Client class takes four parameters for its constructor:

  • $server: The url to the exchange server you wish to connect to, without the protocol. Example: mail.example.com. If you have trouble determining the correct url, you could try using autodiscovery.
  • $username: The user to connect to the server with. This is usually the local portion of the users email address. Example: "user" if the email address is "[email protected]".
  • $password: The user's plain-text password.
  • $version (optional): The version of the Exchange sever to connect to. Valid values can be found at \jamesiarmes\PhpEws\Client::VERSION_*. Defaults to Exchange 2007.

Once you have your \jamesiarmes\PhpEws\Client object, you need to build your request object. The type of object depends on the operation you are calling. If you are using an IDE with code completion it should be able to help you determine the correct classes to use using the provided docblocks.

The request objects are build similar to the XML body of the request. See the resources section below for more information on building the requests.

Examples

There are a number of examples included in the examples directory. These examples are meant to be run from the command line. In each, you will need to set the connection information variables to match those of your Exchange server. For some of them, you will also need to set ids or additional data that will be used in the request.

Resources

Support

All questions should use the issue queue. This allows the community to contribute to and benefit from questions or issues you may have. Any support requests received via email will be directed here.

php-ews's People

Contributors

b16-1dea avatar barryvdh avatar cby016 avatar daareiza avatar funnyleone avatar jamesiarmes avatar koab avatar luthordevelopment avatar nvanheuverzwijn avatar scrutinizer-auto-fixer avatar senasi avatar tap52384 avatar thijzert avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

php-ews's Issues

Use impersonnal account for create Calendar Event

Hello,
I want to ask your help to change this code in order to create calendar events to other users using an account Impersonal Exchange.

CalendarEventDetails = $event_details; $event->Start = '2012-06-18T09:00:00+02:00'; $event->End = '2012-06-18T18:00:00+02:00'; $event->Subject = "Subject"; $event->Location = "Location"; $event->BusyType = "Busy"; $request->Items->CalendarItem[] = $event; $request->SendMeetingInvitations = EWSType_CalendarItemCreateOrDeleteOperationType::SEND_TO_NONE; $response = $ews->CreateItem($request); Lucius.Oracle

Creating new calendar event

Hi James. Need your help again.

EWS accepts this request with 'Success', but creates some bogus calendar event. The subject and location are missing and time is always the same (in my case it's 6pm and time zone is UTC+0)

<?php
$host = '';
$user = '';
$pass = '';
$version = ExchangeWebServices::VERSION_2007_SP1;

$ews = new ExchangeWebServices($host, $user, $pass, $version);

$request = new EWSType_CreateItemType();

$event_details = new EWSType_CalendarEventDetails();
$event_details->Subject = "Subject";
$event_details->Location = "Location";
/*
$event_details->IsMeeting = false;
$event_details->IsRemiderSet = false;
$event_details->IsPrivate = false;
$event_details->IsException = false;
$event_details->IsRecurring = false; 
*/

$event = new EWSType_CalendarEvent();
$event->CalendarEventDetails = $event_details;

$event->StartTime = date('c', time()+3600);
$event->EndTime = date('c', time()+7200);
$event->BusyType = "Busy";

$request->Items->CalendarItem[] = $event;
$request->SendMeetingInvitations = EWSType_CalendarItemCreateOrDeleteOperationType::SEND_TO_NONE;

$response = $ews->CreateItem($request);
echo '<pre>'.print_r($response, true).'</pre>';

script dying on FindItem();

so I have implemented the library using examples provided (code here: http://pastebin.com/vbKSiNi0 )

it was working fine previously, but now is dying without any errors being generated.

When trying to execute the script, it dies drectly after the line $response = $ews->FindItem($request); without any output at all. No errors are generated server side.

I have confirmed the username / passowrd I am using are correct, as I can successfully log into the host at https://#host#/owa (Username is in the #domain# \ #username# format)

Looking at a similar issue posted here, running the following command
curl https://webmail.clintonct.org/EWS/Exchange.asmx -w %{http_code} --ntlm -u "*****":"*****" -k
results in a 401. Does this mean that I need to have the Exchange Server opened so that that file is publicly accessible?

Updating calendar items

Are there any examples on updating a calendar item? I am trying to upgrade a calendar item but it isn't working. This is the code I'm using:

    $ews = new ExchangeWebServices($host, $username, $password);

$request = new EWSType_UpdateItemType();
$request->ConflictResolution = 'AlwaysOverwrite';
$request->SendMeetingInvitationsOrCancellations = 'SendOnlyToAll';
$request->ItemChanges = array();

$change = new EWSType_ItemChangeType();
$change->ItemId = new EWSType_ItemIdType();
$change->ItemId->Id = $contact_id;
$change->ItemId->ChangeKey = $change_key;


$change->Updates->SetItemField->CalendarItem->Location = 'new subject';

$request->ItemChanges[] = $change;

$response = $ews->UpdateItem($request);

Thanks

Wrong variable used in GetUserAvailability() and GetUserOofSettings() in ExchangeWebServices.php

In ExchangeWebServices.php, calls to GetUserAvailability() and GetUserOofSettings() fail because the method GetUserAvailability() accepts a request parameter named $GetUserAvailabilityRequest but inside it uses the $request variable when sending the SOAP request and similarly, the method GetUserOofSettings() accepts $GetUserOofSettingsRequest as the request parameter but internally uses $request.

Missing authentication type for impersonation

Hi I got Office 365 working with impersonation (sending emails and creating calendar events)

I used example https://github.com/jamesiarmes/php-ews/wiki/Impersonation
and I used following setup to init:

$ews = new ExchangeWebServices
(
   $server, $username, $password, ExchangeWebServices::VERSION_2010_SP2
);

I had to make one change to NTLMSoapClient.php: I added CURLAUTH_BASIC:

curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC | CURLAUTH_NTLM);

br, Marko

BasePoint missing on CalendarView, but Basepoint is set

Hi,

with following code:

<?php
error_reporting(E_ALL ^ E_NOTICE);
ini_set('display_errors','On');

include 'NTLMStream.php';
include 'NTLMSoapClient.php';
include 'NTLMSoapClient/Exchange.php';

include 'EWS_Exception.php';
include 'EWSType.php';
include 'ExchangeWebServices.php';

$host = "******";
$username = "philipp";
$password = "********";

$ews = new ExchangeWebServices($host, $username, $password);


// start building the find folder request
$request = new EWSType_FindItemType();

$request->Traversal = EWSType_FolderQueryTraversalType::SHALLOW;

$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape =
        EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;

// configure the view
$request->CalendarView = new EWSType_CalendarViewType();
$request->CalendarView->BasePoint = 'Beginning';
$request->CalendarView->Offset = 0;

$request->CalendarView->StartDate = date('c', strtotime('01/01/2010 -00'));
$request->CalendarView->EndDate = date('c', strtotime('01/31/2011 -00'));


// set the starting folder as the inbox
$request->ParentFolderIds = new EWSType_NonEmptyArrayOfBaseFolderIdsType();
$request->ParentFolderIds->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->ParentFolderIds->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;

// make the actual call
$response = $ews->FindItem($request);
echo '<pre>'.print_r($response, true).'</pre>';
?>

i get the following error:

Fatal error: Uncaught SoapFault exception: [a:ErrorSchemaValidation] The request failed schema validation: The required attribute 'BasePoint' is missing. in /var/www/vhosts/star-cut.de/httpdocs/app/ExchangeWebServices.php:327 Stack trace: #0 [internal function]: SoapClient->__call('FindItem', Array) #1 /var/www/vhosts/star-cut.de/httpdocs/app/ExchangeWebServices.php(327): NTLMSoapClient_Exchange->FindItem(Object(EWSType_FindItemType)) #2 /var/www/vhosts/star-cut.de/httpdocs/app/get_calendar.php(50): ExchangeWebServices->FindItem(Object(EWSType_FindItemType)) #3 {main} thrown in /var/www/vhosts/star-cut.de/httpdocs/app/ExchangeWebServices.php on line 327

if i change from CalendarViewType to IndexedPageViewType i get all the elements from the calendar, so i think the error is not with setting the BasePoint, i think it is not set witch IndexedPageViewType

hope you can help

greetz

Originally posted by mr.schickfick on Google Code: http://code.google.com/p/php-ews/issues/detail?id=13

Naming of classes and autoloader interoperability

It would be nice if all classes could be autoloaded according to the proposal for autoloader interoperability from the PHP standards working group: http://groups.google.com/group/php-standards/web/psr-0-final-proposal. A proper class naming scheme and similar directory structure is the only requirement.

I see some things that ideally should be changed:

  • put a 'vendor' name as a prefix to the current class names
  • move NTLM specific stuff in its own directory and rename the classes to
    NTLM_...
  • move EWS specific stuff to its own directory and rename the classes to EWS_

etc.

Originally posted by kristof.coomans on Google Code: http://code.google.com/p/php-ews/issues/detail?id=4

Class 'EWSType_ItemType' not found

PHP Fatal error: Class 'EWSType_ItemType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\CalendarItemType.php on line 14
[26-Jul-2012 06:54:06 UTC] PHP Fatal error: Class 'EWSType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\AbsoluteMonthlyRecurrencePatternType.php on line 13
[26-Jul-2012 06:54:44 UTC] PHP Fatal error: Class 'EWSType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\AbsoluteMonthlyRecurrencePatternType.php on line 13
[26-Jul-2012 06:55:24 UTC] PHP Fatal error: Class 'EWSType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\AbsoluteMonthlyRecurrencePatternType.php on line 13
[26-Jul-2012 06:55:27 UTC] PHP Fatal error: Class 'EWSType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\AbsoluteMonthlyRecurrencePatternType.php on line 13
[26-Jul-2012 06:55:56 UTC] PHP Fatal error: Class 'EWSType' not found in D:\svn\PsCore\trunk\www\Admin\test1\finalcalender\EWSType\AbsoluteMonthlyRecurrencePatternType.php on line 13

When i tried to use above code for listing of events it gave above errors

Getting a Calendar item hangs script

I upgraded php-ews today. Since I did that, I have been having problems with this script that used to work:

$ews = new ExchangeWebServices($host, $username, $password);
// Check if the activity still exists in Exchange
$request = new EWSType_GetItemType();
$request->ItemShape = new EWSType_ItemResponseShapeType();

$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::DEFAULT_PROPERTIES;
$request->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType();
$request->ItemIds->ItemId = new EWSType_ItemIdType();
$request->ItemIds->ItemId->Id = $outlook_response['outlook_response_id'];

$response = $ews->GetItem($request);

It's very simple. What's interesting is I have more complex scripts that run fine. When this script runs, it hangs the browser. No errors in the browser (I don't think it even times out). No errors in the errorlog on the server either.

Anyone know what's going on here?

Sending HTML Emails

sorry, accidentally did this twice. please refer to my other 'issue post'

loss of control and no exception

Sorry not to be able to be more accurate in the bug description but the problem is not trivial.

It occurs (not every time) just after a call on a method like DeleteItem($deleteItem) on a NTLMSoapClient_Exchange instance.

This call is the last I can trace. Just after the process has jumped on an inpredictable line of the code previously loaded by the php interpreter. And there is absolutely no relation beetween the DeleteItem and the next line of code executed. Of course, the program can't run much further because the contexte is not the good one.

Normaly, if no bug occurs, just after a call to DeleteItem, the next line of code I can trace is in the __construct method of the NTLMSoapClient instance. The SOAP enveloppe has been created and the program is almost ready to call the server.

I suppose the bug occurs while creating the SOAP request, but I can't trace it.
I already tried to activate exceptions and trace this way:

<?php
$EWSClientOptions = array (
            'user' => EWS_CLIENT_USER, // for curl
            'password' => EWS_CLIENT_PASSWORD,
            'trace' => true,  // options the should be used by soapclient  http://www.php.net/manual/fr/soapclient.soapclient.php
            'exceptions ' => true
        );
$this->EWSclient = new NTLMSoapClient_Exchange(EWS_CLIENT_WSDL, $EWSClientOptions);

but it doesn't launch any exceptions and I see no traces.

If only it could launch an exception ... !

Running on

  • Windows Server 2008 R2 Enterprise.
  • PHP Version 5.2.14
  • Zend Server
  • Curl info: libcurl/7.20.0 OpenSSL/0.9.8o zlib/1.2.3
  • Exchange 2010 (but it has not yet been called when to problem occurs)

but I also had the problem on PHP5.3 and a simple (wamp) apache server.

I hope we can solve this problem.

Thanks,

Alain

Originally posted by alain.baucant on Google Code: http://code.google.com/p/php-ews/issues/detail?id=9

Sending HTML Emails

First off thanks so much for this tremendous library, I've been able to get most everything working.

  1. Through php-ews, I can send emails just fine, and I can send HTML emails just fine when the receiver of the email is using Outlook.
  2. However, for some reason, when I open the same email sent to a Gmail address, it gets converted to plain text. You don't see the tags in the email itself, which makes me think the email was either stripped of its tags or converted to plain text.

At first I thought it was Gmail messing with the HTML, but then i sent the exact same HTML email through a basic php email script and it displayed in gmail correctly.

Any thoughts? This is pretty important for me so any help would be greatly appreciated.

This is the printout from gmail confirming it's reading it as plain text:

Date: Fri, 4 May 2012 16:30:08 -0500
Subject: Cool subject
Thread-Topic: Cool subject
Thread-Index: AQHNKj0Ue5GaGssxa0WHSK4ycdfaOw==
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach:
X-MS-TNEF-Correlator:
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-OriginalArrivalTime: 04 May 2012 21:30:09.0436 (UTC) FILETIME=[14D30DC0:01CD2A3D]

list items from public task folder

Anyone know how can I get a list of items from public task folder?

I can 'see' public tasks folders, I got folder Id, but how can I list Items from folder or Items from specific public folder?

When I try list items from public folder as inbox or calendar, returned empty array

FindFolder method return:

[0] => stdClass Object
(
    [FolderId] => stdClass Object
    (
        [Id] => AAEuAAAAAAAaRHOQqmYRzZvIAKoAL8RaAwBc+O6GFeobTay7IIz2+ZDuAABbOrsQAAA=
        [ChangeKey] => BAAAABYAAABc+O6GFeobTay7IIz2+ZDuAuoOlzXW
    )
    [ParentFolderId] => stdClass Object
    (
        [Id] => AQEuAAADGkRzkKpmEc2byACqAC/EWgMAXPjuhhXqG02suyCM9vmQ7gAAAwEAAAA=
        [ChangeKey] => AQAAAA==
    )
    [FolderClass] => IPF.Task
    [DisplayName] => Task-ADM-test
    [ChildFolderCount] => 0
    [EffectiveRights] => stdClass Object
    (
        [CreateAssociated] => 1
        [CreateContents] => 1
        [CreateHierarchy] => 1
        [Delete] => 1
        [Modify] => 1
        [Read] => 1
    )
)

FindItem method return:

stdClass Object
(
    [ResponseMessages] => stdClass Object
    (
        [FindItemResponseMessage] => stdClass Object
        (
            [ResponseCode] => NoError
            [ResponseClass] => Success
            [RootFolder] => stdClass Object
            (
                [Items] => stdClass Object
                (
                )
                [IncludesLastItemInRange] => 1
                [TotalItemsInView] => 0
            )
        )
    )
)

Error when loading the exchange server

When I add the script (had to figure out what all to include into my php-page too) I get this error:

Fatal error: Uncaught SoapFault exception: [Client] SoapClient::__doRequest() returned non string value in /var/www/qbmt/calendar/ews/ExchangeWebServices.php:314 Stack trace: #0 [internal function]: SoapClient->__call('FindFolder', Array) #1 /var/www/qbmt/calendar/ews/ExchangeWebServices.php(314): NTLMSoapClient_Exchange->FindFolder(Object(EWSType_FindFolderType)) #2 /var/www/qbmt/calendar/index.php(34): ExchangeWebServices->FindFolder(Object(EWSType_FindFolderType)) #3 {main} thrown in /var/www/qbmt/calendar/ews/ExchangeWebServices.php on line 314

This is the basic example

Originally posted by stijn.neels on Google Code: http://code.google.com/p/php-ews/issues/detail?id=14

How do I connect to a shared folder/Mailbox

I can't for the life of me figure out how to get your library working with what I need to do, and was hoping you could help.

How might I get all the emails in a shared folder/mailbox that I have access to? The folder/mailbox name is "Technical Support".

Scan Inbox

Hello,
I use your Class but :

I come to you because I have a small problem that is becoming urgent, for one of my projects at work.

I'm stuck and it becomes very urgent, I seek the way to list all emails from my inbox from a primary Exchange server and read its contents and headers ,....

I use the EWS class with a LDAP connection, I can send emails, in listing of Calendar event, to enter the Inbox (or so I think :-)).

Could you please help me,it's very urgent

Originally posted by stephane.vw on Google Code: http://code.google.com/p/php-ews/issues/detail?id=8

Incorrect return types

The doc blocks for each of the request methods defined in the ExchangeWebServices class are incorrect. For example ExchangeWebServices::CreateItem() defines the response type as CreateItemResponseType; however, the method actually returns an object of type stdClass. CreateItemResponseType is also not defined.

There are two options here:

  1. The doc blocks can be changed to define the return type as stdClass.
  2. The response can be properly processed into the defined return type (though these still need to be implemented and should probably be prefixed with EWSType (e.g. EWSType_CreateItemResponseType).

The second option will be a change in the current behavior but I am not opposed to it if that makes it easier to use. I wanted to get some input from the community before I make decision.

Originally posted by jamesiarmes on Google Code: http://code.google.com/p/php-ews/issues/detail?id=12

Update requirements - libcurl

After days of fighting the dreaded 401 error, I finally figured out my problem and I think it would help if it was listed as a requirement. Most of you must be using this library on a windows server, as I came to discover that Linux won't work with EWS right out of the box.

It looks like alot of NTLM changes have been made to the libcurl library, so I'm not sure exactly which version fixes the problem. I think it's safe to list 7.23.0 as the required libcurl version on Linux, as that's the last version that mention any NTLM changes.

If it helps any, here is a post I made on the subject:
http://blog.ianty.com/ubuntu/exchange-web-services-ews-ntlmv2-and-linux/

Getting body of email

anyone know how to pull the body of the email when getting a list of the emails from a folder?

I tried ALL_PROPERTIES but that doesn't include it.

Also how do you find the distinguished name of a folder inside the INBOX?

Loss of control and no exception

Sorry not to be able to be more accurate in the bug description but the problem is not trivial.

It occurs (not every time) just after a call on a method like DeleteItem($deleteItem) on a NTLMSoapClient_Exchange instance.

This call is the last I can trace. Just after the process has jumped on an inpredictable line of the code previously loaded by the php interpreter. And there is absolutely no relation beetween the DeleteItem and the next line of code executed. Of course, the program can't run much further because the contexte is not the good one.

Normaly, if no bug occurs, just after a call to DeleteItem, the next line of code I can trace is in the __construct method of the NTLMSoapClient instance. The SOAP enveloppe has been created and the program is almost ready to call the server.

I suppose the bug occurs while creating the SOAP request, but I can't trace it.
I already tried to activate exceptions and trace this way:

<?php
$EWSClientOptions = array (
            'user' => EWS_CLIENT_USER, // for curl
            'password' => EWS_CLIENT_PASSWORD,
            'trace' => true,  // options the should be used by soapclient  http://www.php.net/manual/fr/soapclient.soapclient.php
            'exceptions ' => true
        );
$this->EWSclient = new NTLMSoapClient_Exchange(EWS_CLIENT_WSDL, $EWSClientOptions);

but it doesn't launch any exceptions and I see no traces.

If only it could launch an exception ... !

Running on

  • Windows Server 2008 R2 Enterprise.
  • PHP Version 5.2.14
  • Zend Server
  • Curl info: libcurl/7.20.0 OpenSSL/0.9.8o zlib/1.2.3
  • Exchange 2010 (but it has not yet been called when to problem occurs)

but I also had the problem on PHP5.3 and a simple (wamp) apache server.

I hope we can solve this problem.

Thanks,

Alain

Originally posted by alain.baucant on Google Code: http://code.google.com/p/php-ews/issues/detail?id=10

creating a contact

Leaving this in the code to create a contact breaks the script sayting that Class EWSType_MapiPropertyTypeType not found

// set extended properties
$contact->ExtendedProperty = array();
// contact title
$property = new EWSType_ExtendedPropertyType();
$property->ExtendedFieldURI->PropertyTag = '0x3A45';
$property->ExtendedFieldURI->PropertyType = EWSType_MapiPropertyTypeType::STRING;
$property->Value = 'Mr.';
$contact->ExtendedProperty[] = $property;

NTLM fails in fairly recent curl update

Hey, this isn't your fault, but it could be your problem if you don't add some sort of pre-flight check. When messing around with another MS service needing NTLM today I discovered that the version of curl that was on my localhost doesn't correctly handle NTLM. It tries to but sends some garbage instead of the proper initial encoded stuff. After googling around, it appears that a lot of people on Ubuntu reported this issue a couple of months ago and the top "fix" was to update curl as it had been fixed since. Sure enough, I updated curl and it works like it did when I first stuck my toes in the muddy pool of NTML via curl 2 years back.

So again, just a heads up, your Soapwith NTLM will fall on it's face if php is using the wonky version of curl. One of the ways to identify if it's this bug is the response will include "gss_init_sec_context() failed" in verbose mode.

How to apply a restriction which finds items that have not been assigned any category

I have written a restriction for FindItem which selects all items with the category "MyCategory" which works fine:

$request = new EWSType_FindItemType();
...
$request->Restriction = new EWSType_RestrictionType();
$request->Restriction->IsEqualTo->FieldURI = new stdClass();
$request->Restriction->IsEqualTo->FieldURI->FieldURI ='item:Categories';
$request->Restriction->IsEqualTo->FieldURIOrConstant->Constant->Value = 'MyCategory';

But I didn't succeed in changing the restriction in order to find all mails that have no category.
Setting Value = '' does not do the job, since this would look for items which have a category named '', but would not find items which just have no category. I also tried a construct like Not->IsEqualTo, but didn't succeed either.

Any ideas? Thank you very much in advance!

Stefan

Updating extended properties

We are using your php-ews library in our app. Everything is working great and so far I was able (with much trial and error) to set all the attributes I needed to be updated in a contact save for extended ones. I've been struggling with trying to make this work for a while already. I really don't know, if I am doing it right, since I have no existing reference in PHP for this, but here's the code:

$ews = new ExchangeWebServices('<HOST>', '<USER>', '<PASS>', ExchangeWebServices::VERSION_2007_SP1);

$request = new EWSType_UpdateItemType();

$request->SendMeetingInvitationsOrCancellations ='SendToNone';
$request->MessageDisposition = 'SaveOnly';
$request->ConflictResolution = 'AlwaysOverwrite';

$request->ItemChanges = new EWSType_NonEmptyArrayOfItemChangesType();
$request->ItemChanges->ItemChange->ItemId->Id = "<ITEM ID>";
$request->ItemChanges->ItemChange->ItemId->ChangeKey = "<CHANGE KEY>";
$request->ItemChanges->ItemChange->Updates = new EWSType_NonEmptyArrayOfItemChangeDescriptionsType();

$request->ItemChanges->ItemChange->Updates->SetItemField = array();
$request->ItemChanges->ItemChange->Updates->DeleteItemField = array();

$field = new EWSType_SetItemFieldType();

$field->ExtendedFieldURI->PropertyTag = '0x3A45';
$field->ExtendedFieldURI->PropertyType = 'String'; 

$field->Item = new EWSType_ItemType();
$field->Item->ExtendedProperty->ExtendedFieldURI->PropertyTag = '0x3A45';
$field->Item->ExtendedProperty->ExtendedFieldURI->PropertyType = 'String';
$field->Item->ExtendedProperty->Value = 'Mr.';

$request->ItemChanges->ItemChange->Updates->SetItemField[] = $field;

$response = $ews->UpdateItem($request);
echo '<pre>'.print_r($response, true).'</pre>';     

It would be great if you could help fix this one or at least provide example on how to update an extended property using PHP-EWS. Could be great if you could add extended property setting, when creating contacts as well.

Path' is abstract or its type is abstract.

Steps to reproduce
I am trying to get "additional properties" associated with a calendar item.
I use the following code:

<?php
$FindItem->Traversal = "Shallow";
$FindItem->ItemShape->BaseShape = "AllProperties";
$FindItem->ItemShape->IncludeMimeContent = true;

$FindItem->ItemShape->AdditionalProperties[0]->PathToExtendedField->DistinguishedPropertySetId = DistinguishedPropertySetType.Appointment;
$FindItem->ItemShape->AdditionalProperties[0]->PathToExtendedField->DistinguishedPropertySetIdSpecified = true;
$FindItem->ItemShape->AdditionalProperties[0]->PathToExtendedField->PropertyType = MapiPropertyTypeType.String;
$FindItem->ItemShape->AdditionalProperties[0]->PathToExtendedField->PropertyName = "STMeetingId";

$FindItem->ParentFolderIds->DistinguishedFolderId->Id = "calendar";
$FindItem->ParentFolderIds->DistinguishedFolderId->Mailbox->EmailAddress = "[email protected]";

$result = $client->FindItem($FindItem);

What is the expected output? What do you see instead?
Schema validation fails. I have copied the types.xsd from Exchange server (2010) and have copied it locally. "Path is abstract or its type is abstract".

What version of the product are you using? On what operating system?
I am using Exchange 2010. Client code is running on WindRiver linux.

Please provide any additional information below.
This is part of getting all calendar items for all users. It works. But now I am trying to access either the custom "user properties" set via outlook or the body of the calendar item which has some text which I am interested in.

Please let me know.

Thanks,
Sachin

Originally posted by sachinsshukla on Google Code: http://code.google.com/p/php-ews/issues/detail?id=6

Loading EWSTypes

Personally, it's a PIA to load each individual EWSType. In addition, I don't want to load all of them by looping over all the classes in EWSType directory.

<?php
/**
 * load the needed EWSTypes
 * 
 * @author Ian Tyndall <http://blog.ianty.com>
 */
class EWSType_Factory {
    /**
     * type loader
     */
    public static function type($type)
    {
        if (include_once 'EWSType/' . $type . 'Type.php') {
            $classname = "EWSType_$type" . 'Type';
            return new $classname;
        } else {
            throw new Exception('Type not found');
        }
    }
} // end class EWSType_Factory

This updates the first example you provided to this:

<?php
require_once('ExchangeWebServices.php');
require_once('EWS_Exception.php');
require_once('EWSType.php');
require_once('EWSType_Factory.php');
require_once('NTLMSoapClient.php');
require_once('NTLMSoapClient/Exchange.php');

$host = 'foo-ews.mysite.com';
$username = 'username'; 
$password = 'password';

$ews = new ExchangeWebServices($host, $username, $password);
$traversal = EWSType_Factory::type('FolderQueryTraversal');
$shape_names = EWSType_Factory::type('DefaultShapeNames');
$folderid_names = EWSType_Factory::type('DistinguishedFolderIdName');

// start building the find folder request
$request = EWSType_Factory::type('FindFolder');
$request->Traversal = $traversal::SHALLOW;
$request->FolderShape = EWSType_Factory::type('FolderResponseShape');
$request->FolderShape->BaseShape = $shape_names::ALL_PROPERTIES;

// configure the view
$request->IndexedPageFolderView = EWSType_Factory::type('IndexedPageView');
$request->IndexedPageFolderView->BasePoint = 'Beginning';
$request->IndexedPageFolderView->Offset = 0;

// set the starting folder as the inbox
$request->ParentFolderIds = EWSType_Factory::type('NonEmptyArrayOfBaseFolderIds');
$request->ParentFolderIds->DistinguishedFolderId = EWSType_Factory::type('DistinguishedFolderId');
$request->ParentFolderIds->DistinguishedFolderId->Id = $folderid_names::INBOX;

// make the actual call
$response = $ews->FindFolder($request);
echo '<pre>'.print_r($response, true).'</pre>';

CalendarItem Recurrence

I've got a good calendaritem request, just don't know how to set up recurrence. Any guidance/samples would greatly be appreciated.

$request = new EWSType_CreateItemType();
$request->SendMeetingInvitations = EWSType_CalendarItemCreateOrDeleteOperationType::SEND_ONLY_TO_ALL;
$request->SavedItemFolderId->DistinguishedFolderId = new EWSType_DistinguishedFolderIdType();
$request->SavedItemFolderId->DistinguishedFolderId->Id = EWSType_DistinguishedFolderIdNameType::CALENDAR;
$request->Items = new EWSType_NonEmptyArrayOfAllItemsType();
$request->Items->CalendarItem = new EWSType_CalendarItemType();
$request->Items->CalendarItem->Subject = "Basic Calendar Item Insertion";
$request->Items->CalendarItem->Body = new EWSType_BodyType();
$request->Items->CalendarItem->Body->BodyType = 'Text';
$request->Items->CalendarItem->Location = 'Rock Quarry';

$request->Items->CalendarItem->Start = date('c', strtotime('today'));
$request->Items->CalendarItem->End = date('c',  strtotime('today + 1 day'));
$request->Items->CalendarItem->IsAllDayEvent = true;
$request->Items->CalendarItem->LegacyFreeBusyStatus = 'Free';
$request->Items->CalendarItem->Categories->String = 'Test Category';
$request->Items->CalendarItem->Body->_ = 'Test Body';

$request->Items->CalendarItem->RequiredAttendees = new EWSType_NonEmptyArrayOfAllItemsType();
$request->Items->CalendarItem->RequiredAttendees->Attendee = new EWSType_SingleRecipientType();
$request->Items->CalendarItem->RequiredAttendees->Attendee->Mailbox = new EWSType_EmailAddressType();
$request->Items->CalendarItem->RequiredAttendees->Attendee->Mailbox->Name = 'Fred Flintstone';
$request->Items->CalendarItem->RequiredAttendees->Attendee->Mailbox->EmailAddress = '[email protected]';

// make the actual call
$response = $ews->CreateItem($request);

Request always returns null

Really impressed with this project. Great work. I've got it working on my dev server (WAMP stack)...but when I move it to my production (LAMP) Debian server I get nothing but a NULL result for any of the function calls. I might be missing something basic...I'm sure it's a configuration issue on my end...some kind of error would be helpful....any ideas on where I could start with troubleshooting??? Do I need to COM objects enabled, etc..? Any more info on the dependencies would be really great.

Originally posted by [email protected] on Google Code: http://code.google.com/p/php-ews/issues/detail?id=11

Documentation

Originally filed by [email protected] on 2010-02-11T15:38:07

Could you post up some documentation, even if it is very basic, to get us
started with your project? It definitely seems like a useful project; one I
hope to contribute to down the road if I can get it working.

getting calendar without SSL

Hi,

I'm trying to use php-ews with SmarterMail 9 without SSL.

I edited these files to disable SSL request:

  • NTLMSoapClient.php:

curl_setopt($this->ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

  • ExchangeWebServices.php:

https:// to http://

I use the snippet of code form the "Calendar:Get List" wiki page.

I have the following output even if I have items in my calendar:

stdClass Object
(
    [ResponseMessages] => stdClass Object
        (
            [FindItemResponseMessage] => stdClass Object
                (
                    [ResponseCode] => NoError
                    [ResponseClass] => Success
                    [RootFolder] => stdClass Object
                        (
                            [Items] => stdClass Object
                                (
                                )

                            [IncludesLastItemInRange] => 1
                            [TotalItemsInView] => 0
                        )

                )

        )

)

Adding the account into Outlook 2011 for MAC (EWS mode) show me everything in Calendar.

The script from wiki page "Folder:Get List" work as expected.

How to Retrieve Items from Public Folder Calendar

so i'm having some trouble and hope you can assist with a sample code

I can successfully use the class to retrieve the calendar events from a specific users calendar by email address (or that users calendar if it's shared), as well as recursively loop through the public folder items to get the ID of the calendars that I want to get events from.

What I can't figure out is how to retrieve events from a specific calendar that is inside the Public Folders.

Mailbox->EmailAddress on List?

I'm using a EWSType_FIndItemType to get a list of message headers from the inbox, however, I can't seem to retrieve the Mailbox->EmailAddress (or the same content in any other field). I have tried using "EWSType_DefaultShapeNamesType::ALL_PROPERTIES" and while that returns more information it doesn't ever expose the email address. Is there a way to do this, or is it simply a limitation of the EWS API?

Thanks

Setting the Timezone for CalendarItemType

It's not clear to me how this should be done. Here's what I've tried. This following results in the Exchange server treating my times as UTC and automatically offsetting the times to the Exchange server's local time.

    $request = new EWSType_CreateItemType();
    $request->Items = new EWSType_NonEmptyArrayOfAllItemsType();
    $request->Items->CalendarItem = new EWSType_CalendarItemType(); 
    $outlook_event = $request->Items->CalendarItem;  // shorthand reference

...

    $outlook_event->Start = $start_time;  // ISO 8601 formatted -- I've tried with AND without the offset
    $outlook_event->End   = $end_time;
    $outlook_event->StartTimezone = new EWSType_TimeZoneType();
    $outlook_event->EndTimezone   = new EWSType_TimeZoneType();
    $outlook_event->StartTimezone->TimeZoneName = 'Pacific Standard Time';
    $outlook_event->EndTimezone->TimeZoneName  = 'Pacific Standard Time';

Do I manually have to set up the rest of the members of the Timezone object used in EWSType_TimeZoneType, e.g. BaseOffset, Standard, etc. in order to get this to work properly?

Changes for Exchange 2010

I have Exchange 2010 and I was wondering how would I use Exchange Impersonation with this.

Specifically I can get the following things to work:

  1. User X can get his calendar information.
  2. Service Account 'S' (with Impersonation privileges) can get his calendar information.

But, how to use Service Account 'S' credentials to authenticate in order to get calendar information for user X?

Thanks,
Sachin

Originally posted by sachinsshukla on Google Code: http://code.google.com/p/php-ews/issues/detail?id=2

How to use EWSType_BasePagingType

Hello,

I'm wondering to not found any infromation about this class,

actually i get all of my email in my mail box but i want an limit, so my question is how i can add a limit for my view of emails ?

Best Regards

create calendar event, Location is not set

Hi,

with this code:
$request = new EWSType_CreateItemType();
$request->SendMeetingInvitations = 'SendToNone';
$request->Items->CalendarItem->Subject = 'test';
$request->Items->CalendarItem->Location = 'location';
$request->Items->CalendarItem->ReminderIsSet = '';
$request->Items->CalendarItem->Start = date('c', $_REQUEST[start]);
$request->Items->CalendarItem->End = date('c', $_REQUEST[ende]);
$request->Items->CalendarItem->LegacyFreeBusyStatus = 'Free';
$request->Items->CalendarItem->Location = '';
$response = $ews->CreateItem($request);

following request is created:
EWSType_CreateItemType Object
(
[SavedItemFolderId] =>
[Items] => stdClass Object
(
[CalendarItem] => stdClass Object
(
[Subject] => test
[Location] =>
[ReminderIsSet] =>
[Start] => 2012-04-27T08:00:00+02:00
[End] => 2012-04-27T09:00:00+02:00
[LegacyFreeBusyStatus] => Free
)

    )

[MessageDisposition] => 
[SendMeetingInvitations] => SendToNone
[schema:protected] => Array
    (
        [0] => Array
            (
                [name] => SavedItemFolderId
                [required] => 
                [type] => TargetFolderIdType
            )

        [1] => Array
            (
                [name] => Items
                [required] => 
                [type] => NonEmptyArrayOfAllItemsType
            )

        [2] => Array
            (
                [name] => MessageDisposition
                [required] => 
                [type] => MessageDispositionType
            )

        [3] => Array
            (
                [name] => SendMeetingInvitations
                [required] => 
                [type] => CalendarItemCreateOrDeleteOperationType
            )

    )

)

as you can see, the location is not set

How to Invite Attendees to new Calendar Event?

First I would like to thank everyone who has made this project. It is pretty neat to be able to add Calendar events to MS Exchange servers via PHP.

I have a put together a script to add calendar events, and it is working great.

I would like to invite attendees to the events, 1 or more.

Below is code for adding it to my calendar only.

<?php
$ews = new ExchangeWebServices($host, $username, $password, $version);

$request = new EWSType_CreateItemType();

$event_details = new EWSType_CalendarEventDetails();

$event = new EWSType_CalendarEvent();
$event->CalendarEventDetails = $event_details;

$event->Start = '2012-07-21T09:00:00+02:00';
$event->End = '2012-07-21T18:00:00+02:00';
$event->Subject = "Subject";
$event->Location = "Location";
$event->BusyType = "Busy";

$request->Items->CalendarItem[] = $event;
$request->SendMeetingInvitations = EWSType_CalendarItemCreateOrDeleteOperationType::SEND_TO_NONE;

$response = $ews->CreateItem($request);
echo '<pre>'.print_r($response, true).'</pre>';

Missing RequestServerVersion SOAP header

What steps will reproduce the problem?

  1. FindFolder request with DistinguishedFolderId on publicfoldersroot and Traversal on Shallow.

Expected output: succesful response

Got soap error: The request is valid but does not specify the correct server version in the RequestServerVersion SOAP header. Ensure that the RequestServerVersion SOAP header is set with the correct RequestServerVersionValue.

Quick fix: to NTMLSOAPClient_Exchange::__construct(), I added this:

<?php
$soapHeader = new SoapHeader(
    '<a href="http://schemas.microsoft.com/exchange/services/2006/types'" rel="nofollow">http://schemas.microsoft.com/exchange/services/2006/types'</a>,
    'RequestServerVersion Version=&quot;Exchange2007_SP1&quot;'
);
$this-&gt;__setSoapHeaders($soapHeader);

Obviously, the Exchange2007_SP1 part should be configurable.

Originally posted by kristof.coomans on Google Code: http://code.google.com/p/php-ews/issues/detail?id=3

PSR-1 and PSR-2 compliance

Now that both PSR-1 and PSR-2 have been approved, we should update the library to comply with these standards. We should leave out PSR-0 for now as that will break existing implementations. That task should be tackled separately in Issue #4.

Strict warning: Declaration of NTLMSoapClient::__doRequest() should be compatible with that of SoapClient::__doRequest()

When using the library, and PHP's error_reporting includes E_STRICT:

Declaration of NTLMSoapClient::__doRequest() should be compatible with that of SoapClient::__doRequest()

Solution: the last parameter, $one_way, should have a default value of 0:

<?php
public function __doRequest($request, $location, $action, $version,
$one_way = 0) {

Originally posted by kristof.coomans on Google Code: http://code.google.com/p/php-ews/issues/detail?id=5

Missing files on creation of calendar item

Well, I was trying to create an item in the calendar and I encountered with two errors:

  1. Missing "Subject" property for CalendarItemType
  2. Missing file "CalendarItemCreateOrDeleteOperationType", that has constants that define the send method policy on item creation.
    2.a. Missing file "CalendarItemUpdateOperationType", that has constants that define the send method policy on item update.

I added the missing subject property and created the two files missing based on the enumeration in "types.xsd". Hope this will help.

Actual code to insert a calendar item:

<?php
$ews = new ExchangeWebServices($host, $username, $password);
// start building the find request
$request = new EWSType_CreateItemType();
$request->Items = new EWSType_NonEmptyArrayOfAllItemsType();
$request->Items->CalendarItem = new EWSType_CalendarItemType();

// configure the view
$request->Items->CalendarItem->Subject = "Basic Calendar Item Insertion";
$request->SendMeetingInvitations = EWSType_CalendarItemCreateOrDeleteOperationType::SEND_TO_NONE;
//$request->SendMeetingInvitationsSpecified = true;
$response = $ews->CreateItem($request);
echo '<pre>'.print_r($response, true).'</pre>';

Originally posted by daareiza on Google Code: http://code.google.com/p/php-ews/issues/detail?id=7
File Attached: CalendarItemCreateOrDeleteOperationType.php
File Attached: CalendarItemUpdateOperationType.php
File Attached: CalendarItemType.php

Getting started

Hello;

I am trying to get started with this but I am not finding on the documentation enough help.

First question is; does this use ActiveSync; or how is it getting the information from Exchange?

Second question is: I am getting an 'returned non string value' ; and I don't know how to troubleshoot it because the information provided is not much. Here is the full error:

Fatal error: Uncaught SoapFault exception: [Client] SoapClient::__doRequest() returned non string value in [...]/ExchangeWebServices.php:363 Stack trace: #0 [...]/ExchangeWebServices.php(363): SoapClient->__call('FindFolder', Array)
#1 [...]/ExchangeWebServices.php(363): NTLMSoapClient_Exchange->FindFolder(Object(EWSType_FindFolderType))
#2 [...]/index.php(24): ExchangeWebServices->FindFolder(Object(EWSType_FindFolderType))
#3 {main} thrown in [...]/ExchangeWebServices.php on line 363

EWSType_ResponseTypeType not defined

This class is mentioned in several spots throughout the library, e.g.

grep -rin "responsetypetype" .
./AttendeeType.php:24: * @var EWSType_ResponseTypeType
./AttendeeType.php:48: 'type' => 'ResponseTypeType',
./CalendarItemType.php:136: * @var EWSType_ResponseTypeType
./CalendarItemType.php:421: 'type' => 'ResponseTypeType',
./MeetingMessageType.php:45: * @var EWSType_ResponseTypeType
./MeetingMessageType.php:98: 'type' => 'ResponseTypeType',
./MeetingRequestMessageType.php:115: * @var EWSType_ResponseTypeType
./MeetingRequestMessageType.php:365: 'type' => 'ResponseTypeType',

But it's not defined anywhere.

In particular, I need to preset responses for Attendees ('Accept','Decline',etc.). I've scoured the library, but I can't determine the appropriate class to instantiate for Attendee::ResponseType. Has anyone else run into this issue?

NTLMStream Usage

I've ran into a problem using your library, and it's because of the ntlm authentication. I see you have the NTLMStream class by Thomas Rabaix, but I don't see where it's being used. I've looked all through your code base, and I can find no where the NTLMStream is being registered with the stream_wrapper_register function from PHP. In addition, I don't see any use of it in any of the examples provided in the wiki.

How does one use the NTLMStream class with php-ews?

FindItem with Restrictions ignores SearchExpression

If I do a FindItem (as a request of Exchange 2010) with a restriction, the SearchExpression is permanently ignored and I always get the following error in browser:

Fatal error: Uncaught SoapFault exception: [a:ErrorSchemaValidation] The request failed schema validation: The element 'Restriction' in namespace 'http://schemas.microsoft.com/exchange/services/2006/messages' has incomplete content. List of possible elements expected: 'SearchExpression' in namespace 'http://schemas.microsoft.com/exchange/services/2006/types'. in ###/php-ews/ExchangeWebServices.php:352 Stack trace: #0 [internal function]: SoapClient->__call('FindItem', Array) #1 ###/php-ews/ExchangeWebServices.php(352): NTLMSoapClient_Exchange->FindItem(Object(EWSType_FindItemType)) #2 ###: ExchangeWebServices->FindItem(Object(EWSType_FindItemType)) #3 {main} thrown in ***/php-ews/ExchangeWebServices.php on line 352

What is going wrong?

Thanks for help!

SoapFault: Wrong Version

Hi everyone. I'm currently working on an intranet project with drupal, and i want to get back all informations about rooms (availability for exemple) on the calendar on Exchange server (or whatever).

This is my code (pretty simple for now) :



require_once('php-ews/ExchangeWebServices.php');
require_once('php-ews/NTLMSoapClient.php');
require_once('php-ews/NTLMSoapClient/Exchange.php');
require_once('php-ews/EWS_Exception.php');
require_once('php-ews/EWSType.php');

require_once('php-ews/EWSType/FindItemType.php');
require_once('php-ews/EWSType/ItemResponseShapeType.php');
require_once('php-ews/EWSType/DefaultShapeNamesType.php');
require_once('php-ews/EWSType/NonEmptyArrayOfBaseItemIdsType.php');
require_once('php-ews/EWSType/ItemIdType.php');

$host = "exchange.xxx.fr/EWS/Exchange.asmx";
$user = "xxx";
$password = "xxx";

$ews = new ExchangeWebServices($host, $user, $password);

$request = new EWSType_FindItemType();

$request->ItemShape = new EWSType_ItemResponseShapeType();
$request->ItemShape->BaseShape = EWSType_DefaultShapeNamesType::ALL_PROPERTIES;

$request->ItemIds = new EWSType_NonEmptyArrayOfBaseItemIdsType();
$request->ItemIds->ItemId = new EWSType_ItemIdType();
$request->ItemIds->ItemId->Id = "ID of the contact found when listing contact list";

$response = $ews->GetItem($request);

And this is my problem :

SoapFault: Wrong Version in SoapClient->__call() (line 417 of C:\xampp\htdocs\OF_Intranet\sites\all\modules\reservation_salle\php-ews\ExchangeWebServices.php).

So, of course, i was looking around ExchangeWebServices and Exchange to change the soap version, but i'm certainly missing something.

If you can help me, you're more than welcome :)

Update / Remove Calendar Event.

Hello, i'm a PHP developper and i have a question about this class.

For now, is the "creating event in calendar" return the ID of the calendar item just created ?

Then, is it possible to do and update, or delete a calendar item with the ID ?

i'm developping a CRM for my company and i will be really great to auto-add the event when created in the CRM. Then delete it if it's deleted on CRM.

Thanks in advance for your help.

Edwin.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.