Coder Social home page Coder Social logo

laravel-mandrillhooks's Introduction

Laravel Mandrill Webhook Controller

Latest Version Software License Total Downloads

A simple Mandrill webhook controller to help with email events. Useful for notifying users that you cannot reach them via email inside your application. Compatible with Laravel 5+ and Lumen 5+.

Installation

composer require eventhomes/laravel-mandrillhooks

Basic Usage

  1. Create a controller that extends MandrillWebhookController as follows. You can then handle any Mandrillapp webhook event.
use EventHomes\Api\Webhooks\MandrillWebhookController;

class MyController extends MandrillWebhookController {

    /**
     * Handle a hard bounced email
     *
     * @param $payload
     */
    public function handleHardBounce($payload)
    {
        $email = $payload['msg']['email'];
    }

    /**
     * Handle a rejected email
     *
     * @param $payload
     */
    public function handleReject($payload)
    {
        $email = $payload['msg']['email'];
    }
}
  1. Create the route to handle the webhook. In your routes.php file add the following.
post('mandrill-webhook', ['as' => 'mandrill.webhook', 'uses' => 'MandrillController@handleWebHook']);
  1. Exclude your route from CSRF protection so it will not fail.

  2. Make sure you add your webhook in Mandrill to point to your route. You can do this here: https://mandrillapp.com/settings/webhooks

(Optional) Webhook Authentication

If you would like to increase the security of the webhooks. Add the MandrillWebhookServiceProvider provider to the providers array in config/app.php

'providers' => [
  ...
  EventHomes\Api\Webhooks\MandrillWebhookServiceProvider::class,
],

Next, publish the configuration via

php artisan vendor:publish --provider="EventHomes\Api\Webhooks\MandrillWebhookServiceProvider"

Simply add your Mandrill webhook key in the config file and requests will be authenticated.

Webhook Events

Webhook event types:

Event type Method Description
Sent handleSend() message has been sent successfully
Bounced handleHardBounce() message has hard bounced
Opened hadleOpen() recipient opened a message; will only occur when open tracking is enabled
Marked As Spam handleSpam() recipient marked a message as spam
Rejected handleReject() message was rejected
Delayed handleDeferral() message has been sent, but the receiving server has indicated mail is being delivered too quickly and Mandrill should slow down sending temporarily
Soft-Bounced handleSoftBounce() message has soft bounced
Clicked handleClick() recipient clicked a link in a message; will only occur when click tracking is enabled
Recipient Unsubscribes handleUnsub() recipient unsubscribes
Rejection Blacklist Changes handleBlacklist() triggered when a Rejection Blacklist entry is added, changed, or removed
Rejection Whitelist Changes handleWhitelist() triggered when a Rejection Whitelist entry is added or removed

Contributors

Special thanks to @rafaelbeckel and @minioak!

laravel-mandrillhooks's People

Contributors

avdb avatar ivantokar avatar jeroenlammerts avatar lostincode avatar mixislv avatar rafaelbeckel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

laravel-mandrillhooks's Issues

Function in controller

Hello.

you say in the step two:

add this route:
post('mandrill-webhook', ['as' => 'mandrill.webhook', 'uses' => 'MandrillController@handleWebHook']);

But in the controller the function handleWebHook doesn't exists.

Thanks in advance.

Why not fire off events from the mandrill webhook controller instead?

Why not have a controller that fires events that things can either listen to? Why do you have to implement your own controller that does stuff?

class MandrillWebhookController {
    /**
     * Handle the Mandrill webhook and fire an event
     *
     * @return Response
     */
    public function handleWebHook(Request $request)
    {
        if ($this->validateSignature($request)) {
            $events = $this->getJsonPayloadFromRequest($request);
            foreach ($events as $event) {
                $eventName = isset($event['event']) ? $event['event'] : 'undefined';
                if($eventName == 'undefined' && isset($event['type'])){
                    $eventName = $event['type'];
                }
                $class = 'Mandrill' . studly_case(str_replace('.', '_', $eventName));
                event(new $class($event));
            }
            return new Response;
        }
        return  new Response('Unauthorized', 401);
    }
    /// .... snip
}

Obviously for backwards compatibility you might have to include the handleWhatever check and call that...

Also some tests would probably be good.

Signature will never match the header

$request->all() on validateSignature will not work, only got it to work using the $_POST variable.
I think this is due to the way Laravel retrieves the request array. Can you guys have a look at it?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.