此包的最新版本(v0.9.6)没有可用的许可信息。

v0.9.6 2018-01-26 11:23 UTC

README

Build Status Scrutinizer Code Quality Code Coverage

PHP Exchange Web Services 库(php-ews)旨在简化使用 Exchange Web Services 与 Microsoft Exchange 服务器通信的过程。它处理使用 SOAP 服务所需的 NTLM 身份验证,并提供了一个面向对象的接口,用于形成请求所需的复杂类型。

依赖项

  • PHP 5.5+
  • cURL 具有NTLM支持(推荐使用7.23.0+)
  • Composer
  • Exchange 2007 或 2010*

*注意:并非所有操作或请求元素都在 Exchange 2007 上得到支持。

安装

要求 composer 包并使用它

composer require garethp/php-ews

用法

可以使用该库来制作多种不同的请求类型。为了发出请求,您需要创建一个新的 API 对象

$ews = API::fromUsernameAndPassword($server, $username, $password, $options = array());

API::fromUsernameAndPassword 静态构造函数接受四个参数

  • $server:您要连接的 Exchange 服务器的 URL,不包括协议。例如:mail.example.com。
  • $username:用于连接服务器的用户。这通常是用户电子邮件地址的本地部分。例如,如果电子邮件地址是 "user@example.com",则示例为 "user"。
  • $password:用户的明文密码。
  • $options:(可选):要传入的一组选项
  • $options['version']:要连接的 Exchange 服务器版本。有效值可以在 ExchangeWebServices::VERSION_* 中找到。默认为 Exchange 2010。
  • $options['timezone']:用于操作的时区。这不是 PHP 时区,而是 Exchange 定义的时区 ID。抱歉,我还没有列出它们。
  • $options['httpClient']:如果您想注入自己的 GuzzleClient 以进行请求
  • $options['httpPlayback']:请参阅测试部分

一旦您有了 API 对象,您需要构建您的请求对象。对象的类型取决于您要调用的操作。如果您使用的是具有代码补全功能的 IDE,则它应该能够帮助您使用提供的 docblocks 确定正确的类。

请求对象构建类似于请求的 XML 主体。有关构建请求的更多信息,请参阅下面的资源部分。

简单库用法

正在进行简化某些操作的工作,以便您无需自己创建请求。示例位于 此处,可以浏览小块代码。如果您想添加更多示例,只需为其创建一个 PR 即可。如果您想请求一个示例,请提交一个 Github 问题,我会尽力创建它。

手动用法

虽然简单库用法是处理其覆盖内容的最佳方式,但它并不涵盖所有内容。实际上,它覆盖得相当少。如果您想在其范围之外进行操作,请使用 API::getClient() 作为通用 SOAP 客户端,并参考 Microsoft 文档了解如何构建您的请求。以下是一个示例

$api = API::withUsernameAndPassword($server, $username, $password);

$start = new DateTime('8:00 AM');
$end = new DateTime('9:00 AM');

$request = array(
    'Items' => array(
        'CalendarItem' => array(
            'Start' => $start->format('c'),
            'End' => $end->format('c'),
            'Body' => array(
                'BodyType' => Enumeration\BodyTypeType::HTML,
                '_value' => 'This is <b>the</b> body'
            ),
            'ItemClass' => Enumeration\ItemClassType::APPOINTMENT,
            'Sensitivity' => Enumeration\SensitivityChoicesType::NORMAL,
            'Categories' => array('Testing', 'php-ews'),
            'Importance' => Enumeration\ImportanceChoicesType::NORMAL
        )
    ),
    'SendMeetingInvitations' => Enumeration\CalendarItemCreateOrDeleteOperationType::SEND_TO_NONE
);

$request = Type::buildFromArray($request);
$response = $api->getClient()->CreateItem($request);

测试

测试非常简单,使用我自己的 HttpPlayback 功能即可完成。HttpPlayback 功能基本上是 Guzzle 内置的 History 和 MockResponses 中间件。通过一个选项的切换,你可以选择运行所有 API 调用“实时”(无干扰)、“记录”(实时但将所有响应保存到文件)或“回放”(使用记录文件进行响应,永不访问交换服务器)。这样,你可以有意图地编写测试以击中实时,记录响应,然后轻松地使用它们。你甚至可以有多个 phpunit.xml 文件来在这些选项之间切换,就像这个库所做的那样。以下是运行不同模式的示例

$client = API::withUsernameAndPassword(
    'server',
    'user',
    'password',
    [
        'httpPlayback' => [
            'mode' => 'record',
            'recordLocation' => __ROOT__ . DS . '/recordings.json'
        ]
    ]
);

//Do some API calls here

这会将所有响应记录到 recordings.json 文件中。同样,要回放

$client = API::withUsernameAndPassword(
    'server',
    'user',
    'password',
    [
        'httpPlayback' => [
            'mode' => 'playback',
            'recordLocation' => __ROOT__ . DS . '/recordings.json'
        ]
    ]
);

//Do some API calls here

然后这些调用将从记录文件中回放,允许你在不接触实时服务器的情况下完全测试所有逻辑,同时仍然允许你通过更改模式选项在发布前再次检查它是否真正有效。

版本控制

此组件的版本控制是为了符合 semver 标准。这意味着任何 BC(向后兼容性)破坏都将导致主版本号增加(例如:1.x -> 2.x),而不会导致 BC 破坏的新功能将导致次版本号增加(例如:1.1.x -> 1.2.0),而不会导致新功能或 BC 破坏的错误修复将导致补丁号增加(例如:1.0.0 -> 1.0.1)。例外情况是预 1.0 开发版本,其中次版本号被视为主版本,补丁号被视为补丁和次版本号。这意味着你可以将 composer 锁定为,例如,0.6.*,你将不会收到任何 BC 破坏,因为 BC 破坏将导致次版本号更改。

资源

支持

所有问题都应使用 问题队列。这允许社区为你的问题或问题做出贡献并从中受益。任何发送到我的电子邮件地址的支持请求都将被引导到这里。

贡献

欢迎贡献!

代码贡献

如果你想贡献代码,请在 github 上分叉存储库,并向 master 分支提交拉取请求。建议你在分叉中对更改进行任何更改,然后使用这些更改创建拉取请求。如果你想在外部 git 中获得贡献的认可,请将你的姓名和电子邮件地址(可选)添加到 CONTRIBUTORS.txt 文件中。所有贡献都应遵循 PSR-1PSR-2 编码标准。如果你对还需要完成的事情的列表感兴趣,请查看 TODO.md 文件

文档贡献

如果你想为文档做出贡献,请以文档作为示例向此存储库提交 PR,示例位于 examples/ 文件夹中。我要求你不要更改主页,但其他页面(包括新页面)都是公平的。请为任何更改留下描述性日志消息。