Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Pretty Text Emails

Keep on Learning!

If you liked what you've learned so far, dive in!
Subscribe to get access to this tutorial plus
video, code and script downloads.

Start your All-Access Pass
Buy just this tutorial for $12.00

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

When we send an HTML email, we know that Mailer automatically generates a text version for us. Thanks Mailer! And, other than this extra style stuff on top... which we don't really want, it does a pretty good job! But we can make it even better - and remove those weird extra styles - with one simple command. Find your terminal and run:

composer require league/html-to-markdown

This is a library that's good at taking HTML and transforming it into Markdown... which, I know, seems like an odd thing to do... but it's super handy! As soon as you install it, Mailer will automatically use it to transform the HTML email into text. Well... it will transform the HTML to markdown... and it turns out that Markdown is a very attractive text format.

Check it out: on the site, go back, bump the email again, submit and... there's our new email. The HTML looks the same, but check out the text. Yea! First of all, the html-to-markdown library was smart enough to get rid of the CSS styles code. It also embedded the logo image on top... which may or may not be useful, but it does correctly represent the image & link.

The most important thing is that it turned the HTML into a nice structure: the header is obvious, bold content is inside asterisks and the line breaks are correct. Basically, we can now stop worrying about the text emails entirely: our emails will have them and they will look great.

Next, there are two ways to add an image to an email: linking to them or embedding them. Let's learn how to embed an image and when that's the best option.

Leave a comment!

Login or Register to join the conversation
Abelardo Avatar
Abelardo Avatar Abelardo | posted 3 years ago

Hi again! :) Sorry for disturbing to you. :S

After seeing the raw message, once I have received the email at Gmail, I see this text:
[ ![SpaceBar Logo](](htt=

What a strange! Gmail doesn't correctly display the image inside HTML message but another inboxes do.

What's wrong? ¿?

1 Reply

Hey AbelardoLG,

Hm, Gmail is tricky and wraps image links in his own logic. You can configure Gmail to do not display images when you open emails that prevents from tracking when you open emails etc. Oh, and probably you're just in the beginning of this tutorial and our email might not display correctly in Gmail and other popular clients *yet*. I'd recommend you to watch up to the screencasts where we refactor our emails with table-layout HTML structure. This should help to fix problems with Gmail and other clients :)


Cat in space

"Houston: no signs of life"
Start the conversation!

This tutorial is built on Symfony 4.3, but will work well with Symfony 4.4 or 5.

What PHP libraries does this tutorial use?

// composer.json
    "require": {
        "php": "^7.1.3",
        "ext-iconv": "*",
        "aws/aws-sdk-php": "^3.87", // 3.110.11
        "composer/package-versions-deprecated": "^1.11", // 1.11.99
        "knplabs/knp-markdown-bundle": "^1.7", // 1.7.1
        "knplabs/knp-paginator-bundle": "^2.7", // v2.8.0
        "knplabs/knp-snappy-bundle": "^1.6", // v1.6.0
        "knplabs/knp-time-bundle": "^1.8", // v1.9.1
        "league/flysystem-aws-s3-v3": "^1.0", // 1.0.23
        "league/flysystem-cached-adapter": "^1.0", // 1.0.9
        "league/html-to-markdown": "^4.8", // 4.8.2
        "liip/imagine-bundle": "^2.1", // 2.1.0
        "nexylan/slack-bundle": "^2.1,<2.2.0", // v2.1.0
        "oneup/flysystem-bundle": "^3.0", // 3.1.0
        "php-http/guzzle6-adapter": "^1.1", // v1.1.1
        "sensio/framework-extra-bundle": "^5.1", // v5.4.1
        "stof/doctrine-extensions-bundle": "^1.3", // v1.3.0
        "symfony/asset": "^4.0", // v4.3.4
        "symfony/console": "^4.0", // v4.3.4
        "symfony/flex": "^1.9", // v1.17.6
        "symfony/form": "^4.0", // v4.3.4
        "symfony/framework-bundle": "^4.0", // v4.3.4
        "symfony/mailer": "4.3.*", // v4.3.4
        "symfony/messenger": "4.3.*", // v4.3.4
        "symfony/orm-pack": "^1.0", // v1.0.6
        "symfony/security-bundle": "^4.0", // v4.3.4
        "symfony/sendgrid-mailer": "4.3.*", // v4.3.4
        "symfony/serializer-pack": "^1.0", // v1.0.2
        "symfony/twig-bundle": "^4.0", // v4.3.4
        "symfony/twig-pack": "^1.0", // v1.0.0
        "symfony/validator": "^4.0", // v4.3.4
        "symfony/web-server-bundle": "^4.0", // v4.3.4
        "symfony/webpack-encore-bundle": "^1.4", // v1.6.2
        "symfony/yaml": "^4.0", // v4.3.4
        "twig/cssinliner-extra": "^2.12", // v2.12.0
        "twig/extensions": "^1.5", // v1.5.4
        "twig/inky-extra": "^2.12" // v2.12.0
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.0", // 3.2.2
        "easycorp/easy-log-handler": "^1.0.2", // v1.0.7
        "fzaninotto/faker": "^1.7", // v1.8.0
        "symfony/browser-kit": "4.3.*", // v4.3.5
        "symfony/debug-bundle": "^3.3|^4.0", // v4.3.4
        "symfony/dotenv": "^4.0", // v4.3.4
        "symfony/maker-bundle": "^1.0", // v1.13.0
        "symfony/monolog-bundle": "^3.0", // v3.4.0
        "symfony/phpunit-bridge": "^3.3|^4.0", // v4.3.4
        "symfony/profiler-pack": "^1.0", // v1.0.4
        "symfony/var-dumper": "^3.3|^4.0" // v4.3.4