slot/mandrill-bundle
Symfony bundle that integrates Mandrill’s transactional email API, making it easy to configure and send templated messages, manage Mandrill settings, and handle email delivery from PHP applications.
Architecture fit — poor as-packaged. slot/mandrill-bundle is a Symfony bundle, not a Laravel package. Its entry points are Symfony conventions: a Bundle subclass, a DI Extension with a config tree, and service definitions wired into the Symfony kernel. Laravel has no bundle-registration mechanism, so there is no supported composer require-and-go path. The only reusable asset is the thin HTTP client logic that calls Mandrill's REST endpoints.
Second mismatch: mail transport era. The bundle was built around Swift Mailer, which reached end-of-life in late 2021. Laravel 9+ ships Symfony Mailer (TransportInterface + TransportFactory). Any Swift-based integration path is dead on arrival, regardless of Laravel version.
Integration feasibility — moderate, via rewrite not adoption. Two viable shapes:
MandrillTransport implements TransportInterface, registered through Mail::extend. Realistically 150–250 LOC plus tests — roughly 3–5 engineering days including sandbox validation.Technical risk — high on the dependency, low on the API.
--ignore-platform-reqs, which is not acceptable on a transactional send path. Confirm by reading composer.json before any estimate.Key questions for the team:
Recommendation: do not take the bundle as a production dependency. Use it as a reference implementation, or evaluate the maintained, framework-agnostic Mandrill PHP SDK behind a Laravel adapter.
Stack fit. Laravel's mail pipeline is MailManager → TransportFactory. Mandrill is not a built-in driver (it was removed from the framework years ago). The correct integration surface is a custom TransportInterface implementation plus a factory registered in a service provider. The bundle's Symfony wiring (DI extension, config tree, kernel boot) maps to nothing in that pipeline and should be discarded.
Migration path. Preferred sequencing of options:
mandrill/mandrill or the Mailchimp Transactional SDK in a Laravel transport. Maintained, plain PHP, no framework coupling — the upgrade burden stays with the vendor./messages/send and /messages/send-template, publish as a private Composer package.Compatibility checks before committing: PHP 8.x deprecations in the client code; Guzzle major version; whether the client class is genuinely framework-free; Swift Mailer references anywhere in the execution path.
Sequencing.
Maintenance. Owning a stripped fork costs little in code (~2 API calls) but taxes every Laravel upgrade: an unmaintained package pinned against Symfony components will drift out of resolvability within one or two framework majors. The SDK-adapter route moves that burden to a vendor; the bundle route moves it to us indefinitely.
Support. No commercial backing — individual maintainer, four years since last release, no SLA, no security-response process. Mandrill-side support comes from Mailchimp and is tied to the account tier. We need a documented escape hatch: swapping transport config to SMTP or another provider without touching mailables.
Scaling. Transport-level scaling is uninteresting — it's HTTP. Real constraints are provider-side: sending reputation and dedicated-IP warmup, per-key rate limits, subaccount quotas, template rendering limits. The bundle contributes nothing here (no batching, no queue integration). Laravel's queue does the work — mailables must implement ShouldQueue, and workers need rate limiting so retries don't burn the API key's quota.
Failure modes to design for explicitly:
response[].status: sent / queued / rejected / invalid). Naive transports log success on a rejected message — the transport must parse and surface that.Ramp-up. The Mandrill API surface is small — a Laravel developer is productive in 1–2 days against the SDK. The Symfony bundle's idioms are a distraction cost, not a learning asset: time spent understanding a DI extension that we're going to delete anyway. Budget the sprint for the transport and webhook work, not for learning the package.
How can I help you explore Laravel packages today?