New in Symfony 6.2: More Extensible Mailer

In Symfony 6.2 we're making the Mailer component more extensible with features such as new events, allowing to change the bus/transport dynamically and simplifying how email parts are added.

New Mailer Sending Events

We've added two new events related to email sending called SentMessageEvent and FailedMessageEvent. The SentMessageEvent allows you to act on the SentMessage object to access the original message (call getOriginalMessage()) and to get debugging information (call getDebug()) such as the HTTP calls made by the HTTP transports.

The FailedMessageEvent allows to act on the original email message that couldn't be sent for some error. Call its getError() method to know the error details.

Changing Bus Dynamically

Sometimes, the decision to send an email via some transport or another is done dynamically and can't be known beforehand. In Symfony 6.2, you can change the bus used to send the email message dynamically. To do so, add the X-Bus-Transport header to your message and pass the name of the new transport:

$email = (new Email())
    ->getHeaders()
        ->addTextHeader('X-Bus-Transport', 'async')
    // ...
;

Injecting Stamps When Sending Emails via Messenger

In Symfony 6.2 we've introduced a new QueuingMessageEvent that allows adding Messenger stamps before the email is sent to the Messenger bus. The listeners of this event can add stamps, generate logs, etc. but they can't change the message or the envelope (if you need to change that, use the MessageEvent):

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mailer\Event\QueuingMessageEvent;
use Symfony\Component\Mime\Email;

public function onMessage(QueuingMessageEvent $event): void
{
    $message = $event->getMessage();
    if (!$message instanceof Email) {
        return;
    }
    // do something with the message (logging, ...)

    // and/or add some Messenger stamps
    $event->addStamp(new SomeMessengerStamp());
}

Custom HTML to Text Conversion

The Mailer component can automatically generate a text version of an HTML e-mail using the league/html-to-markdown package. In Symfony 6.2 we're improving this feature to make the HTML-to-Markdown conversion configurable.

Use the following config option to pass the ID of the service that will perform the conversion (your service must implement HtmlToTextConverterInterface):

# config/packages/twig.yaml
twig:
    # ...
    mailer:
        html_to_text_converter: App\Mailer\MyCustomHtmlToTextConverter

Simplify Adding Parts to an Email

In order to reduce the cyclomatic complexity of the Email class, we're introducing a new addPart() method which aims to replace several related methods: attach(), attachFromPath(), embed(), embedFromPath() and attachPart(). The old methods are not deprecated, but consider using the addPart() method for new developments:

use Symfony\Component\Mime\Email;
 use Symfony\Component\Mime\Part\DataPart;
 use Symfony\Component\Mime\Part\File;

 $email = (new Email())
     // ...
-    ->attachFromPath('/path/to/documents/terms-of-use.pdf')
+    ->addPart(new DataPart(new BodyFile('/path/to/documents/terms-of-use.pdf')))
-    ->embed(fopen('/path/to/images/logo.png', 'r'), 'logo', 'image/png')
+    ->addPart((new DataPart(fopen('/path/to/images/logo.png', 'r'), 'logo', 'image/png'))->asInline())
-    ->embedFromPath('/path/to/images/signature.gif', 'footer-signature', 'image/gif')
+    ->addPart((new DataPart(new File('/path/to/images/signature.gif', 'footer-signature', 'image/gif')))->asInline())
 ;
            <hr style="margin-bottom: 5px" />
            <div style="font-size: 90%">
                <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
            </div>

https://symfony.com/blog/new-in-symfony-6-2-more-extensible-mailer?utm_source=Symfony%20Blog%20Feed&utm_medium=feed

Creato 2y | 21 nov 2022, 17:20:35


Accedi per aggiungere un commento

Altri post in questo gruppo

Back on the inspiring SymfonyCon Vienna 2024!

We were absolutely thrilled to gather with the incredible Symfony community for the first time in Vienna, Austria, from December 5th to 6th, surrounded by the warm and festive atmosphere of the

31 gen 2025, 12:30:18 | Symfony
SymfonyLive Paris 2025 : Reveal of workshop topics!

SymfonyLive Paris 2025, conference in French language only, will take place from March 27 to 28! The schedule is currently being revealed as we go along. More details are available here.

💻

30 gen 2025, 08:50:03 | Symfony
Get Symfony news on your favorite social network

Symfony has been active on X, Mastodon, and Bluesky for some time, but until recently, not all platforms received equal attention. Since Twitter (now X) was our first social network, all blog posts we

29 gen 2025, 14:20:10 | Symfony
SymfonyLive Berlin 2025: Demystify the magic of the Container

SymfonyLive Berlin 2025, conference held in English, will take place from April 1 to 4! The schedule is being revealed gradually. More details are available here.

As we are now unveiling th

29 gen 2025, 14:20:10 | Symfony
Twig CVE-2025-24374: Missing output escaping for the null coalesce operator

Affected versions

Twig versions >=3.16.0,<3.19.0 are affected by this security issue.

The issue has been fixed in Twig 3.19.0.

Description

When using the null coalesce operator (??), output esc

29 gen 2025, 09:40:06 | Symfony
Symfony 6.4.18 released

Symfony 6.4.18 has just been released. Here is the list of the most important changes since 6.4.17:

bug #58889 [Serializer] Handle default context in Serializer (@Valmonzo)

bug #59631 [HttpClient

29 gen 2025, 09:40:05 | Symfony
Symfony 7.1.11 released

Symfony 7.1.11 has just been released. Here is the list of the most important changes since 7.1.10:

bug #58889 [Serializer] Handle default context in Serializer (@Valmonzo)

bug #59631 [HttpClient

29 gen 2025, 09:40:05 | Symfony