garethp/php-ews

PHP Exchange SOAP服务的交互库

安装量: 413,568

依赖: 2

建议者: 0

安全: 0

星标: 112

关注者: 15

分支: 304

开放问题: 81

v0.10.1 2021-09-17 15:21 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",则为"用户"。
  • $password:用户的明文密码。
  • $options:(可选):要传递的一组选项
  • $options['version']:要连接的Exchange服务器版本。有效值可以在ExchangeWebServices::VERSION_*中找到。默认为Exchange 2010。
  • $options['timezone']:用于操作的时区。这不是PHP时区,而是Exchange定义的时区ID。有关更多信息,请参阅https://github.com/Garethp/php-ews/wiki/Exchange-Timezones
  • $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断的bug修复将导致修订号增加(例如: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/文件夹中提供文档作为示例。我请求你不要更改主页,但其他页面(包括新页面)都是公平竞争。请为任何更改留下描述性的日志消息。