Skip to Content
FeaturesModulesEmailConfiguration

Email Configuration

EmailConfig is a Pydantic v2 model set on DjangoConfig.email. It maps directly to Django’s EMAIL_* settings and is applied automatically at startup.

from django_cfg.models.services.email import EmailConfig

EmailConfig Fields

Backend

FieldTypeDefaultDescription
backendstr"console"Email backend type
ValueDjango classUse case
"smtp"django.core.mail.backends.smtp.EmailBackendProduction SMTP
"console"django.core.mail.backends.console.EmailBackendPrint to stdout (development)
"file"django.core.mail.backends.filebased.EmailBackendWrite to files (testing)
"memory"django.core.mail.backends.locmem.EmailBackendStore in memory (unit tests)
"dummy"django.core.mail.backends.dummy.EmailBackendDiscard silently

SMTP Connection

FieldTypeDefaultDescription
hoststr"localhost"SMTP server hostname
portint587SMTP port (1–65535)
usernameOptional[str]NoneSMTP authentication username
passwordOptional[str]NoneSMTP authentication password
use_tlsboolTrueUse STARTTLS upgrade
use_sslboolFalseUse SSL/TLS wrapper from the start
ssl_verifyboolTrueVerify SSL certificate
timeoutint30Connection timeout in seconds (1–300)

use_tls=True and use_ssl=True cannot both be set. The validator raises ValueError if both are enabled. Use use_tls=True for port 587 (STARTTLS) and use_ssl=True for port 465 (SSL).

When ssl_verify=False, a custom backend is used that skips certificate verification. Never use this in production.

From Address

FieldTypeDefaultDescription
default_fromstr"[email protected]"Default sender address (must contain @)

If DjangoConfig.project_name is set, the from address is automatically formatted as "Project Name <[email protected]>". You can override this by passing a pre-formatted string with < and >.

File Backend

FieldTypeDefaultDescription
file_pathstr"emails/"Directory for file backend output

Only used when backend="file".

DjangoConfig Fields

FieldTypeDefaultDescription
emailOptional[EmailConfig]NoneEmail configuration
admin_emailslist[str][]Admin addresses for send_admin_email()
from django_cfg import DjangoConfig from django_cfg.models.services.email import EmailConfig class MyConfig(DjangoConfig): email = EmailConfig( backend="smtp", host="smtp.gmail.com", port=587, username="${EMAIL_USER}", password="${EMAIL_PASSWORD}", use_tls=True, default_from="[email protected]", ) admin_emails = ["[email protected]", "[email protected]"]

Provider Examples

Gmail (App Password)

Gmail requires a 16-character App Password when 2-Step Verification is enabled. Create one at myaccount.google.com/apppasswords .

email = EmailConfig( backend="smtp", host="smtp.gmail.com", port=587, username="[email protected]", password="${GMAIL_APP_PASSWORD}", use_tls=True, default_from="[email protected]", )

SendGrid

email = EmailConfig( backend="smtp", host="smtp.sendgrid.net", port=587, username="apikey", password="${SENDGRID_API_KEY}", use_tls=True, default_from="[email protected]", )

Mailgun

email = EmailConfig( backend="smtp", host="smtp.mailgun.org", port=587, username="[email protected]", password="${MAILGUN_SMTP_PASSWORD}", use_tls=True, default_from="[email protected]", )

AWS SES (SMTP Interface)

email = EmailConfig( backend="smtp", host="email-smtp.us-east-1.amazonaws.com", port=587, username="${AWS_SES_SMTP_USER}", password="${AWS_SES_SMTP_PASSWORD}", use_tls=True, default_from="[email protected]", )

Development (Console Output)

email = EmailConfig(backend="console")

Development (File Inspection)

email = EmailConfig(backend="file", file_path="sent_emails/")

Django Settings Mapping

EmailConfig maps to standard Django settings applied automatically at startup:

EmailConfig fieldDjango setting
backendEMAIL_BACKEND
hostEMAIL_HOST
portEMAIL_PORT
use_tlsEMAIL_USE_TLS
use_sslEMAIL_USE_SSL
timeoutEMAIL_TIMEOUT
usernameEMAIL_HOST_USER
passwordEMAIL_HOST_PASSWORD
default_fromDEFAULT_FROM_EMAIL

You do not call to_django_settings() directly — django-cfg applies it during configuration loading.

See Also

Last updated on