neyric/inbound-email-bundle

Inbound emails for Symfony apps with Sendgrid and Mailjet support

Installs: 5 605

Dependents: 0

Suggesters: 0

Security: 0

Stars: 1

Watchers: 1

Forks: 1

Open Issues: 1

Type:symfony-bundle

v1.3.0 2020-07-21 09:21 UTC

This package is auto-updated.

Last update: 2022-06-21 13:51:23 UTC


README

Inbound emails for Symfony apps with Sendgrid and Mailjet support.

Principle

This bundle provides a standardized InboundEmailEvent to your application.

Additionnaly, emails replies are parsed using willdurand/email-reply-parser, which will strip the text content from quoted texts and signature.

The InboundEmailEvent is dispatched by configurable webhook-handler controllers, and currently supports two email gateways :

Requirements

To use this bundle, you will need (as a minimum):

  • PHP v7.1
  • Symfony >= 4.3
  • A Sendgrid or Mailjet account

Applications that use Symfony Flex

Open a command console, enter your project directory and execute:

$ composer require neyric/inbound-email-bundle

Applications that don't use Symfony Flex

Step 1: Download the Bundle

Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:

$ composer require neyric/inbound-email-bundle

This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.

Step 2: Enable the Bundle

Then, enable the bundle by adding it to the list of registered bundles in the app/AppKernel.php file of your project:

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = [
            // ...
            new \neyric\InboundEmailBundle\NeyricInboundEmailBundle(),
        ];

        // ...
    }

    // ...
}

Configuration for Sendgrid

First, you'll need to setup the webhook handler. In your routes.yaml file :

neyric_inbound_email_sendgrid:
    path: /inbound_email/sendgrid/hook_handler # You can customize
    controller: neyric\InboundEmailBundle\Controller\SendgridController::hookHandlerAction

If you use symfony/expression-language component, it is recommended to add the following line to limit this route to the POST method :

    condition:  "context.getMethod() in ['POST']"

Then, setup the Sendgrid Inbound Parse Webhook: Cf. https://sendgrid.com/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/

Configuration for Mailjet

First, you'll need to setup the webhook handler. In your routes.yaml file :

neyric_inbound_email_mailjet:
    path: /inbound_email/mailjet/hook_handler
    controller: neyric\InboundEmailBundle\Controller\MailjetController::hookHandlerAction

If you use symfony/expression-language component, it is recommended to add the following line to limit this route to the POST method :

    condition:  "context.getMethod() in ['POST']"

Then, setup the Mailjet Parse API Webhook: Cf. https://dev.mailjet.com/email/guides/parse-api/

Application Usage

To receive the emails within your application, simply create an EventSubscriber class, which listens for the InboundEmailEvent::class event :

use neyric\InboundEmailBundle\Event\InboundEmailEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MyInboundEmailSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            InboundEmailEvent::class => ['onInboundEmail', 10], // 10 = priority
        ];
    }

    public function onInboundEmail(InboundEmailEvent $event)
    {
        // ... do something with $event
        // Check https://github.com/neyric/inbound-email-bundle/blob/master/Event/InboundEmailEvent.php for reference

        // If this subscriber can handle this event, it is recommended to stop the propagation
        // This will prevent other subscribers with lower priorities to be executed,
        // allowing event-based routing of your incoming emails.
        $event->stopPropagation();
    }
}

Then register the service with the kernel.event_subscriber (if necessary, depending on your service configuration)

    App\Event\MyInboundEmailSubscriber:
        class: App\Event\MyInboundEmailSubscriber
        tags: ['kernel.event_subscriber']

Prepare a local tunnel

Using a local tunnel will save you a lot of time because you can test locally. The recommended choice is ngrok. Ngrok is a tool to tunnel our local server to the web, making our local webhook handlers available to the email providers webhooks.

License

neyric/inbound-email-bundle is distributed under MIT license, see the LICENSE file.

Contacts

Report bugs or suggest features using issue tracker on GitHub.