welp/mailjet-bundle
Symfony bundle for integrating the Mailjet email API, providing configurable transport, event handling, and Laravel-style mailer support.
Architecture fit — poor, and the framing needs correcting first. welp/mailjet-bundle is a Symfony bundle, not a Laravel package. It ships a Bundle subclass, a DI extension, a configuration tree, and service definitions bound to Symfony's container. Laravel has no bundle registration mechanism, no config/packages/*.yaml merge pipeline, and no autoconfigured service tags. Nothing here drops into a Laravel app the way a service-provider package does; you would be installing Symfony kernel-adjacent machinery for a mail transport, which is a bad trade at any scale.
What is reusable is the small amount of logic underneath: a thin service object wrapping mailjet/mailjet-apiv3-php, translating send requests into Mailjet v3 REST calls and mapping the response payload back. That is roughly a day of work to reproduce idiomatically. Treat this repository as a reference implementation, not a dependency.
Integration feasibility — high as a pattern, low as a package. Three viable routes, in order of preference:
symfony/mailjet-mailer). Laravel 9+ uses Symfony Mailer internally, so a mailjet+api://KEY:SECRET@default DSN can be wired through Laravel's mail layer with a custom transport resolver. Officially maintained, no bundle baggage.mailjet/mailjet-apiv3-php adapter behind a MailTransport interface, injected via a Laravel service provider and facade. Maximum control over retries, logging, and template handling.Technical risk — elevated and concentrated in maintenance, not correctness. Last release 2019-06-17. 33 stars and zero dependents means effectively no community validation and no downstream pressure to keep it working. PHP constraint is almost certainly pre-8.0 and the Symfony constraint pre-5.x; verify against composer.json before anything else. Because Laravel itself depends on modern symfony/* components (console, http-foundation, mailer, process), a bundle pinning symfony/http-kernel ^2.8|^3.0 will produce an unsatisfiable dependency graph rather than a runtime failure — a clean rejection, but one that blocks the entire install. There is no CI signal, no security advisory history, and no evidence of PHP 8 compatibility. Bus factor is effectively one small agency.
Key questions to resolve before committing engineering time:
symfony/* constraints does its composer.json actually declare? (Determines whether this is even installable.)mailjet-apiv3-php version does it pin, and does that version support PHP 8.2/8.3?Stack fit — none directly; adapt rather than adopt. A Symfony bundle in a Laravel codebase adds a second, parallel configuration and container model. Even where it technically boots, you inherit two idioms for one concern.
Migration path (if the bundle is already in use, or already mandated):
Mailer::send(Message): Result) and route every call site through it. This is the whole ballgame — it makes the transport swappable and costs almost nothing.mailjet/mailjet-apiv3-php SDK or the Symfony Mailer bridge, wrapped in a Laravel service provider with config published to config/mail.php / config/services.php.composer.json in the same release that flips the interface binding — don't leave both paths live.Compatibility. Assume it will not install cleanly on Laravel 10/11 (PHP 8.1+) without --ignore-platform-reqs or a fork. Do not use --ignore-platform-reqs; it converts a dependency conflict into a runtime fatal. If a fork is unavoidable, budget for lifting constraints, adding a PHP 8 matrix to CI, and replacing the abandoned SDK pin.
Sequencing. Do the interface extraction and the Mailjet adapter in parallel with the dependency audit — the audit is a half-day of reading composer.json and running composer why-not, and its outcome should decide whether the fork path is even on the table. Ship the swap behind a feature flag with a shadow-send comparison against the existing path before cutting over; mail is a one-way door and silent drops are the failure you cannot see.
Maintenance — the dominant cost. An unmaintained package with zero dependents means every future PHP or Laravel upgrade reopens the same question, and there are no upstream patches for anything discovered later. Adopting it transfers maintenance liability to your team permanently, for a component that is not differentiated. This is the core reason to prefer the official SDK or the Symfony Mailer bridge: both are maintained by the vendor or the framework, not by a third party.
Support. No vendor relationship, no SLA, no active issue triage. Internal debugging is on you, and the 2019-era code will look unfamiliar to engineers used to Laravel's HTTP client and queue conventions.
Scaling. The SDK wrapper is stateless and scales horizontally without issue; the real ceiling is Mailjet's own per-endpoint rate limits and plan quotas. The bundle does not appear to implement retry-with-backoff or queue awareness, so rate-limit handling and async dispatch must be built on your side — push sends onto Laravel queues, batch where the API supports it, and treat 429 as a first-class state rather than an exception.
Failure modes to instrument explicitly:
status === 200 checks report success on dropped mail. Validate the payload's Messages[].Status.Ramp-up — genuinely small, which is the one argument in its favor. The public surface is a handful of classes; an engineer fluent in Laravel's service container and HTTP client can read the whole thing in under a day and reimplement the needed parts in one to two. That low ramp-up cost is precisely why replacing it is cheap — and why the ongoing maintenance liability is not worth accepting.
Recommendation. Do not add welp/mailjet-bundle to a Laravel application. Extract the send-path behavior as reference, implement it against mailjet/mailjet-apiv3-php or the Symfony Mailer Mailjet bridge behind an application-owned interface, and pin the vendor SDK explicitly so upgrades are a deliberate, testable event rather than an inherited surprise.
How can I help you explore Laravel packages today?