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-environ of python-decouple
  • Foutafhandeling: gebruik fail_silently=True alleen 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