SMTP par Tenant

Chaque tenant peut configurer son propre serveur SMTP pour l’envoi d’emails. Si aucune configuration n’est définie, le système utilise les paramètres SMTP globaux de Django (définis dans .env).

Modèle TenantSMTPConfig

Module : src.module.tenant.infrastructure.smtp

class TenantSMTPConfig(SharedModel)

Configuration SMTP par tenant, stockée dans le schéma public.

tenant: OneToOneField Tenant

Relation 1:1 avec le tenant.

host: CharField

Hostname du serveur SMTP (ex: smtp.gmail.com).

port: PositiveIntegerField

Port SMTP (587 pour TLS, 465 pour SSL).

username: CharField

Identifiant d’authentification SMTP.

password: CharField

Mot de passe SMTP.

use_tls: BooleanField

Utiliser STARTTLS (port 587).

use_ssl: BooleanField

Utiliser SSL implicite (port 465).

from_email: EmailField

Adresse expéditeur par défaut pour ce tenant.

timeout: PositiveIntegerField

Timeout de connexion (secondes).

is_active: BooleanField

Désactiver pour revenir aux paramètres SMTP globaux.

Table:

mt_tenant_smtp_config

Backend email tenant-aware

class TenantSMTPEmailBackend(SMTPBackend)

Backend email Django qui utilise automatiquement la config SMTP du tenant courant (résolu via current_tenant_var).

Si le tenant n’a pas de TenantSMTPConfig active, le backend utilise les paramètres SMTP globaux de Django.

# settings.py — pour rendre TOUS les emails tenant-aware :
EMAIL_BACKEND = 'src.module.tenant.infrastructure.smtp.TenantSMTPEmailBackend'

Fonctions utilitaires

send_tenant_email(subject, body, to, from_email=None, html_body=None, ...) int

Envoie un email via le serveur SMTP du tenant courant.

from src.module.tenant.infrastructure.smtp import send_tenant_email

send_tenant_email(
    subject="Facture prête",
    body="Votre facture est disponible.",
    to=["client@example.com"],
)
get_tenant_smtp_config() TenantSMTPConfig | None

Retourne la config SMTP du tenant courant, ou None.

get_tenant_email_connection(config=None, fail_silently=False)

Retourne une connexion SMTP configurée pour le tenant courant.

get_tenant_from_email() str

Retourne l’adresse expéditeur du tenant, ou le DEFAULT_FROM_EMAIL global.

Configuration via l’admin

Le modèle TenantSMTPConfig est enregistré dans l’admin Django avec un formulaire structuré par sections :

  • Général — tenant + activation

  • Serveur SMTP — host, port, TLS/SSL, timeout

  • Authentification — username, password

  • Expéditeur — from_email

# Exemple de création via code
from src.module.tenant.infrastructure.smtp import TenantSMTPConfig

TenantSMTPConfig.objects.create(
    tenant=my_tenant,
    host="smtp.sendgrid.net",
    port=587,
    username="apikey",
    password="SG.xxxxx",
    use_tls=True,
    from_email="invoices@acme-corp.com",
)

Flux de résolution

send_mail() / send_tenant_email()
      │
      ▼
get_current_tenant() ──► tenant_id
      │
      ▼
TenantSMTPConfig.objects.get(tenant=..., is_active=True)
      │
      ├── trouvé ──► connexion SMTP tenant
      │
      └── non trouvé ──► connexion SMTP globale (settings.py / .env)