hipaway-travel/mandrill-bundle
Hipaway Travel's Mandrill Bundle integrates the Mandrill transactional email API into Symfony/PHP applications, providing simple services for sending templated messages, managing recipients, and handling delivery webhooks.
First, a compatibility check — this is a Symfony bundle, not a Laravel package. The repository is slot/MandrillBundle republished under hipaway-travel, and it depends on Symfony's bundle/kernel infrastructure. Laravel does not have AppKernel, config/bundles.php, or bundle service definitions, so you cannot composer require this into a Laravel app and expect it to auto-wire. For a Laravel codebase, treat this package as a reference implementation rather than a dependency.
If you are maintaining a legacy Symfony app that already uses it:
Slot\MandrillBundle namespace or slot_mandrill config key. Run composer show hipaway-travel/mandrill-bundle and read composer.json + Resources/config/services.xml before writing any code. Confirm the Symfony version constraint; a 2021-era bundle will typically target Symfony 3/4/5, not current Symfony.config/bundles.php (Symfony Flex) or AppKernel::registerBundles() (legacy).slot_mandrill: api_key: "%mandrill_api_key%"). Pull it from env, never commit it.mandrill) plus a Message object. Check services.xml for the exact ID before injecting. That service is your first integration point.Message, set from/to/subject/html/text, and hand it to the service's send() method. Do this in a console command or test controller before wiring it into application flows.For a new Laravel project, skip the bundle and use the official mandrill/mandrill PHP SDK, Mandrill's SMTP credentials via Laravel's Mail facade, or a small custom Laravel mail transport. The bundle buys you nothing in Laravel except an incompatible dependency graph.
Legacy Symfony usage
$mandrill->send(...) calls across controllers. Create a TransactionalMailer or Notifier service that accepts your domain objects, builds the Message, sets merge vars/tags, and calls Mandrill once. This is the single most important pattern because it isolates the dead-end dependency.Message object. Keep template slugs in config so marketing can change copy without deploys.Job wrapping the API call, with retries and a dead-letter path.reject_reason), auth failures, and rate limiting. Do not let a bounced transactional email take down a checkout flow — log, alert, and continue where appropriate.Laravel-oriented patterns
Mail::send(): implement a Laravel transport that calls the Mandrill API, register it via Mail::extend() or a service provider, and configure mail.mailers.mandrill. This preserves Laravel's Mailable API while using Mandrill's API features.MAIL_MAILER=smtp with smtp.mandrillapp.com is the lowest-effort path and works with Laravel Mail, notifications, and queues out of the box. You lose API-only features (templates with merge vars, tags, scheduling) until you add the API for those specific cases.Mailer interface in your app (sendWelcome(User $user), sendReceipt(Order $order)) and implement it with Mandrill. This is the difference between a one-week integration and a one-week migration later.Slot\MandrillBundle to something like HipawayTravel\MandrillBundle while leaving docs stale. Read composer.json autoload and services.xml; never copy-paste the original README's class names.slot_mandrill/fork-specific key silently leaves the API key empty until the first send throws. Validate the key at boot (a small compiler pass or config check) rather than at send time.reject_reason. Mandrill returns per-recipient rejections inside a successful HTTP response. A 200 does not mean delivered. Inspect the response array and log rejected recipients.X-Mandrill-Signature header using your webhook key and the exact raw request body. Framework body parsing that mutates the payload will break signature verification.Message (from, to, template, merge vars).symfony/mailer + a Mandrill bridge, the official SDK, or another provider (Postmark/SES) without touching business logic. Given the package's score and staleness, plan the exit before you plan the integration.How can I help you explore Laravel packages today?