Skip to content

romartohero/inbound-email-bundle

 
 

Repository files navigation

InboundEmailBundle for Symfony Build Status Latest Stable Version Total Downloads License

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.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP 100.0%