knplabs/knp-mailjet-bundle
Symfony bundle that integrates the Mailjet email delivery service, giving you simple configuration and service access for sending transactional emails via Mailjet's API inside your Symfony application.
Release under review: 1.1.1 — release notes are content-free ("See #6"). A patch-version bump with a pointer-only changelog is not evidence of a supported revival; it is a single tagged commit whose substance lives in an issue/PR thread we have not read. No breaking-change signal, no feature signal, no stated PHP/Laravel compatibility signal. The assessment below is therefore unchanged in its conclusion and amended only in its maintenance-risk framing, pending a 30-minute verification of what 1.1.1 actually contains.
Architecture fit: poor, and structurally mismatched. knplabs/knp-mailjet-bundle is a Symfony 2.x bundle, not a Laravel package. It integrates via Symfony's bundle system: a Bundle subclass, a DependencyInjection\Extension with a TreeBuilder config tree, service definitions in YAML/XML, and optional compiler passes. Laravel has no bundle concept — its equivalents are package discovery, service providers, facades, and config/*.php merges. None of the bundle's registration surface transfers; only the underlying Mailjet API calls and config semantics are reusable. Any Laravel integration is a rewrite of the wiring layer, not an adoption. A 1.1.1 patch does not change this: nothing in a Symfony DI wrapper's patch release can make it a Laravel package.
Integration feasibility: low value to port, high value to replace. The bundle is a thin DI wrapper over the Mailjet PHP SDK (config keys for public/private API key, sandbox flag, optional HTTP client, one or two service aliases) — perhaps 200–400 lines. Reimplementing it as a Laravel service provider binding a singleton client is a day of work; forking and maintaining a Symfony bundle for a Laravel app is not.
Technical risk: high on every axis that matters.
composer.json now permits PHP 8.x or Laravel 10/11. Expect php >=5.5 and symfony/symfony ~2.3|~3.0 constraints to persist; Composer will refuse the resolve.Key questions for the team:
mailjet/mailjet-apiv3-php (official, maintained) or mailjet/laravel-mailjet acceptable, or is there a policy constraint driving us toward this specific vendor package?Stack fit: no direct fit; unchanged by 1.1.1. Treat the package as a reference implementation, not a dependency. Extract three things and discard the rest: (a) the config key set and their defaults, (b) the sandbox/production switch behaviour, (c) the exact SDK version and endpoints it targeted, so we know what behaviour existing consumers expect.
Recommended migration path:
DependencyInjection/*Extension.php and service definitions; document the config contract. Confirm whether any endpoint it uses is now deprecated.mailjet/mailjet-apiv3-php directly, or mailjet/laravel-mailjet if we want a maintained transport integrated with Laravel's Mail facade. Bind it in a MailjetServiceProvider, publish config/mailjet.php, expose a facade only if conventions demand it.Mail/Mailable + queues rather than calling the client inline, so retries, backoff, and rate limiting are governed by the framework, not bespoke code.Compatibility: still assume incompatible with PHP 8.x and Laravel 10/11 and plan for zero Composer-level coexistence. 1.1.1 is a patch version, so even in the best case it is a bugfix, not a platform-support change. If a legacy Symfony app still consumes it, isolate that app behind a version boundary — do not build a shared library that serves both.
Sequencing:
Decision to escalate: the release does not create a reason to adopt. The correct TPM action remains "replace with official SDK." The only new action is to spend 30 minutes confirming that 1.1.1 contains nothing that would have changed our mind — cheap insurance against an awkward "you missed the fix" conversation later.
Maintenance: uncompensated ownership, with an ambiguous upstream signal. The operative fact is not whether a tag exists but whether anyone is obligated to respond to a security report. A single patch release after a long silence does not establish that obligation. Treat the package as event-driven at best: occasional fixes, no SLA, no advisory routing. Any fork we create makes us the sole maintainer, and every future PHP upgrade, Guzzle major, or Mailjet API change becomes our patch. Cost is small per event, unbounded in aggregate, and invisible on a roadmap.
Support: none contractual. No upstream issue triage commitment, no security advisories routed to us, no CVE response. The 1.1.1 release should be logged as a data point, not as evidence of a support relationship. Register on the risk log with an explicit accepted-risk owner and review date, or reject outright.
Scaling: the wrapper is not the bottleneck — Mailjet's API rate limits, per-account sending quotas, and reputation thresholds are. Design for queue-based throughput control (Laravel RateLimited job middleware, per-account concurrency caps) and ensure the client is a singleton, not instantiated per job. Synchronous sends inside request cycles will collapse first under load, independent of which package we pick.
Failure modes to instrument from day one:
Ramp-up: low for the replacement (a day for a mid-level Laravel engineer familiar with service providers). Higher for anyone asked to reason about the original bundle, because it requires Symfony 2 DI literacy the team likely lacks and should not acquire for this purpose. Budget onboarding against the replacement, and explicitly do not train the team on the bundle.
How can I help you explore Laravel packages today?