De standaardbibliotheek van Python bevat smtplib voor de SMTP-verbinding en email.message.EmailMessage voor het opbouwen van het bericht, dus voor een eenvoudige SMTP-verzending heb je geen packages van derden nodig. Voor aflevering in productie regelt een HTTP e-mail-API de IP-warmup, nieuwe pogingen en bounce-events, zonder dat je zelf een mailserver hoeft te draaien.
Hoe verstuur je e-mail met de standaardbibliotheek?
EmailMessage bouwt het bericht op en stelt de headers voor je in. smtplib.SMTP_SSL opent een versleutelde verbinding op poort 465:
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["From"] = "you@yourdomain.com"
msg["To"] = "recipient@example.org"
msg["Subject"] = "Your receipt"
msg.set_content("Thanks for your order. This is the plain-text version.")
msg.add_alternative("<p>Thanks for your order.</p>", subtype="html")
with smtplib.SMTP_SSL("smtp.example.com", 465) as server:
server.login("smtp-user", "smtp-password")
server.send_message(msg)
set_content schrijft de platte-tekstversie en add_alternative voegt de HTML-versie toe, zodat clients weergeven wat ze aankunnen. Beide delen meesturen is een goede gewoonte en helpt bij afleverbaarheid.
SSL of STARTTLS?
Er bestaan twee versleutelingspaden en ze gebruiken verschillende poorten. SMTP_SSL op 465 onderhandelt TLS vanaf de eerste byte. Het alternatief is gewone SMTP op 587 gevolgd door starttls(), die een onversleutelde verbinding upgradet:
with smtplib.SMTP("smtp.example.com", 587) as server:
server.starttls()
server.login("smtp-user", "smtp-password")
server.send_message(msg)
Kies op basis van wat je mailserver ondersteunt. Verstuur geen inloggegevens over een onversleutelde verbinding. Bewaar de gebruikersnaam en het wachtwoord in omgevingsvariabelen, uitgelezen met os.environ, en niet in de broncode.
Hoe voeg je een bijlage toe?
add_attachment neemt de bytes plus een MIME-type. Lees het bestand in binaire modus:
with open("invoice.pdf", "rb") as f:
msg.add_attachment(
f.read(),
maintype="application",
subtype="pdf",
filename="invoice-1042.pdf",
)
Waarom overstappen van raw SMTP voor productie?
Versturen in productie brengt eisen met zich mee die de standaardbibliotheek niet afhandelt. Je hebt een mailserver nodig met een schone IP-reputatie, SPF-, DKIM- en DMARC-records, logica om bij tijdelijke fouten opnieuw te proberen, en een manier om bounces en klachten te volgen. Een HTTP API neemt die laag over: je authenticeert met een API-key, verstuurt JSON en leest gestructureerde responses in plaats van SMTP-statuscodes te parsen.
Versturen met Bird
Installeer de Bird Python SDK (pip install messagebird-sdk) om via HTTPS te versturen zonder zelf een SMTP-verbinding te beheren:
from bird import APIError, Bird
client = Bird()
try:
message = client.email.send(
from_="onboarding@messagebird.dev",
to=["delivered@messagebird.dev"],
subject="Hello from Python",
text="It works.",
html="<p>It works.</p>",
)
print(message.id, message.status)
except APIError as err:
print("send failed:", err)
Bird() leest BIRD_API_KEY automatisch uit de omgeving. Door vanaf onboarding@messagebird.dev naar het delivered@messagebird.dev sandboxadres te versturen, controleer je je key en payload voordat je een eigen domein instelt. Als het verzoek niet door de validatie komt, toont APIError de HTTP-statuscode en de foutcode.