Home

Awesome

<!-- SPDX-FileCopyrightText: 2013-2022 Miguel Gonzalez <migonzalvar@gmail.com> --> <!-- SPDX-License-Identifier: CC-BY-4.0 -->

dj-email-url Latest version on PyPI

CI status Python versions License

This package allows using an environment variable to configure the email backend in a Django application as described in 12factor.

It is the equivalent of dj-database-url, but for the email.

Usage

Import the package in settings.py:

import dj_email_url

Fetch your email configuration values. The default option is to fetch them from EMAIL_URL environment variable:

email_config = dj_email_url.config()

Another option is to parse a string directly with an arbitrary email URL:

email_config = dj_email_url.parse('smtp://...')

Finally, it is necessary to assign values to settings:

EMAIL_FILE_PATH = email_config['EMAIL_FILE_PATH']
EMAIL_HOST_USER = email_config['EMAIL_HOST_USER']
EMAIL_HOST_PASSWORD = email_config['EMAIL_HOST_PASSWORD']
EMAIL_HOST = email_config['EMAIL_HOST']
EMAIL_PORT = email_config['EMAIL_PORT']
EMAIL_BACKEND = email_config['EMAIL_BACKEND']
EMAIL_USE_TLS = email_config['EMAIL_USE_TLS']
EMAIL_USE_SSL = email_config['EMAIL_USE_SSL']
EMAIL_TIMEOUT = email_config['EMAIL_TIMEOUT']

Alternatively, it is possible to use this less explicit shortcut:

vars().update(email_config)

Supported backends

Currently, dj-email-url supports:

BackendEMAIL_URLDescription
Consoleconsole:Write to stdout (development)
SMTPsmtp:Send to mail transfer agent at localhost on port 25
SMTPsubmission://USER:PASSWORD@smtp.example.comSend to SMTP server on port 587 (STARTTLS)
Filefile:Write to a file
In-memorymemory:
Dummydummy:

[!WARNING] Using special characters on passwords

To use characters that have a special meaning in a URL (think of &) you should use percentencoding. For example, m&m would become m%26m.

Because the percent character itself (%) serves as the indicator for percent-encoded octets, it must be percent-encoded as %25.

>>> from urllib.parse import quote_plus
>>> import dj_email_url
>>> quote_plus("!@#$%^&*")
'%21%40%23%24%25%5E%26%2A'
>>> dj_email_url.parse("smtp://user:%21%40%23%24%25%5E%26%2A@localhost")["EMAIL_HOST_PASSWORD"]
'!@#$%^&*'

Set from email addresses

dj-email-url also supports to optionally specify origin email addresses.

SettingQuery parameter
SERVER_EMAIL_server_email
DEFAULT_FROM_EMAIL_default_from_email

For example: smtp://USER:PASSWORD@smtp.example.com/?_server_email=error@example.com

Do not forget to assign values to settings:

SERVER_EMAIL = email_config.get('SERVER_EMAIL', 'root@localhost')
DEFAULT_FROM_EMAIL = email_config.get('DEFAULT_FROM_EMAIL', 'webmaster@localhost')

Other settings

There are other settings available to set from query parameters.

SettingQuery parameterComments
EMAIL_TIMEOUTtimeoutNew in v1.0.5.

More info

SMTP backend

The SMTP backend is selected when the scheme in the URL is one of the following values:

ValueDefault portComment
smtp25Local mail transfer agent
submission or submit587SMTP with STARTTLS

[!NOTE] Changed in version 0.1

The use of smtps is now discouraged. It was used to indicate to use TLS connections, that is to set EMAIL_USE_TLSto True. Now is recommended to use submission or submit.

See service name for port numbers and Uniform Resource Identifier Schemes at IANA for more details.

On the most popular mail configuration option is to use a third party SMTP server to relay emails.

>>> url = 'submission://user@example.com:pass@smtp.example.com'
>>> url = dj_email_url.parse(url)
>>> assert url['EMAIL_PORT'] == 587
>>> assert url['EMAIL_USE_SSL'] is False
>>> assert url['EMAIL_USE_TLS'] is True

Another common option is to use a local mail transfer agent as Postfix or Exim. In this case, it as easy as:

>>> url = 'smtp://'
>>> url = dj_email_url.parse(url)
>>> assert url['EMAIL_HOST'] == 'localhost'
>>> assert url['EMAIL_PORT'] == 25
>>> assert url['EMAIL_USE_SSL'] is False
>>> assert url['EMAIL_USE_TLS'] is False

It is also possible to configure SMTP-over-SSL (usually on 465). This configuration is not generally recommended, but might be needed for legacy systems. To use this protocol set ssl=True as a query parameter and indicate the port explicitly:

>>> url = 'smtp://user@domain.com:pass@smtp.example.com:465/?ssl=True'
>>> url = dj_email_url.parse(url)
>>> assert url['EMAIL_PORT'] == 465
>>> assert url['EMAIL_USE_SSL'] is True
>>> assert url['EMAIL_USE_TLS'] is False

File backend

The file backend is the only one which needs a path. The URL's path is used as the EMAIL_FILE_PATH key.

Running the tests

Fork, then clone the repo:

git clone git@github.com:put-your-user-here/dj-email-url.git

Then you can run the tests with the just command runner:

just test

If you don't have just installed, you can look in the justfile for the commands that are run.

Project links

License

This work is licensed under several licenses.

For more accurate information, check the individual files.

You can check the compliance with REUSE helper tool.