Updating the Mailer Recipe(s)

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 $10.00

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

Login Subscribe

The next recipe on our list is symfony/mailer... which is an especially interesting one because, until Symfony 4.4, symfony/mailer was marked as "experimental". That means that there are some backwards-compatibility breaks between Symfony 4.3 and 4.4. The recipe update might help us find out about a few of these.

Run:

composer recipes symfony/mailer

Then copy the recipes:install command and run it:

composer recipes:install symfony/mailer --force -v

According to the output, this only touched one file. Let's see for sure. Run:

git status

Yep! Only .env was changed. Run:

git add -p

Hmm. It looks like it removed two comment lines, which mention that the MAILER_DSN for the null transport looks different in Symfony 4.4. And then it added an example of using the smtp transport. The top line is my custom code.

I don't really want these changes. I mean, I do still want to define a MAILER_DSN environment variable and I do still want to use the null transport. Except... the removed note did just remind me about a syntax change in the null transport for Symfony 4.4.

Hit "n" to not add this change... for now. Then hit "y" for the symfony.lock update.

The Updated Null Mailer Transport Syntax

Let's see how things look:

git status

Undo the changes:

git checkout .env

Open .env in our editor... and find the "mailer" section:

62 lines .env
... lines 1 - 37
###> symfony/mailer ###
MAILER_DSN=smtp://null
# in Symfony 4.4 and higher, the syntax is
# MAILER_DSN=null://default
###
... lines 43 - 62

Even though we didn't accept the new recipe changes, we do need to update our syntax. Copy the example and paste. Actually, the default part can be anything - you'll sometimes see null:

61 lines .env
... lines 1 - 37
###> symfony/mailer ###
MAILER_DSN=null://null
# in Symfony 4.4 and higher, the syntax is
# MAILER_DSN=null://default
###
... lines 43 - 61

And now if you wanted to delete the extra comments about Symfony 4.4, you totally could... and probably should.

So... we basically didn't use anything from the updated recipe, but it did remind us of a change we needed to make.

Checking the CHANGELOG

And because symfony/mailer may have other backwards-compatibility breaks, it's not a bad idea to check its CHANGELOG. I'll go to https://github.com/symfony/mailer... and click to see it. Yep! You can see info about the null change and a few others. We'll see one of these later.

Back at your terminal, run:

composer recipes

again. There's one other recipe that's relevant to symfony/mailer. It's symfony/sendgrid-mailer: a package that helps us send emails through SendGrid. Let's skip straight to updating this:

composer recipes:install symfony/sendgrid-mailer --force -v

And then step through the changes with:

git add -p

The first change is inside .env. Oh! Ha! That's the change we made, I forgot to add it. Hit "y" to add it now.

The other change is also in .env: it changed the MAILER_DSN example from something starting with smtp:// to sendgrid://. Similar to the null transport situation, symfony/mailer 4.4 also changed the syntax for a few other transports.

I'm going to say "y" to accept this change: both the old and new code were just examples anyway.

But, there is one other spot you need to check: we need to see if we're using the old format in the .env.local file. Go open that up. In this project, nope! I'm not overriding that. If we did have smtp://sendgrid in any env files, or configured as a real environment variable, maybe on production, that would need to be updated.

For the last change - to symfony.lock - hit "y" to add it. Run:

git status

to make sure we're not missing anything. Looks good! Commit!

git commit -m "updating symfony/mailer recipe packages"

Done! We're down to the last few recipe updates. Let's crush them.

Leave a comment!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": "^7.3.0",
        "ext-iconv": "*",
        "antishov/doctrine-extensions-bundle": "^1.4", // v1.4.2
        "aws/aws-sdk-php": "^3.87", // 3.110.11
        "doctrine/doctrine-bundle": "^2.0", // 2.0.6
        "doctrine/doctrine-migrations-bundle": "^1.3|^2.0", // 2.1.2
        "doctrine/orm": "^2.5.11", // v2.7.2
        "easycorp/easy-log-handler": "^1.0", // v1.0.9
        "http-interop/http-factory-guzzle": "^1.0", // 1.0.0
        "knplabs/knp-markdown-bundle": "^1.7", // 1.8.1
        "knplabs/knp-paginator-bundle": "^5.0", // v5.0.0
        "knplabs/knp-snappy-bundle": "^1.6", // v1.7.0
        "knplabs/knp-time-bundle": "^1.8", // v1.11.0
        "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.3.0
        "nexylan/slack-bundle": "^2.1", // v2.2.1
        "oneup/flysystem-bundle": "^3.0", // 3.3.0
        "php-http/guzzle6-adapter": "^2.0", // v2.0.1
        "sensio/framework-extra-bundle": "^5.1", // v5.5.3
        "symfony/asset": "5.0.*", // v5.0.2
        "symfony/console": "5.0.*", // v5.0.2
        "symfony/dotenv": "5.0.*", // v5.0.2
        "symfony/flex": "^1.0", // v1.6.2
        "symfony/form": "5.0.*", // v5.0.2
        "symfony/framework-bundle": "5.0.*", // v5.0.2
        "symfony/mailer": "5.0.*", // v5.0.2
        "symfony/messenger": "5.0.*", // v5.0.2
        "symfony/monolog-bundle": "^3.5", // v3.5.0
        "symfony/security-bundle": "5.0.*", // v5.0.2
        "symfony/sendgrid-mailer": "5.0.*", // v5.0.2
        "symfony/serializer-pack": "^1.0", // v1.0.2
        "symfony/twig-bundle": "5.0.*", // v5.0.2
        "symfony/twig-pack": "^1.0", // v1.0.0
        "symfony/validator": "5.0.*", // v5.0.2
        "symfony/webpack-encore-bundle": "^1.4", // v1.7.2
        "symfony/yaml": "5.0.*", // v5.0.2
        "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.3.0
        "fzaninotto/faker": "^1.7", // v1.8.0
        "symfony/browser-kit": "5.0.*", // v5.0.2
        "symfony/debug-bundle": "5.0.*", // v5.0.2
        "symfony/maker-bundle": "^1.0", // v1.14.3
        "symfony/phpunit-bridge": "5.0.*", // v5.0.2
        "symfony/profiler-pack": "^1.0", // v1.0.4
        "symfony/var-dumper": "5.0.*" // v5.0.2
    }
}