v0.10.7 2021-02-01 09:50 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”,如果电子邮件地址是 "user@example.com"。
  • $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内嵌的历史记录和模拟响应中间件。通过一个选项的切换,您可以运行所有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上的仓库中进行Fork,并向master分支提交一个pull request。建议您在单独的分支中更改您的Fork,然后使用该分支进行pull request。如果您希望在git之外获得贡献的认可,请将您的姓名和电子邮件地址(可选)添加到CONTRIBUTORS.txt文件中。所有贡献都应遵循PSR-1PSR-2编码标准。如果您对还需要完成的事情的列表感兴趣,请查看TODO.md文件

贡献文档

如果您想为文档做出贡献,请在此仓库中对文档进行PR,以examples/文件夹中的文档为例。我请求您不要更改主页,但其他页面(包括新页面)都是公平的。请为任何您所做的更改留下描述性的日志消息。