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.