{"id":15579259,"url":"https://github.com/andrey-tech/sendpulse-api-php","last_synced_at":"2025-03-29T07:44:57.337Z","repository":{"id":56948077,"uuid":"281588866","full_name":"andrey-tech/sendpulse-api-php","owner":"andrey-tech","description":"Простая обертка на PHP7+ для работы с API сервиса SendPulse с троттлингом запросов и логированием в файл.","archived":false,"fork":false,"pushed_at":"2021-02-08T07:16:52.000Z","size":143,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-03T21:46:05.661Z","etag":null,"topics":["api","api-wrapper","logging","php","php7","sendpulse","throttling"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrey-tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-22T05:59:46.000Z","updated_at":"2023-06-10T21:56:28.000Z","dependencies_parsed_at":"2022-08-21T03:10:30.516Z","dependency_job_id":null,"html_url":"https://github.com/andrey-tech/sendpulse-api-php","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrey-tech%2Fsendpulse-api-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrey-tech%2Fsendpulse-api-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrey-tech%2Fsendpulse-api-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrey-tech%2Fsendpulse-api-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrey-tech","download_url":"https://codeload.github.com/andrey-tech/sendpulse-api-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246156028,"owners_count":20732359,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-wrapper","logging","php","php7","sendpulse","throttling"],"created_at":"2024-10-02T19:14:17.031Z","updated_at":"2025-03-29T07:44:57.315Z","avatar_url":"https://github.com/andrey-tech.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SendPulse API PHP Wrapper\n\n![SendPulse logo](./assets/sendpulse-logo.png)  \n[![Latest Stable Version](https://poser.pugx.org/andrey-tech/sendpulse-api-php/v)](https://packagist.org/packages/andrey-tech/sendpulse-api-php)\n[![Total Downloads](https://poser.pugx.org/andrey-tech/sendpulse-api-php/downloads)](https://packagist.org/packages/andrey-tech/sendpulse-api-php)\n[![License](https://poser.pugx.org/andrey-tech/sendpulse-api-php/license)](https://packagist.org/packages/andrey-tech/sendpulse-api-php)\n\nПростая обертка на PHP7+ для работы с [REST API](https://sendpulse.com/ru/integrations/api) сервиса SendPulse с троттлингом запросов,\nвыводом отладочной информации в STDOUT и логированием в файл.\n\n# Содержание\n\n\u003c!-- MarkdownTOC levels=\"1,2,3,4,5,6\" autoanchor=\"true\" autolink=\"true\" --\u003e\n\n- [Требования](#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)\n- [Установка](#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)\n- [Класс `SendPulseAPI`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-sendpulseapi)\n    - [Авторизация пользователя](#%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F)\n        - [Хранение токена](#%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%B0)\n            - [Интерфейс `TokenStorageInterface`](#%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-tokenstorageinterface)\n            - [Класс `TokenStorage`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-tokenstorage)\n            - [Использование собственного класса для сохранения токенов](#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%BE%D0%B2)\n    - [Методы для работы с адресными книгами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%D0%BC%D0%B8)\n    - [Методы для работы с кампаниями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8)\n    - [Методы для работы с шаблонами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%D0%BC%D0%B8)\n    - [Методы для работы с SMTP сервисом](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-smtp-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%BC)\n    - [Вспомогательные методы класса](#%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)\n- [Вспомогательные классы](#%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B)\n    - [Класс `HTTP`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-http)\n        - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B)\n        - [Пример использования класса](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)\n        - [Примеры отладочных сообщений](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D1%8B%D1%85-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9)\n    - [Класс `DebugLogger`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-debuglogger)\n        - [Методы класса](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)\n        - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-1)\n        - [Пример использования класса](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-1)\n        - [Пример результатов логирования](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)\n        - [Формат заголовков лога](#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B0)\n- [Автор](#%D0%90%D0%B2%D1%82%D0%BE%D1%80)\n- [Лицензия](#%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F)\n\n\u003c!-- /MarkdownTOC --\u003e\n\n\u003ca id=\"%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\"\u003e\u003c/a\u003e\n## Требования\n\n- PHP \u003e= 7.0;\n- класс [`HTTP`](https://github.com/andrey-tech/http-client-php) \u003e= 3.0 - НТТР(S) клиент с троттлингом запросов, поддержкой маркера BOM в теле сообщения формата JSON и выводом отладочной информации о запросах и ответах в STDOUT;\n- класс [`DebugLogger`](https://github.com/andrey-tech/debug-logger-php) \u003e= 2.0 - логгер, сохраняющий отладочную информацию в файл вместе с данными об объеме используемой оперативной памяти и прошедшем времени;\n- произвольный автозагрузчик классов, реализующий стандарт [PSR-4](https://www.php-fig.org/psr/psr-4/).\n\n\u003ca id=\"%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0\"\u003e\u003c/a\u003e\n## Установка\n\nУстановка через composer:\n```\n$ composer require andrey-tech/sendpulse-api-php:\"^1.1\"\n```\n\nили добавить\n\n```\n\"andrey-tech/sendpulse-api-php\": \"^1.1\"\n```\n\nв секцию require файла composer.json.\n\n\u003ca id=\"%D0%9A%D0%BB%D0%B0%D1%81%D1%81-sendpulseapi\"\u003e\u003c/a\u003e\n## Класс `SendPulseAPI`\n\nДля работы с REST API SendPulse используется класс `\\App\\SendPulse\\SendPulseAPI`.  \nПри возникновении ошибок выбрасывается исключение класса `\\App\\SendPulse\\SendPulseAPIException`.  \nВ настоящее в классе частично реализованы методы для работы со следующими сервисами SendPulse:\n\n- [Email сервис](https://sendpulse.com/ru/integrations/api/bulk-email)\n- [SMTP сервис](https://sendpulse.com/ru/integrations/api/smtp)\n\n\u003ca id=\"%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F\"\u003e\u003c/a\u003e\n### Авторизация пользователя\n\nМетоды для авторизации пользователя находится в трейте `\\App\\SendPulse\\Auth`:\n\n - `auth(string $clientId, string $clientSecret) :string` Выполняет авторизацию клиента и возвращает персональный ключ (токен), \n    который также сохраняется в хранилище токенов.\n    * `$clientId` - ID клиента (пользователя);\n    * `$clientSecret` - секрет клиента (пользователя).\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\nПолучение нового токена, по истечении его срока действия, происходит автоматически,\nкогда в ответ на запрос к API SendPulse возвращается ответ с HTTP-статусом `401 Unauthorized`.\n\n\u003ca id=\"%D0%A5%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%B0\"\u003e\u003c/a\u003e\n#### Хранение токена\n\nСохранение и загрузка токена выполняется с помощью классов, реализующих интерфейс `\\App\\SendPulse\\TokenStorage\\TokenStorageInterface`.\n\n\u003ca id=\"%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-tokenstorageinterface\"\u003e\u003c/a\u003e\n##### Интерфейс `TokenStorageInterface`\n\nИнтерфейс `\\App\\SendPulse\\TokenStorage\\TokenStorageInterface` определяет два метода:\n\n- `save(string $token, string $clientId, string $clientSecret) :void` Сохраняет токен.\n    * `$token` - токен;\n    * `$clientId` - ID клиента;\n    * `$clientSecret` - секрет клиента.\n- `load(string $clientId, string $clientSecret) :?string` Загружает токен и возвращает его.\n    Метод должен возвращать `null`, когда сохраненный токен отсутствует.\n    * `$clientId` - ID клиента;\n    * `$clientSecret` - секрет клиента.\n- `hasToken(string $clientId, string $clientSecret) :bool` Проверяет существование токена для заданного сочетания `$clientId` и `$clientSecret`.\n    * `$clientId` - ID клиента;\n    * `$clientSecret` - секрет клиента.\n\n\u003ca id=\"%D0%9A%D0%BB%D0%B0%D1%81%D1%81-tokenstorage\"\u003e\u003c/a\u003e\n##### Класс `TokenStorage`\n\nПо умолчанию для сохранения и загрузки токенов используется класс `\\App\\SendPulse\\TokenStorage\\TokenStorage`,\nкоторый хранит токены в отдельных файлах для каждого сочетания `$clientId` и `$clientSecret`, использованного при авторизации в методе `auth()`.\nКласс реализует интерфейс `\\App\\SendPulse\\TokenStorage\\TokenStorageInterface` и содержит собственные методы:\n\n- `__construct(string $storageFolder = 'tokens/')` Конструктор класса.\n    * `$storageFolder` - каталог для хранения файлов токенов.\n\nДополнительные параметры устанавливаются через публичные свойства класса `\\App\\SendPulse\\TokenStorage\\TokenStorage`:\n\nСвойство                | По умолчанию  | Описание\n----------------------- | ------------- | --------\n`$mkdirMode`            | 0755          | Устанавливает режим доступа для создаваемого каталога файлов с токенами\n\nПри возникновении ошибок выбрасыватся исключение класса `\\App\\SendPulse\\TokenStorage\\TokenStorageException`. \n\n\u003ca id=\"%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%BE%D0%B2\"\u003e\u003c/a\u003e\n##### Использование собственного класса для сохранения токенов\n\nПример использования собственного класса для сохранения токенов в базе данных:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n\n    // Устанавливаем собственный объект класса, обеспечивающего хранение токенов в базе данных\n    $sendPulse-\u003etokenStorage = new \\App\\SendPulse\\TokenStorage\\DatabaseStorage();\n\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\nСтруктура собственного класса `\\App\\SendPulse\\TokenStorage\\DatabaseStorage`:\n\n```php\nnamespace App\\SendPulse\\TokenStorage;\n\nclass DatabaseStorage implements TokenStorageInterface\n{\n    /**\n     * Сохраняет токен\n     * @param string  $token Токен\n     * @param string $clientId ID клиента\n     * @param string $clientSecret Секрет клиента\n     * @return void\n     * @throws TokenStorageException\n     */\n    public function save(string $token, string $clientId, string $clientSecret)\n    {\n        // Здесь токен сохраняется в базе данных\n    }\n\n    /**\n     * Загружает токен\n     * @param string $clientId ID клиента\n     * @param string $clientSecret Секрет клиента\n     * @return array|null\n     * @throws TokenStorageException\n     */\n    public function load(string $clientId, string $clientSecret)\n    {\n        // Здесь токен извлекается из базы данных\n    }\n\n    /**\n     * Проверяет существуют ли токен для заданного ID клиента и секрета клиента\n     * @param string $clientId ID клиента\n     * @param string $clientSecret Секрет клиента\n     * @return bool\n     * @throws TokenStorageException\n     */\n    public function hasToken(string $clientId, string $clientSecret): bool\n    {\n        // Здесь проверяется существование токена в базе данных\n    }\n}\n```\n\n\u003ca id=\"%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%D0%BC%D0%B8\"\u003e\u003c/a\u003e\n### Методы для работы с адресными книгами\n\nМетоды для работы с адресными книгами находятся в трейте `\\App\\SendPulse\\Addressbooks`:\n\n- `getAddressbook(int $id) :array` [Возвращает информацию об адресной книге](https://sendpulse.com/ru/integrations/api/bulk-email#list-info).\n    * `$id` - ID адресной книги.\n- `getAddressbooks(int $limit = null, int $offset = null) :array` [Возвращает список адресных книг](https://sendpulse.com/ru/integrations/api/bulk-email#lists-list) (не более 100).\n    * `$limit` - количество записей;\n    * `$offset` - смещение выдачи (начиная с какой записи показывать).\n- `getAllAddressbooks() :\\Generator` Позволяет получить список всех адресных книг, возвращая генератор.\n- `addAddressbook(array $params) :int` [Добавляет адресную книгу](https://sendpulse.com/ru/integrations/api/bulk-email#create-list) и возвращает ID адресной книги.\n    * `$params` - параметры адресной книги.\n- `updateAddressbook(int $id, array $params) :array` [Обновляет адресную книгу](https://sendpulse.com/ru/integrations/api/bulk-email#edit-list).\n    * `$id` - ID адресной книги;\n    * `$params` - параметры адресной книги.\n- `deleteAddressbook(int $id) :array` [Удаляет адресную книгу](https://sendpulse.com/ru/integrations/api/bulk-email#delete-list).\n    * `$id` - ID адресной книги.\n- `addAddressbookEmails(int $id, array $emails) :array` [Добавляет email адреса в адресную книгу](https://sendpulse.com/ru/integrations/api/bulk-email#add-email).\n    * `$id` - ID адресной книги;\n    * `$emails` - список email адресов или параметры контактов.\n- `deleteAddressbookEmails(int $id, array $emails) :array` [Удаляет email адреса из адресной книги](https://sendpulse.com/ru/integrations/api/bulk-email#delete-email)\n    * `$id` - ID адресной книги;\n    * `$emails` - список email адресов.\n- `getAddressbookEmails(int $id, int $limit = null, int $offset = null) :array` [Возвращает список email адресов в адресной книге](https://sendpulse.com/ru/integrations/api/bulk-email#list-emails) (не более 100).\n    * `$id` - ID адресной книги;\n    * `$limit` - количество записей;\n    * `$offset` - смещение выдачи (начиная с какой записи показывать).\n- `getAllAddressbookEmails(int $id) :\\Generator` Позволяет получить список всех email адресов в адресной книге, возвращая генератор.\n    * `$id` - ID адресной книги.\n- `getAddressbookEmailsTotal(int $id) :int` [Возвращает общее количество email адресов в адресной книге](https://sendpulse.com/ru/integrations/api/bulk-email#get_total_addresses).\n    * `$id` - ID адресной книги.\n- `getAddresbookVariables(int $id) :array` [Возвращает список переменных для адресной книги](https://sendpulse.com/ru/integrations/api/bulk-email#variables).\n    * `$id` - ID адресной книги.\n\nПримеры работы с адресными книгами:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Загружаем все адресные книги\n    $num = 0;\n    $generator = $sendPulse-\u003egetAllAddressbooks();\n    foreach ($generator as $addressbooks) {\n        foreach ($addressbooks as $addressbook) {\n            $num++;\n            echo \"[{$num}] {$addressbook['id']}: {$addressbook['name']}\" . PHP_EOL;\n        }\n    }\n\n    // Получаем информацию об адресной книге по ID книги\n    $addressbookId = 20143254;\n    $response = $this-\u003egetAddressbook($addressbookId);\n    print_r($response);\n\n    // Добавляем новую адресную книгу\n    $addressbookId = $sendPulse-\u003eaddAddressbook([\n        'bookName' =\u003e 'Тестовая адресная книга'\n    ]);\n    print_r($addressbookId);\n\n    // Формируем список контактов для адресной книги\n    $emails = [\n        [\n            'email' =\u003e 'test1@example.com',\n            'variables' =\u003e [\n                'Name' =\u003e 'Тест контакт 1',\n                'Phone' =\u003e '+79450000001'\n            ]\n        ],\n        [\n            'email' =\u003e 'test2@example.com',\n            'variables' =\u003e [\n                'Name' =\u003e 'Тест контакт 2',\n                'Phone' =\u003e '+79450000002'\n            ]\n        ],\n        [\n            'email' =\u003e 'test3@example.com',\n            'variables' =\u003e [\n                'Name' =\u003e 'Тест контакт 3',\n                'Phone' =\u003e '+79450000003'\n            ]\n        ]\n    ];\n\n    // Добавляем контакты в адресную книгу\n    $response = $sendPulse-\u003eaddAddressbookEmails($addressbookId, $emails);\n    print_r($response);\n\n    // Получаем первые 100 контактов из адресной книги\n    $response = $sendPulse-\u003egetAddressbookEmails($addressbookId);\n    print_r($response);\n\n    // Получаем количество email адресов в адресной книге\n    $response = $sendPulse-\u003egetAddressbookEmailsTotal($addressbookId);\n    print_r($response);\n\n    // Получаем список переменных для адресной книги\n    $response = $sendPulse-\u003egetAddresbookVariables($addressbookId);\n    print_r($response);\n\n    // Удаляем адресную книгу\n    $response = $sendPulse-\u003edeleteAddressbook($addressbookId);\n    print_r($response);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8\"\u003e\u003c/a\u003e\n### Методы для работы с кампаниями\n\nМетоды для работы с кампаниями находятся в трейте `\\App\\SendPulse\\Campaigns`:\n\n- `getCampaign(int $id) :array` [Возвращает информацию о кампании](https://sendpulse.com/ru/integrations/api/bulk-email#campaign-info).\n    * `$id` - ID кампании;\n- `getCampaigns(int $limit = null, int $offset = null) :array` [Возвращает список кампаний](https://sendpulse.com/ru/integrations/api/bulk-email#campaigns-list) (не более 100).\n    * `$limit` - количество записей;\n    * `$offset` - смещение выдачи (начиная с какой записи показывать).\n- `getAllCampaigns() :\\Generator` Позволяет получить список всех кампаний, возвращая генератор.\n- `addCampaign(array $params) :int` [Добавляет кампанию](https://sendpulse.com/ru/integrations/api/bulk-email#create-campaign) и возвращает ID кампании.\n    * `$params` - параметры кампании.\n- `updateCampaign(int $id, array $params) :array` [Обновляет запланированную кампанию](https://sendpulse.com/ru/integrations/api/bulk-email#edit-campaign).\n    * `$id` - ID кампании;\n    * `$params` - параметры кампании.\n- `deleteCampaign(int $id) :array` [Отменяет отправку запланированной кампании](https://sendpulse.com/ru/integrations/api/bulk-email#cancel-send).\n    * `$id` - ID кампании.\n- `getAddressbookCampaigns(int $id, int $limit = null, int $offset = null) :array` [Возвращает список кампаний, которые создавались по данной адресной книге](https://sendpulse.com/ru/integrations/api/bulk-email#campaigns-list_book) (не более 100).\n    * `$id` - ID адресной книги;\n    * `$limit` - количество записей;\n    * `$offset` - смещение выдачи (начиная с какой записи показывать).\n- `getAllAddressbookCampaigns(int $id) :\\Generator` Позволяет получить список всех кампаний, которые создавались по данной адресной книге, возвращая генератор.\n    * `$id` - ID адресной книги.\n\nПримеры работы с кампаниями:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Получаем список все кампаний\n    $num = 0;\n    $generator = $sendPulse-\u003egetAllCampaigns();\n    foreach ($generator as $campaigns) {\n        foreach ($campaigns as $campaign) {\n            $num++;\n            echo \"[{$num}] {$campaign['id']}: {$campaign['name']}\" . PHP_EOL;\n        }\n    }\n\n    // Получаем информацию о кампании по ID кампании\n    $campaignId = 21058230;\n    $response = $this-\u003egetCampaign($campaignId);\n    print_r($response);\n\n    // Формируем параметры новой кампании\n    $sendTime = new DateTime();\n    $sendTime-\u003eadd(new DateInterval(\"PT30M\"));\n    $params = [\n        'sender_name'  =\u003e 'Тестовый отправитель',\n        'sender_email' =\u003e 'test@example.com',\n        'name'         =\u003e 'Тестовая рассылка',\n        'subject'      =\u003e 'Тестовая рассылка',\n        'template_id'  =\u003e 2308544,\n        'list_id'      =\u003e 79093323,\n        'send_date'    =\u003e $sendTime-\u003eformat('Y-m-d H:i:s')\n    ];\n\n    // Добавляем новую кампанию\n    $campaignId = $sendPulse-\u003eaddCampaign($params);\n    print_r($campaignId);\n\n    // Отменяем отправку запланированной кампании\n    $response = $sendPulse-\u003edeleteCampaign($campaignId);\n    print_r($response);\n\n    // Получаем список всех кампаний, которые создавались по данной адресной книге\n    $num = 0;\n    $addressbookId = 20143254;\n    $generator = $sendPulse-\u003egetAllAddressbookCampaigns($addressbookId);\n    foreach ($generator as $campaigns) {\n        foreach ($campaigns as $campaign) {\n            $num++;\n            echo \"[{$num}] {$campaign['id']}: {$campaign['name']}\" . PHP_EOL;\n        }\n    }\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%D0%BC%D0%B8\"\u003e\u003c/a\u003e\n### Методы для работы с шаблонами\n\nМетоды для работы с шаблонами находятся в трейте `\\App\\SendPulse\\Templates`:\n\n- `getTemplate(int $id) :array` [Возвращает информацию о шаблоне](https://sendpulse.com/ru/integrations/api/bulk-email#template-id).\n    * `$id` - ID шаблона.\n- `getTemplates(string $owner = null, string $lang = null) :array` [Возвращает список шаблонов](https://sendpulse.com/ru/integrations/api/bulk-email#template-list) с возможностью фильтрации.\n    * `$owner` - фильтр по владельцу шаблона (`me` - пользовательские шаблоны, `sendpulse` - системные шаблоны);\n    * `$lang` - фильтр по языку шаблона (`ru`, `en`).\n- `addTemplate(array $params) :int` [Добавляет шаблон](https://sendpulse.com/ru/integrations/api/bulk-email#create-template) и возвращает real ID шаблона.\n    * `$params` - параметры шаблона.\n- `updateTemplate(int $id, array $params) :array` [Обновляет шаблон](https://sendpulse.com/ru/integrations/api/bulk-email#edit-template).\n    * `$id` - ID шаблона;\n    * `$params` - параметры шаблона.\n\nПримеры работы с шаблонами:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Получаем список всех собственных шаблонов\n    $response = $sendPulse-\u003egetTemplates($owner = 'me');\n    $num = 0;\n    foreach ($response as $tpl) {\n        $num++;\n        echo \"[{$num}] {$tpl['real_id']}: {$tpl['name']}\" . PHP_EOL;\n    }\n\n    // Получаем информацию о шаблоне\n    $templateId = 1318345;\n    $response = $sendPulse-\u003egetTemplate($templateId);\n    print_r($response);\n\n    // Формируем параметры нового шаблона\n    $params = [\n        'name' =\u003e 'Тестовый шаблон',\n        'body' =\u003e 'PHA+RXhhbXBsZSB0ZXh0PC9wPg==',\n        'lang' =\u003e 'ru'\n    ];\n\n    // Добавляем шаблон\n    $templateId = $sendPulse-\u003eaddTemplate($params);\n    print_r($templateId);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-smtp-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%BC\"\u003e\u003c/a\u003e\n### Методы для работы с SMTP сервисом\n\nМетоды для работы с SMTP сервисом находятся в трейте `\\App\\SendPulse\\Smtp`:\n\n- `sendEmails(array $params) :array` [Отправляет письмо](https://sendpulse.com/ru/integrations/api/smtp#send-email-smtp).\n  * `$params` - параметры письма.\n\nПримеры работы с SMTP сервисом:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Формируем параметры письма\n    $params = [\n        'email' =\u003e [\n            'html'=\u003e 'PHA+RXhhbXBsZSB0ZXh0PC9wPg==',\n            'text' =\u003e \"Текст письма\",\n            'subject' =\u003e 'Тестовое письмо',\n            'from' =\u003e [\n                'name' =\u003e 'Тестовый отправитель',\n                'email' =\u003e 'sender@example.com'\n            ],\n        ],\n        'to' =\u003e [\n            [\n                'name' =\u003e 'Тестовый получатель',\n                'email' =\u003e 'recipient1@example.com'\n            ]\n        ]\n    ];\n\n    // Отправляем письмо\n    $response = $sendPulse-\u003esendEmails($params);\n    print_r($response);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0\"\u003e\u003c/a\u003e\n###  Вспомогательные методы класса\n\n- `getLastResponse()` Возвращает последний ответ API SendPulse.\n- `request(string $method, string $path, array $params = []) ?array` Отправляет запрос в API SendPulse и возвращает ответ.\n    * `$method` - метод запроса (GET, POST, PATCH, PUT, DELETE);\n    * `$path` - путь в URL запроса;\n    * `$params` - параметры запроса.\n- `getAll(Closure $closure) :\\Generator` Позволяет загрузить все сущности заданного типа, возвращая генератор.\n    * `$closure` - анонимная функция-замыкание для загрузки сущностей: `$closure(int $offset)`, где `$offset` - смещение выдачи.\n\nПримеры использования вспомогательных методов:\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Получаем черный список email адресов\n    $response = $sendPulse-\u003erequest('GET', '/blacklist');\n    print_r($response);\n\n    // Получаем список всех отправленных писем\n    $generator = $sendPulse-\u003egetAll(function ($offset) use ($sendPulse) {\n        return $sendPulse-\u003erequest('GET', '/smtp/emails', [ 'offset' =\u003e $offset ]);\n    });\n    $num = 0;\n    foreach ($generator as $emails) {\n        foreach ($emails as $email) {\n            $num++;\n            echo \"[{$num}] {$email['smtp_answer_code_explain']} {$email['recipient']}\" . PHP_EOL;\n        }\n    }\n\n    // Получаем последний ответ API SendPulse\n    $response = $sendPulse-\u003egetLastResponse();\n    print_r($response);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B\"\u003e\u003c/a\u003e\n## Вспомогательные классы\n\n\u003ca id=\"%D0%9A%D0%BB%D0%B0%D1%81%D1%81-http\"\u003e\u003c/a\u003e\n### Класс `HTTP`\n\nКласс [`\\App\\HTTP\\HTTP`](https://github.com/andrey-tech/http-client-php) обеспечивает:\n\n- формирование POST запросов к API SendPulse по протоколу HTTPS;\n- троттлинг запросов к API на требуемом уровне - [не более 10-и запросов в секунду](https://sendpulse.com/ru/integrations/api#description);\n- вывод отладочной информации о запросах к API в STDOUT.\n\nПри возникновении ошибок выбрасывается исключение с объектом класса `\\App\\HTTP\\HTTPException`.\n\n\u003ca id=\"%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B\"\u003e\u003c/a\u003e\n#### Дополнительные параметры\n\nДополнительные параметры устанавливаются через публичные свойства объекта класса `\\App\\HTTP\\HTTP`:\n\nСвойство                | По умолчанию            | Описание\n----------------------- | ----------------------- | --------\n`$debugLevel`           | `\\App\\HTTP\\HTTP::DEBUG_NONE` | Устанавливает уровень вывода отладочной информации о запросах в STDOUT (битовая маска, составляемая из значений DEBUG_NONE, DEBUG_URL, DEBUG_HEADERS, DEBUG_CONTENT)\n`$throttle`             | 0                       | Максимальное число HTTP запросов в секунду (0 - троттлинг отключен)\n`$addBOM`               | false                   | Добавлять [маркер ВОМ](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2) UTF-8 (EFBBBF) к запросам в формате JSON\n`$useCookies`           | false                   | Использовать cookies в запросах\n`$cookieFile`           | 'temp/cookies.txt'      | Путь к файлу для хранения cookies\n`$verifySSLCertificate` | true                    | Включить проверку SSL/TLS-сертификата сервера\n`$SSLCertificateFile`   | 'cacert.pem'            | Устанавливает файл SSL/TLS-сертификатов X.509 корневых удостоверяющих центров (CA) в формате РЕМ (установка в null означает использовать файл, указанный в параметре [curl.cainfo](https://www.php.net/manual/ru/curl.configuration.php) файла php.ini)\n`$userAgent`            | 'HTTP-client/3.x.x'     | Устанавливает НТТР заголовок UserAgent в запросах\n`$curlConnectTimeout`   | 60                      | Устанавливает таймаут соединения, секунды\n`$curlTimeout`          | 60                      | Устанавливает таймаут обмена данными, секунды\n`$successStatusCodes`   | [ 200 ]                 | Коды статуса НТТР, соответствующие успешному выполнению запроса\n\n\u003ca id=\"%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0\"\u003e\u003c/a\u003e\n#### Пример использования класса\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\nuse App\\HTTP\\HTTP;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n\n    // Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT\n    $sendPulse-\u003ehttp-\u003edebugLevel = HTTP::DEBUG_URL |  HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT;\n\n    // Устанавливаем троттлинг запросов на уровне не более 1 запроса в секунду\n    $sendPulse-\u003ehttp-\u003ethrottle = 1;\n\n    // Устанавливаем таймаут обмена данными c API в 30 секунд\n    $sendPulse-\u003ehttp-\u003ecurlTimeout = 30;\n\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Получаем список отправителей email\n    $response = $sendPulse-\u003erequest('GET', '/senders');\n    print_r($response);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\u003ca id=\"%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D1%8B%D1%85-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9\"\u003e\u003c/a\u003e\n#### Примеры отладочных сообщений\n\n```\n[1] ===\u003e GET https://api.sendpulse.com/addressbooks\nGET /addressbooks HTTP/2\nHost: api.sendpulse.com\nuser-agent: HTTP-client/3.x.x\naccept: */*\nauthorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiI\n\n\n[1] \u003c=== RESPONSE 0.4566s (200)\nHTTP/2 200\nserver: nginx/1.14.0 (Ubuntu)\ndate: Mon, 08 Feb 2021 06:45:38 GMT\ncontent-type: application/json\nvary: Accept-Encoding\nx-powered-by: PHP/7.1.33\ncache-control: private, must-revalidate\npragma: no-cache\nexpires: -1\naccess-control-allow-origin: *\naccess-control-allow-methods: GET, POST, DELETE, PUT, OPTIONS\naccess-control-allow-headers: Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range\naccess-control-expose-headers: Content-Length,Content-Range\nx-sp-pr: lpr8\n\n[{\"id\":89206572,\"name\":\"Addressbook 1\",\"all_email_qty\":694,\"active_email_qty\":693,\"inactive_email_qty\":0,\"creationdate\":\"2021-02-05 08:48:44\",\"status\":0,\"status_explain\":\"Active\"}\n```\n\n\n\u003ca id=\"%D0%9A%D0%BB%D0%B0%D1%81%D1%81-debuglogger\"\u003e\u003c/a\u003e\n### Класс `DebugLogger`\n\nКласс [`\\App\\DebugLogger\\DebugLogger`](https://github.com/andrey-tech/debug-logger-php) обеспечивает логирование запросов и ответов к API SendPulse в файл.  \nПри возникновении ошибок выбрасывается исключение с объектом класса `\\App\\DebugLogger\\DebugLoggerException`. \n\n\u003ca id=\"%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0\"\u003e\u003c/a\u003e\n#### Методы класса\n\n- `static instance(string $logFileName = 'debug.log') :self`  \n    Возвращает единственный объект данного класса **для заданного лог-файла** `$logFileName`.\n    + `$logFileName` - имя лог-файла.\n- `save(mixed $info, object $object = null, string $header = null) :void` Сохраняет подлежащую логированию информацию в файл.\n    + `$info` - строка, массив или объект для логирования;\n    + `$object` - ссылка на объект класса в котором выполняется логирование;\n    + `$header` - строка заголовка для сохраняемой в лог файл информации.\n\n\u003ca id=\"%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-1\"\u003e\u003c/a\u003e\n#### Дополнительные параметры\n\nДополнительные параметры устанавливаются через публичные свойства класса `\\App\\DebugLogger\\DebugLogger`:\n\nНестатическое свойство  | По умолчанию  | Описание\n----------------------- | ------------- | --------\n`$isActive`             | false         | Включает или выключает логирование для конкретного файла, задаваемого параметром `$logFileName` метода `instance()`\n\nСтатическое свойство    | По умолчанию  | Описание\n----------------------- | ------------- | --------\n`$logFileDir`           | `temp/`       | Устанавливает каталог, в котором сохраняются лог-файлы\n`mkdirMode`             | 0755          | Устанавливает режим доступа для создаваемых каталогов для хранения лог файлов в виде восьмеричного числа\n`$uniqIdLength`         | 7             | Длина уникального буквенно-цифрового [a-z0-9]+ идентификатора объекта класса `DebugLogger` для сохранения в лог файле,  позволяющего находить записи, созданные одним и тем же процессом\n\n\u003ca id=\"%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0-1\"\u003e\u003c/a\u003e\n#### Пример использования класса\n\n```php\nuse App\\SendPulse\\SendPulseAPI;\nuse App\\SendPulse\\SendPulseAPIException;\nuse App\\SendPulse\\TokenStorage\\TokenStorageException;\nuse App\\DebugLogger\\DebugLogger;\n\ntry {\n    $clientId = 'acbdef0123456789abcdef0123456789';\n    $clientSecret = 'acbdef0123456789abcdef0123456789';\n\n    $sendPulse = new SendPulseAPI();\n\n    // Устанавливаем каталог для сохранения лог файлов\n    DebugLogger::$logFileDir = 'logs/';\n\n    // Создаем объект класса логирования\n    $logFileName = 'debug_sendpulseapi.log';\n    $logger = DebugLogger::instance($logFileName);\n\n    // Включаем логирование\n    $logger-\u003eisActive = true;\n\n    // Устанавливаем логгер\n    $sendPulse-\u003esetLogger($logger);\n\n    $sendPulse-\u003eauth($clientId, $clientSecret);\n\n    // Получаем список отправителей email\n    $response = $sendPulse-\u003erequest('GET', '/senders');\n    print_r($response);\n\n} catch (SendPulseAPIException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (TokenStorageException $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n} catch (Exception $e) {\n    printf('Ошибка (%d): %s' . PHP_EOL, $e-\u003egetCode(), $e-\u003egetMessage());\n}\n```\n\n\u003ca id=\"%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\"\u003e\u003c/a\u003e\n#### Пример результатов логирования\n\n```\n*** cb8lim0 [2021-02-08 06:30:06.701680 +00:00 Δ0.000981 s, 0.65/2.00 MiB] ********************\n* Class: App\\SendPulse\\SendPulseAPI\nЗАПРОС: POST /oauth/access_token\n{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"11111111111111111111111111111\",\n    \"client_secret\": \"22222222222222222222222222222\"\n}\n\n*** cb8lim0 [2021-02-08 06:30:06.920716 +00:00 Δ0.219036 s, 0.65/2.00 MiB] ********************\n* Class: App\\SendPulse\\SendPulseAPI\nОТВЕТ: POST /oauth/access_token\n{\n    \"token_type\": \"Bearer\",\n    \"expires_in\": 3600,\n    \"access_token\": \"3333333333333333333333333333333333\"\n}\n```\n\n\u003ca id=\"%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B0\"\u003e\u003c/a\u003e\n#### Формат заголовков лога\n\n```\n*** cb8lim0 [2021-02-08 06:30:06.920716 +00:00 Δ0.219036 s, 0.65/2.00 MiB] ********************\n* Class: App\\SendPulse\\SendPulseAPI\n```\n\n- `cb8lim0` - уникальный буквенно-цифровой [a-z0-9]+ идентификатор объекта класса `DebugLogger`, позволяющий находить в лог файле записи, созданные одним и тем же процессом;\n- `2021-02-08 06:30:06.920716 +00:00` - дата и время сохранения информации с точностью до микросекунд;\n- `Δ0.219036 s` - время, прошедшее с момента предыдущего сохранения информации в секундах и микросекундах;\n- `0.65/2.00 MiB` - данные об используемой оперативной памяти в единицах количества информации с [двоичными приставками](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8):\n    + `0.65` - максимальный объем памяти, который был выделен PHP-скрипту системой;\n    + `2.00` - реальный объем памяти, выделенный PHP-скрипту системой;\n- 'Class: App\\SendPulse\\SendPulseAPI' - полное имя класса из которого сделано сохранение в лог файл.\n\n\u003ca id=\"%D0%90%D0%B2%D1%82%D0%BE%D1%80\"\u003e\u003c/a\u003e\n## Автор\n\n© 2020-2021 andrey-tech\n\n\u003ca id=\"%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F\"\u003e\u003c/a\u003e\n## Лицензия\n\nДанный код распространяется на условиях лицензии [MIT](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrey-tech%2Fsendpulse-api-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrey-tech%2Fsendpulse-api-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrey-tech%2Fsendpulse-api-php/lists"}