PHPackages                             muensmedia/hyvor-relay - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. muensmedia/hyvor-relay

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

muensmedia/hyvor-relay
======================

A Laravel package for using the hyvor-relay

0.2.3(3mo ago)1463↓66.9%MITPHPPHP ^8.5CI passing

Since Feb 9Pushed 3mo agoCompare

[ Source](https://github.com/muensmedia/hyvor-relay)[ Packagist](https://packagist.org/packages/muensmedia/hyvor-relay)[ RSS](/packages/muensmedia-hyvor-relay/feed)WikiDiscussions main Synced 2d ago

READMEChangelogDependencies (24)Versions (7)Used By (0)

[![Relay Logo](./docs/relay.svg)](./docs/relay.svg)Hyvor Relay Laravel Integration
A full Laravel integration for [Hyvor Relay](https://relay.hyvor.com/).
=======================================================================================================

[](#hyvor-relay-laravel-integrationa-full-laravel-integration-for-hyvor-relay)

This package gives you:

- `hyvor-relay` mail transport driver
- typed Console API client via `HyvorRelay` service + facade
- DTO-based responses and webhook payloads via `spatie/laravel-data`
- webhook route + signature validation middleware
- one Laravel event per Hyvor webhook event
- facade fakes/assertions for tests

Feature Highlights
------------------

[](#feature-highlights)

- Send email through Hyvor Relay transport or Console API
- Manage domains, webhooks, API keys, suppressions, and analytics via facade methods
- Split API keys by use-case: `general`, `send`, `transport`
- Strong typing across requests and responses (DTOs instead of raw arrays)
- Built-in webhook signature helpers: sign + verify
- HTTP preset for package requests (JSON, user-agent, timeout)
- Architecture tests to prevent stray HTTP usage outside `HyvorRelayHttp`

Documentation
-------------

[](#documentation)

Start here for integration details:

- [docs/environment.md](docs/environment.md) - environment variables and API key fallback behavior
- [docs/webhooks.md](docs/webhooks.md) - webhook route, signature validation, and middleware usage
- [docs/webhook-events.md](docs/webhook-events.md) - all webhook events and Laravel listener patterns
- [docs/queueing.md](docs/queueing.md) - retry, backoff, and idempotency recommendations
- [CONTRIBUTING.md](CONTRIBUTING.md) - contributor workflow, commit schema, setup, tests, linting

Requirements
------------

[](#requirements)

- PHP `^8.5`
- Laravel `^12`

Installation
------------

[](#installation)

```
composer require muensmedia/hyvor-relay
php artisan vendor:publish --tag=hyvor-relay-config
```

Configuration
-------------

[](#configuration)

See full env docs here: [docs/environment.md](docs/environment.md)

Minimal setup:

```
HYVOR_RELAY_ENDPOINT="https://relay.hyvor.com"
HYVOR_RELAY_API_KEY_GENERAL=""
```

Optional key split:

- `HYVOR_RELAY_API_KEY_SEND` (Console sends endpoints)
- `HYVOR_RELAY_API_KEY_TRANSPORT` (mail transport)

If optional keys are not set, they fallback to `HYVOR_RELAY_API_KEY_GENERAL`.

Mail Transport Usage
--------------------

[](#mail-transport-usage)

`config/mail.php`:

```
'default' => env('MAIL_MAILER', 'hyvor'),

'mailers' => [
    'hyvor' => [
        'transport' => 'hyvor-relay',
    ],
],
```

Then send as usual with Laravel Mail.

```
use Illuminate\Support\Facades\Mail;

Mail::mailer('hyvor')->to('user@example.com')->send(new \App\Mail\WelcomeMail());
```

This is the preferred path if you already use Laravel Mailables.

Console API Usage (Facade)
--------------------------

[](#console-api-usage-facade)

Use the facade as the package's public API. Actions are internal implementation details. Use this when you want direct API access beyond Laravel Mail transport.

```
use Muensmedia\HyvorRelay\Facades\HyvorRelay;
use Muensmedia\HyvorRelay\Data\Console\Requests\SendEmailPayloadData;

$response = HyvorRelay::sendEmail(SendEmailPayloadData::from([
    'from' => 'app@example.com',
    'to' => 'user@example.com',
    'subject' => 'Welcome',
    'body_text' => 'Hello from Relay',
]), 'welcome-email-123');

$domains = HyvorRelay::getDomains();
$stats = HyvorRelay::getAnalyticsStats('7d');
```

The package exposes facade methods for:

- Sends: send, list, get by ID/UUID
- Domains: list, create, verify, get, delete
- Webhooks: list, create, update, delete, list deliveries
- API keys: list, create, update, delete
- Suppressions: list, delete
- Analytics: stats, sends chart

Webhooks
--------

[](#webhooks)

Default route:

- `POST /api/hyvor-relay/v1/webhook`
- middleware: `VerifyWebhookSignature`
- unknown events return `204`

For each supported Hyvor webhook event, the package dispatches a typed Laravel event with a DTO payload.

- Webhook setup/signature docs: [docs/webhooks.md](docs/webhooks.md)
- Event map + listener examples: [docs/webhook-events.md](docs/webhook-events.md)

Queueing Strategy
-----------------

[](#queueing-strategy)

API calls are synchronous by design. Queueing/retries should be controlled by the consuming app.

Recommended patterns and sample job:

- [docs/queueing.md](docs/queueing.md)

Testing
-------

[](#testing)

Facade fake helpers are included:

```
use Muensmedia\HyvorRelay\Facades\HyvorRelay;

HyvorRelay::fake()->setResponse('verifyWebhookSignature', true);
HyvorRelay::verifyWebhookSignature('{}', 'sig');
HyvorRelay::assertCalled('verifyWebhookSignature');
```

Contributing
------------

[](#contributing)

For local development (Docker and non-Docker), commit schema, tests, and linting commands, see:

- [CONTRIBUTING.md](CONTRIBUTING.md)

License
-------

[](#license)

MIT

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance78

Regular maintenance activity

Popularity18

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 94.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

6

Last Release

116d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/d3951bb83441083ca723fd318d617652649e78e30ee4e50c9739add842bfadec?d=identicon)[muensmedia](/maintainers/muensmedia)

---

Top Contributors

[![LvckyAPI](https://avatars.githubusercontent.com/u/47639297?v=4)](https://github.com/LvckyAPI "LvckyAPI (90 commits)")[![etlam](https://avatars.githubusercontent.com/u/1208133?v=4)](https://github.com/etlam "etlam (5 commits)")

---

Tags

hyvorlaravelmailmail-relayphprelay

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/muensmedia-hyvor-relay/health.svg)

```
[![Health](https://phpackages.com/badges/muensmedia-hyvor-relay/health.svg)](https://phpackages.com/packages/muensmedia-hyvor-relay)
```

###  Alternatives

[craftcms/cms

Craft CMS

3.6k3.6M3.1k](/packages/craftcms-cms)[backpack/crud

Quickly build admin interfaces using Laravel, Bootstrap and JavaScript.

3.4k3.7M223](/packages/backpack-crud)[grumpydictator/firefly-iii

Firefly III: a personal finances manager.

23.9k69.5k](/packages/grumpydictator-firefly-iii)[unopim/unopim

UnoPim Laravel PIM

10.5k2.4k](/packages/unopim-unopim)[binaryk/laravel-restify

Laravel REST API helpers

677415.0k](/packages/binaryk-laravel-restify)[firefly-iii/data-importer

Firefly III Data Import Tool.

8045.8k](/packages/firefly-iii-data-importer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
