Repository: cookiecutter/cookiecutter-django
Pull request: Add all supported Anymail Providers
[//]: # (Thank you for helping us out: your efforts mean great deal to the project and the community as a whole!)

[//]: # (Before you proceed:)

[//]: # (1. Make sure to add yourself to `CONTRIBUTORS.rst` through this PR provided you're contributing here for the first time)
[//]: # (2. Don't forget to update the `docs/` presuming others would benefit from a concise description of whatever that you're proposing)


## Description

[//]: # (What's it you're proposing?)

Providing options for all Anymail-supported ESP:
SES, Mailgun, Mailjet, Mandrill, Postmark, Sendgrid, SendinBlue, SparkPost, Plain/Vanilla Django-anymail, None.


## Rationale

[//]: # (Why does the project need that?)

The default is Mailgun. Financially, it **_could_** be more wise to use SES if the cloud provider is AWS. Some people prefer other options, too.

Alleviates setup for users choosing option other than mailgun.

Fixes #2140 


## Use case(s) / visualization(s)

[//]: # ("Better to see something once than to hear about it a thousand times.")

Selecting an email provider from the beginning alleviates setup later on.


Problem statement:
Add an option to choose default email backend (AWS SES or Mailgun)
## Description

Add an option to choose default email backend (AWS SES or Mailgun)

## Rationale

Currently Mailgun is set as a default email backend.
In my opinion it would be nice to add an option to choose default email backend (AWS SES or Mailgun).

## Use case(s) / visualization(s)

`
"default_email_backend": [
    "Mailgun",
    "AWS SES"
  ],
`

I can do it if You will decide to add this feature.
Thanks

Hints from issue discussion:
Why add only SES and not any [other ESP](https://anymail.readthedocs.io/en/stable/esps/) provided by `django-anymail`? Should we allow no ESP too? That could make the template a fair bit more complex I think.

I'm a bit on the fence on this, but if you put together a pull request, that might convince me :)
@browniebroke Sure, it is a good idea to add other ESP either. 
I focused only on my needs so that is why I forgot about rest of providers.
I will create a pull request in a few days.

Commit message: Testing mail service does not raise KeyError
* KeyError raised when cloud_provider was used twice in mark parametrization.
* Tox isn't working properly for me (collecting 17,000 files; obviously neglecting tox.ini and/or pytest.ini)

Patch to review:
diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst
index 2554d2cfc4..6dca6ddb46 100644
--- a/CONTRIBUTORS.rst
+++ b/CONTRIBUTORS.rst
@@ -56,6 +56,7 @@ Listed in alphabetical order.
   Andreas Meistad          `@ameistad`_
   Andres Gonzalez          `@andresgz`_
   Andrew Mikhnevich        `@zcho`_
+  Andrew Chen Wang         `@Andrew-Chen-Wang`_
   Andy Rose
   Anna Callahan            `@jazztpt`_
   Anna Sidwell             `@takkaria`_
@@ -228,6 +229,7 @@ Listed in alphabetical order.
 .. _@andor-pierdelacabeza: https://github.com/andor-pierdelacabeza
 .. _@andresgz: https://github.com/andresgz
 .. _@antoniablair: https://github.com/antoniablair
+.. _@Andrew-Chen-Wang: https://github.com/Andrew-Chen-Wang
 .. _@apirobot: https://github.com/apirobot
 .. _@archinal: https://github.com/archinal
 .. _@areski: https://github.com/areski
diff --git a/README.rst b/README.rst
index 6e534b0f28..1d43b84e8a 100644
--- a/README.rst
+++ b/README.rst
@@ -46,7 +46,7 @@ Features
 * Registration via django-allauth_
 * Comes with custom user model ready to go
 * Optional custom static build using Gulp and livereload
-* Send emails via Anymail_ (using Mailgun_ by default, but switchable)
+* Send emails via Anymail_ (using Mailgun_ by default or Amazon SES if AWS is selected cloud provider, but switchable)
 * Media storage using Amazon S3 or Google Cloud Storage
 * Docker support using docker-compose_ for development and production (using Traefik_ with LetsEncrypt_ support)
 * Procfile_ for deploying to Heroku
@@ -85,7 +85,7 @@ Optional Integrations
 .. _PythonAnywhere: https://www.pythonanywhere.com/
 .. _Traefik: https://traefik.io/
 .. _LetsEncrypt: https://letsencrypt.org/
-.. _pre-commit: https://github.com/pre-commit/pre-commit 
+.. _pre-commit: https://github.com/pre-commit/pre-commit
 
 Constraints
 -----------
diff --git a/cookiecutter.json b/cookiecutter.json
index 4e77d11095..5e85af4862 100644
--- a/cookiecutter.json
+++ b/cookiecutter.json
@@ -33,6 +33,17 @@
     "GCP",
     "None"
   ],
+  "mail_service": [
+    "{% if cookiecutter.cloud_provider == 'AWS' %}Amazon SES{% else %}Plain/Vanilla Django-Anymail{% endif %}",
+    "Mailgun",
+    "Mailjet",
+    "Mandrill",
+    "Postmark",
+    "Sendgrid",
+    "SendinBlue",
+    "SparkPost",
+    "Plain/Vanilla Django-Anymail"
+  ],
   "use_drf": "n",
   "custom_bootstrap_compilation": "n",
   "use_compressor": "n",
diff --git a/docs/project-generation-options.rst b/docs/project-generation-options.rst
index 2ed77facd7..87ae90b1db 100644
--- a/docs/project-generation-options.rst
+++ b/docs/project-generation-options.rst
@@ -70,6 +70,19 @@ cloud_provider:
 
     Note that if you choose no cloud provider, media files won't work.
 
+mail_service:
+    Select an email service that Django-Anymail provides
+
+    1. Amazon SES_
+    2. Mailgun_
+    3. Mailjet_
+    4. Mandrill_
+    5. Postmark_
+    6. SendGrid_
+    7. SendinBlue_
+    8. SparkPost_
+    9. Plain/Vanilla Django-Anymail_
+
 use_drf:
     Indicates whether the project should be configured to use `Django Rest Framework`_.
 
@@ -132,6 +145,16 @@ debug:
 .. _AWS: https://aws.amazon.com/s3/
 .. _GCP: https://cloud.google.com/storage/
 
+.. _SES: https://aws.amazon.com/ses/
+.. _Mailgun: https://www.mailgun.com
+.. _Mailjet: https://www.mailjet.com
+.. _Mandrill: http://mandrill.com
+.. _Postmark: https://postmarkapp.com
+.. _SendGrid: https://sendgrid.com
+.. _SendinBlue: https://www.sendinblue.com
+.. _SparkPost: https://www.sparkpost.com
+.. _Django-Anymail: https://anymail.readthedocs.io/en/stable/
+
 .. _Django Rest Framework: https://github.com/encode/django-rest-framework/
 
 .. _Django Compressor: https://github.com/django-compressor/django-compressor
diff --git a/docs/settings.rst b/docs/settings.rst
index e586c96344..2ae8814e92 100644
--- a/docs/settings.rst
+++ b/docs/settings.rst
@@ -52,6 +52,21 @@ DJANGO_SENTRY_LOG_LEVEL                 SENTRY_LOG_LEVEL            n/a
 MAILGUN_API_KEY                         MAILGUN_API_KEY             n/a                                            raises error
 MAILGUN_DOMAIN                          MAILGUN_SENDER_DOMAIN       n/a                                            raises error
 MAILGUN_API_URL                         n/a                         n/a                                            "https://api.mailgun.net/v3"
+MAILJET_API_KEY                         MAILJET_API_KEY             n/a                                            raises error
+MAILJET_SECRET_KEY                      MAILJET_SECRET_KEY          n/a                                            raises error
+MAILJET_API_URL                         n/a                         n/a                                            "https://api.mailjet.com/v3"
+MANDRILL_API_KEY                        MANDRILL_API_KEY            n/a                                            raises error
+MANDRILL_API_URL                        n/a                         n/a                                            "https://mandrillapp.com/api/1.0"
+POSTMARK_SERVER_TOKEN                   POSTMARK_SERVER_TOKEN       n/a                                            raises error
+POSTMARK_API_URL                        n/a                         n/a                                            "https://api.postmarkapp.com/"
+SENDGRID_API_KEY                        SENDGRID_API_KEY            n/a                                            raises error
+SENDGRID_GENERATE_MESSAGE_ID            True                        n/a                                            raises error
+SENDGRID_MERGE_FIELD_FORMAT             None                        n/a                                            raises error
+SENDGRID_API_URL                        n/a                         n/a                                            "https://api.sendgrid.com/v3/"
+SENDINBLUE_API_KEY                      SENDINBLUE_API_KEY          n/a                                            raises error
+SENDINBLUE_API_URL                      n/a                         n/a                                            "https://api.sendinblue.com/v3/"
+SPARKPOST_API_KEY                       SPARKPOST_API_KEY           n/a                                            raises error
+SPARKPOST_API_URL                       n/a                         n/a                                            "https://api.sparkpost.com/api/v1"
 ======================================= =========================== ============================================== ======================================================================
 
 --------------------------
diff --git a/tests/test_cookiecutter_generation.py b/tests/test_cookiecutter_generation.py
index 39b05d7c6d..e8b341c969 100755
--- a/tests/test_cookiecutter_generation.py
+++ b/tests/test_cookiecutter_generation.py
@@ -46,6 +46,22 @@ def context():
     ],
     ids=lambda id: f"wnoise:{id[0]}-cloud:{id[1]}",
 )
+@pytest.mark.parametrize(
+    "mail_service",
+    [
+        "Amazon SES",
+        "Mailgun",
+        "MailJet",
+        "Mandrill",
+        "Postmark",
+        "Sendgrid",
+        "SendinBlue",
+        "SparkPost",
+        "Plain/Vanilla Django-Anymail"
+        # GCP or None (i.e. no cloud provider) + Amazon SES is not supported
+    ],
+    ids=lambda id: f"mail:{id[0]}",
+)
 def context_combination(
     windows,
     use_docker,
@@ -56,6 +72,7 @@ def context_combination(
     use_whitenoise,
     use_drf,
     cloud_provider,
+    mail_service,
 ):
     """Fixture that parametrize the function where it's used."""
     return {
@@ -68,6 +85,7 @@ def context_combination(
         "use_whitenoise": use_whitenoise,
         "use_drf": use_drf,
         "cloud_provider": cloud_provider,
+        "mail_service": mail_service,
     }
 
 
@@ -194,3 +212,21 @@ def test_no_whitenoise_and_no_cloud_provider(cookies, context):
 
     assert result.exit_code != 0
     assert isinstance(result.exception, FailedHookException)
+
+
+def test_gcp_with_aws_ses_mail_service(cookies, context):
+    """It should not generate project if SES is set with GCP cloud provider"""
+    context.update({"cloud_provider": "GCP", "mail_service": "Amazon SES"})
+    result = cookies.bake(extra_context=context)
+
+    assert result.exit_code != 0
+    assert isinstance(result.exception, FailedHookException)
+
+
+def test_no_cloud_provider_with_aws_ses_mail_service(cookies, context):
+    """It should not generate project if SES is set with no cloud provider"""
+    context.update({"cloud_provider": "None", "mail_service": "Amazon SES"})
+    result = cookies.bake(extra_context=context)
+
+    assert result.exit_code != 0
+    assert isinstance(result.exception, FailedHookException)
diff --git a/{{cookiecutter.project_slug}}/.envs/.production/.django b/{{cookiecutter.project_slug}}/.envs/.production/.django
index 2c2e94f2d4..358b5e95da 100644
--- a/{{cookiecutter.project_slug}}/.envs/.production/.django
+++ b/{{cookiecutter.project_slug}}/.envs/.production/.django
@@ -13,9 +13,26 @@ DJANGO_SECURE_SSL_REDIRECT=False
 
 # Email
 # ------------------------------------------------------------------------------
-MAILGUN_API_KEY=
 DJANGO_SERVER_EMAIL=
+{% if cookiecutter.mail_service == 'Mailgun' %}
+MAILGUN_API_KEY=
 MAILGUN_DOMAIN=
+{% elif cookiecutter.mail_service == 'Mailjet' %}
+MAILJET_API_KEY=
+MAILJET_SECRET_KEY=
+{% elif cookiecutter.mail_service == 'Mandrill' %}
+MANDRILL_API_KEY=
+{% elif cookiecutter.mail_service == 'Postmark' %}
+POSTMARK_SERVER_TOKEN=
+{% elif cookiecutter.mail_service == 'Sendgrid' %}
+SENDGRID_API_KEY=
+SENDGRID_GENERATE_MESSAGE_ID=True
+SENDGRID_MERGE_FIELD_FORMAT=None
+{% elif cookiecutter.mail_service == 'SendinBlue' %}
+SENDINBLUE_API_KEY=
+{% elif cookiecutter.mail_service == 'SparkPost' %}
+SPARKPOST_API_KEY=
+{% endif %}
 {% if cookiecutter.cloud_provider == 'AWS' %}
 # AWS
 # ------------------------------------------------------------------------------
diff --git a/{{cookiecutter.project_slug}}/config/settings/production.py b/{{cookiecutter.project_slug}}/config/settings/production.py
index 36667b33a0..57b8eb397c 100644
--- a/{{cookiecutter.project_slug}}/config/settings/production.py
+++ b/{{cookiecutter.project_slug}}/config/settings/production.py
@@ -182,16 +182,89 @@ class MediaRootGoogleCloudStorage(GoogleCloudStorage):
 # Django Admin URL regex.
 ADMIN_URL = env("DJANGO_ADMIN_URL")
 
-# Anymail (Mailgun)
+# Anymail
 # ------------------------------------------------------------------------------
 # https://anymail.readthedocs.io/en/stable/installation/#installing-anymail
 INSTALLED_APPS += ["anymail"]  # noqa F405
+{%- if cookiecutter.mail_service == 'Amazon SES' %}
+EMAIL_BACKEND = "anymail.backends.amazon_ses.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mailgun' %}
 EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mailjet' %}
+EMAIL_BACKEND = "anymail.backends.mailjet.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mandrill' %}
+EMAIL_BACKEND = "anymail.backends.mandrill.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Postmark' %}
+EMAIL_BACKEND = "anymail.backends.postmark.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Sendgrid' %}
+EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
+{%- elif cookiecutter.mail_service == 'SendinBlue' %}
+EMAIL_BACKEND = "anymail.backends.sendinblue.EmailBackend"
+{%- elif cookiecutter.mail_service == 'SparkPost' %}
+EMAIL_BACKEND = "anymail.backends.sparkpost.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Plain/Vanilla Django-Anymail' %}
+EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
+# https://docs.djangoproject.com/en/3.0/ref/settings/#email-backend
+{%- endif %}
 # https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference
 ANYMAIL = {
+    # https://anymail.readthedocs.io/en/stable/esps/
+    {%- if cookiecutter.mail_service == 'Amazon SES' %}
+    # https://anymail.readthedocs.io/en/stable/esps/amazon_ses/
+    {%- elif cookiecutter.mail_service == 'Mailgun' %}
     "MAILGUN_API_KEY": env("MAILGUN_API_KEY"),
     "MAILGUN_SENDER_DOMAIN": env("MAILGUN_DOMAIN"),
-    "MAILGUN_API_URL": env("MAILGUN_API_URL", default="https://api.mailgun.net/v3"),
+    "MAILGUN_API_URL": env(
+        "MAILGUN_API_URL",
+        default="https://api.mailgun.net/v3"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/mailgun/
+    {%- elif cookiecutter.mail_service == 'Mailjet' %}
+    "MAILJET_API_KEY": env("MAILJET_API_KEY"),
+    "MAILJET_SECRET_KEY": env("MAILJET_SECRET_KEY"),
+    "MAILJET_API_URL": env(
+        "MAILJET_API_URL",
+        default="https://api.mailjet.com/v3"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/mailjet/
+    {%- elif cookiecutter.mail_service == 'Mandrill' %}
+    "MANDRILL_API_KEY": env("MANDRILL_API_KEY"),
+    "MANDRILL_API_URL": env(
+        "MANDRILL_API_URL",
+        default="https://mandrillapp.com/api/1.0"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/mandrill/
+    {%- elif cookiecutter.mail_service == 'Postmark' %}
+    "POSTMARK_SERVER_TOKEN": env("POSTMARK_SERVER_TOKEN"),
+    "POSTMARK_API_URL": env(
+        "POSTMARK_API_URL",
+        default="https://api.postmarkapp.com/"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/postmark/
+    {%- elif cookiecutter.mail_service == 'Sendgrid' %}
+    "SENDGRID_API_KEY": env("SENDGRID_API_KEY"),
+    "SENDGRID_GENERATE_MESSAGE_ID": env("SENDGRID_GENERATE_MESSAGE_ID"),
+    "SENDGRID_MERGE_FIELD_FORMAT": env("SENDGRID_MERGE_FIELD_FORMAT"),
+    "SENDGRID_API_URL": env(
+        "SENDGRID_API_URL",
+        default="https://api.sendgrid.com/v3/"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/sendgrid/
+    {%- elif cookiecutter.mail_service == 'SendinBlue' %}
+    "SENDINBLUE_API_KEY": env("SENDINBLUE_API_KEY"),
+    "SENDINBLUE_API_URL": env(
+        "SENDINBLUE_API_URL",
+        default="https://api.sendinblue.com/v3/"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/sendinblue/
+    {%- elif cookiecutter.mail_service == 'SparkPost' %}
+    "SPARKPOST_API_KEY": env("SPARKPOST_API_KEY"),
+    "SPARKPOST_API_URL": env(
+        "SPARKPOST_API_URL",
+        default="https://api.sparkpost.com/api/v1"
+    ),
+    # https://anymail.readthedocs.io/en/stable/esps/sparkpost/
+    {%- endif %}
 }
 
 {% if cookiecutter.use_compressor == 'y' -%}
diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt
index 9c1de82760..3e1d8515b6 100644
--- a/{{cookiecutter.project_slug}}/requirements/production.txt
+++ b/{{cookiecutter.project_slug}}/requirements/production.txt
@@ -18,4 +18,22 @@ django-storages[boto3]==1.9.1  # https://github.com/jschneier/django-storages
 {%- elif cookiecutter.cloud_provider == 'GCP' %}
 django-storages[google]==1.9.1  # https://github.com/jschneier/django-storages
 {%- endif %}
+{%- if cookiecutter.mail_service == 'Amazon SES' %}
+django-anymail[amazon_ses]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Mailgun' %}
 django-anymail[mailgun]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Mailjet' %}
+django-anymail[mailjet]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Mandrill' %}
+django-anymail[mandrill]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Postmark' %}
+django-anymail[postmark]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Sendgrid' %}
+django-anymail[sendgrid]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'SendinBlue' %}
+django-anymail[sendinblue]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'SparkPost' %}
+django-anymail[sparkpost]==7.0.0  # https://github.com/anymail/django-anymail
+{%- elif cookiecutter.mail_service == 'Plain/Vanilla Django-Anymail' %}
+django-anymail==7.0.0  # https://github.com/anymail/django-anymail
+{%- endif %}


Code review comments:
diff_hunk: @@ -182,16 +182,89 @@ class MediaRootGoogleCloudStorage(GoogleCloudStorage):
 # Django Admin URL regex.
 ADMIN_URL = env("DJANGO_ADMIN_URL")
 
-# Anymail (Mailgun)
+# Anymail
 # ------------------------------------------------------------------------------
 # https://anymail.readthedocs.io/en/stable/installation/#installing-anymail
 INSTALLED_APPS += ["anymail"]  # noqa F405
+{%- if cookiecutter.mail_service == 'Amazon SES' %}
+EMAIL_BACKEND = "anymail.backends.amazon_ses.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mailgun' %}
 EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mailjet' %}
+EMAIL_BACKEND = "anymail.backends.mailjet.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Mandrill' %}
+EMAIL_BACKEND = "anymail.backends.mandrill.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Postmark' %}
+EMAIL_BACKEND = "anymail.backends.postmark.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Sendgrid' %}
+EMAIL_BACKEND = "anymail.backends.sendgrid.EmailBackend"
+{%- elif cookiecutter.mail_service == 'SendinBlue' %}
+EMAIL_BACKEND = "anymail.backends.sendinblue.EmailBackend"
+{%- elif cookiecutter.mail_service == 'SparkPost' %}
+EMAIL_BACKEND = "anymail.backends.sparkpost.EmailBackend"
+{%- elif cookiecutter.mail_service == 'Plain/Vanilla Django-Anymail' %}
+EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
+# https://docs.djangoproject.com/en/3.0/ref/settings/#email-backend
+{%- endif %}
 # https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference
 ANYMAIL = {
+    # https://anymail.readthedocs.io/en/stable/esps/
+    {%- if cookiecutter.mail_service == 'Amazon SES' %}
path: {{cookiecutter.project_slug}}/config/settings/production.py
text: @user1:
It would _probably_ be more readable for us to limit the amount of `elif cookiecutter.mail_service ==` statements and group `EMAIL_BACKEND` and `ANYMAIL` dict in the same block so that they are next to each other, for instance:

```
{%- if cookiecutter.mail_service == 'Mailgun' %}
# https://anymail.readthedocs.io/en/stable/esps/mailgun/
EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend"
ANYMAIL = {
    "MAILGUN_API_KEY": env("MAILGUN_API_KEY"),
    "MAILGUN_SENDER_DOMAIN": env("MAILGUN_DOMAIN"),
    "MAILGUN_API_URL": env("MAILGUN_API_URL", default="https://api.mailgun.net/v3"),
}
...
```

That means we'll have to reapeat a bit the `ANYMAIL = {` part, but it will make it easier to follow all the settings for 1 provider. Right now it takes some overhead to think about the output for each provider.

diff_hunk: @@ -33,6 +33,17 @@
     "GCP",
     "None"
   ],
+  "mail_service": [
+    "{% if cookiecutter.cloud_provider == 'AWS' %}Amazon SES{% else %}Plain/Vanilla Django-Anymail{% endif %}",
+    "Mailgun",
+    "Mailjet",
+    "Mandrill",
+    "Postmark",
+    "Sendgrid",
+    "SendinBlue",
+    "SparkPost",
+    "Plain/Vanilla Django-Anymail"
path: cookiecutter.json
text: @user1:
As a user of the template, I'm not sure what "plain/vanilla" implies while it's pretty clear that the others are provider name. Is it going to spin up a local for me and send emails directly from Django? Do I need to set this up myself?

Since the question is for "Mail service", maybe we could label this option as "Other (SMTP)"? I'm open to suggestions if you think of a better name.

diff_hunk: @@ -33,6 +33,17 @@
     "GCP",
     "None"
   ],
+  "mail_service": [
+    "{% if cookiecutter.cloud_provider == 'AWS' %}Amazon SES{% else %}Plain/Vanilla Django-Anymail{% endif %}",
+    "Mailgun",
path: cookiecutter.json
text: @user1:
This seems overly complicated and I think it changes the current behaviour which is currently `Mailgun`. 
Can we please make `Amazon SES` a regular alternative (no if), and make sure that `Mailgun` remains the first choice for now?