00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Invio Email

Django fornisce un sistema completo per l’invio di email, supportando SMTP, email HTML, allegati e diversi backend. Che tu debba inviare una semplice notifica o una newsletter complessa, Django ha gli strumenti giusti.

Configurazione del Backend Email

La configurazione avviene nel file settings.py. Per un server SMTP come Gmail:

# settings.py
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "tuo_indirizzo@gmail.com"
EMAIL_HOST_PASSWORD = "password_app"  # Usa una password per app
DEFAULT_FROM_EMAIL = "Il Mio Sito <noreply@miosito.com>"

Backend per lo Sviluppo

Durante lo sviluppo, puoi usare il backend console per visualizzare le email nel terminale senza inviarle realmente:

# settings.py (sviluppo)
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"

Altri backend utili per il testing:

# Salva le email come file
EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = "/tmp/email-django"

# Non invia nulla (utile nei test)
EMAIL_BACKEND = "django.core.mail.backends.dummy.EmailBackend"

# Salva in memoria (utile nei test unitari)
EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"

Invio Email Semplice con send_mail()

La funzione send_mail() e il modo piu diretto per inviare un’email:

from django.core.mail import send_mail

send_mail(
    subject="Benvenuto nel nostro sito",
    message="Grazie per esserti registrato!",
    from_email="noreply@miosito.com",
    recipient_list=["utente@example.com"],
    fail_silently=False,
)

Il parametro fail_silently=False solleva un’eccezione in caso di errore, utile per il debug.

Invio Massivo con send_mass_mail()

Per inviare piu email in modo efficiente con una singola connessione SMTP:

from django.core.mail import send_mass_mail

messaggio1 = (
    "Oggetto primo",
    "Corpo del primo messaggio",
    "noreply@miosito.com",
    ["utente1@example.com"],
)

messaggio2 = (
    "Oggetto secondo",
    "Corpo del secondo messaggio",
    "noreply@miosito.com",
    ["utente2@example.com"],
)

send_mass_mail((messaggio1, messaggio2), fail_silently=False)

La Classe EmailMessage

Per un controllo maggiore, usa la classe EmailMessage:

from django.core.mail import EmailMessage

email = EmailMessage(
    subject="Report Mensile",
    body="In allegato trovi il report mensile.",
    from_email="noreply@miosito.com",
    to=["destinatario@example.com"],
    cc=["copia@example.com"],
    bcc=["copia_nascosta@example.com"],
    reply_to=["supporto@miosito.com"],
)

email.send(fail_silently=False)

Email HTML

Per inviare email con contenuto HTML, usa EmailMultiAlternatives:

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string

# Renderizza il template HTML
html_content = render_to_string("email/benvenuto.html", {
    "nome": "Marco",
    "link_attivazione": "https://miosito.com/attiva/abc123",
})

email = EmailMultiAlternatives(
    subject="Benvenuto!",
    body="Benvenuto Marco! Attiva il tuo account.",  # Versione testo
    from_email="noreply@miosito.com",
    to=["marco@example.com"],
)
email.attach_alternative(html_content, "text/html")
email.send()

Allegati

Puoi aggiungere allegati alle email in diversi modi:

from django.core.mail import EmailMessage

email = EmailMessage(
    subject="Documenti richiesti",
    body="Ecco i documenti che hai richiesto.",
    from_email="noreply@miosito.com",
    to=["cliente@example.com"],
)

# Allegato da file
email.attach_file("/percorso/al/documento.pdf")

# Allegato da contenuto in memoria
email.attach("report.csv", contenuto_csv, "text/csv")

email.send()

Esempio Pratico in una View

from django.core.mail import send_mail
from django.http import JsonResponse

def contattaci(request):
    if request.method == "POST":
        nome = request.POST.get("nome")
        email_utente = request.POST.get("email")
        messaggio = request.POST.get("messaggio")

        send_mail(
            subject=f"Contatto da {nome}",
            message=messaggio,
            from_email=email_utente,
            recipient_list=["info@miosito.com"],
        )

        return JsonResponse({"stato": "Email inviata con successo"})

Conclusione

Django rende l’invio di email semplice e flessibile. Il backend console e ideale per lo sviluppo, mentre in produzione puoi configurare qualsiasi server SMTP. Per email complesse con template HTML e allegati, la classe EmailMessage e EmailMultiAlternatives offrono tutto il controllo necessario.