HowTo: Create and register a MailTypeBuilderPlugin

Edit on GitHub

MailTypeBuilderPlugin is used to build the entire MailTransfer through an easy-to-use interface. Create the MailTypeBuilderPlugin within the Mail module, which sends out the emails, and implement MailTypeBuilderPluginInterface. Then, in the build() method, set up your email.

All MailTransfers need to know which mail type has to be used for further internal processing. The mail type has to be a string.

In most cases, you can add a specific transfer to the MailTransfer—for example, a CustomerTransfer when a customer registers. This transfer object is available in your MailTypeBuilderPlugin through the MailTransfer.

Let’s say you have a module named FooBar, where you want to add automated mail sending. To enable that feature, follow these steps:

Example of a FooBarMailTypeBuilderPlugin:

<?php
namespace Pyz\Zed\FooBar\Communication\Plugin\Mail;

use Generated\Shared\Transfer\MailRecipientTransfer;
use Generated\Shared\Transfer\MailTemplateTransfer;
use Generated\Shared\Transfer\MailTransfer;
use Spryker\Zed\Kernel\Communication\AbstractPlugin;
use Spryker\Zed\MailExtension\Dependency\Plugin\MailTypeBuilderPluginInterface;

class FooBarMailTypeBuilderPlugin extends AbstractPlugin implements MailTypeBuilderPluginInterface
{
    protected const MAIL_TYPE = 'a name of the mail';

    protected const MAIL_TEMPLATE_HTML = 'FooBar/mail/your_mail.html.twig';

    protected const MAIL_TEMPLATE_TEXT = 'FooBar/mail/your_mail.text.twig';

    protected const GLOSSARY_KEY_MAIL_SUBJECT = 'foo_bar.mail.your_mail.subject';

    protected const PARAMETER_NAME = '%name%';

    public function getName(): string
    {
        return static::MAIL_TYPE;
    }

    public function build(MailTransfer $mailTransfer): MailTransfer
    {
        return $mailTransfer
            ->setSubject(static::GLOSSARY_KEY_MAIL_SUBJECT)
            ->setSubjectTranslationParameters([static::PARAMETER_NAME => $fooBarTransfer->getFooBarNameOrFail()])
            ->addTemplate(
                (new MailTemplateTransfer())
                    ->setName(static::MAIL_TEMPLATE_HTML)
                    ->setIsHtml(true),
            )
            ->addTemplate(
                (new MailTemplateTransfer())
                    ->setName(static::MAIL_TEMPLATE_TEXT)
                    ->setIsHtml(false),
            )
            ->addRecipient(
                (new MailRecipientTransfer())
                    ->setEmail($mailTransfer->getFooBar()->getEmail())
                    ->setName($mailTransfer->getFooBar()->getName()),
            );
    }
}

Register the FooBarMailTypeBuilderPlugin:

<?php
namespace Pyz\Zed\Mail;

use Pyz\Zed\FooBar\Communication\Plugin\Mail\FooBarMailTypeBuilderPlugin;
use Spryker\Zed\Mail\MailDependencyProvider as SprykerMailDependencyProvider;

class MailDependencyProvider extends SprykerMailDependencyProvider
{
    protected function getMailTypeBuilderPlugins(): array
    {
        return [
            new FooBarMailTypeBuilderPlugin(),
        ];
    }
}
Verification

In order to activate the mail functionality, follow these steps:

  1. To verify the mail provider is created and registered, go to How to create and register a mail provider.
  2. Create and adjust MailTransfer:
    $mailTransfer = new MailTransfer();
    $mailTransfer->setType('MAIL_TYPE');
    $mailTransfer->setFooBar(new FooBarTransfer());
    $mailTransfer->setLocale('DE');

Call MailFacade::handleMail($mailTransfer).

If everything is set up properly the mail will be sent.

Follow Tutorial sending an email to get more information.