E-mails versturen met Django
Je kunt Wesender op twee manieren integreren met Django: via de ingebouwde SMTP-backend (eenvoudigst) of direct via de REST API (meeste flexibiliteit).
Vereisten
- Een Wesender-account met een geverifieerd domein
- Django 3.2 of hoger
- Python 3.8 of hoger
- Je API-key uit het dashboard (Instellingen → API-sleutels)
Methode 1: SMTP-backend (aanbevolen voor eenvoud)
Stap 1: settings.py aanpassen
import os
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.wesender.nl"
EMAIL_PORT = 587
EMAIL_USE_TLS = True # STARTTLS op poort 587
EMAIL_HOST_USER = os.environ.get("WESENDER_API_KEY")
EMAIL_HOST_PASSWORD = os.environ.get("WESENDER_API_KEY")
DEFAULT_FROM_EMAIL = "noreply@mijndomein.nl"
SERVER_EMAIL = "noreply@mijndomein.nl"
Stap 2: E-mail versturen
from django.core.mail import send_mail, EmailMultiAlternatives
# Eenvoudige tekst-e-mail
send_mail(
subject="Welkom bij ons platform",
message="Bedankt voor je aanmelding.",
from_email="noreply@mijndomein.nl",
recipient_list=["klant@voorbeeld.nl"],
)
# HTML-e-mail
email = EmailMultiAlternatives(
subject="Je bestelling is bevestigd",
body="Je bestelling #1234 is bevestigd.",
from_email="noreply@mijndomein.nl",
to=["klant@voorbeeld.nl"],
)
email.attach_alternative(
"<h1>Bestelling bevestigd</h1><p>Ordernummer: #1234</p>",
"text/html"
)
email.send()
Methode 2: REST API (maximale flexibiliteit)
Maak utils/email.py aan:
import os
import requests
WESENDER_API_KEY = os.environ["WESENDER_API_KEY"]
def stuur_email(naar, onderwerp, html, tekst="", afzender="noreply@mijndomein.nl"):
response = requests.post(
"https://api.wesender.nl/emails",
headers={
"Authorization": f"Bearer {WESENDER_API_KEY}",
"Content-Type": "application/json",
},
json={
"from": afzender,
"to": [naar] if isinstance(naar, str) else naar,
"subject": onderwerp,
"html": html,
"text": tekst,
},
timeout=10,
)
response.raise_for_status()
return response.json()
Django-signalen voor automatische e-mails
Verstuur een welkomstmail zodra een nieuw gebruikersaccount wordt aangemaakt:
# users/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
from utils.email import stuur_email
User = get_user_model()
@receiver(post_save, sender=User)
def stuur_welkomstmail(sender, instance, created, **kwargs):
if created and instance.email:
stuur_email(
naar=instance.email,
onderwerp=f"Welkom, {instance.first_name}!",
html=f"""
<h2>Welkom bij ons platform, {instance.first_name}!</h2>
<p>Je account is aangemaakt. Klik hieronder om aan de slag te gaan.</p>
<p><a href='https://mijnapp.nl/start'>Aan de slag</a></p>
""",
)
Asynchrone e-mails met Celery
Voor hoge volumes: verwerk e-mails asynchroon zodat je view snel reageert:
# tasks.py
from celery import shared_task
from utils.email import stuur_email
@shared_task(bind=True, max_retries=3)
def stuur_welkomstmail_async(self, email: str, naam: str):
try:
stuur_email(
naar=email,
onderwerp=f"Welkom, {naam}!",
html=f"<h1>Welkom, {naam}!</h1>",
)
except Exception as exc:
raise self.retry(exc=exc, countdown=60)
# In je view of signal:
stuur_welkomstmail_async.delay(gebruiker.email, gebruiker.first_name)
Tips
- Lokaal testen: gebruik
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"— e-mails verschijnen in de terminal - Omgevingsvariabelen: zet de API-key nooit hard-coded in je code; gebruik
django-environofpython-decouple - Foutafhandeling: gebruik
fail_silently=Truealleen als je zeker weet dat fouten acceptabel zijn
Foutoplossing
- SMTPAuthenticationError — gebruikersnaam én wachtwoord zijn je API-key, niet je Django-admin-wachtwoord
- ConnectionRefused — poort 587 is geblokkeerd; controleer firewall-regels
- E-mail in spam — controleer SPF, DKIM en DMARC voor je verzenddomein in het Wesender-dashboard