Python kann E-Mails senden, ohne dass etwas installiert werden muss. Die Standardbibliothek liefert smtplib für die SMTP-Verbindung und email.message.EmailMessage zum Erstellen der Nachricht mit, sodass ein funktionierendes Skript etwa fünfzehn Zeilen umfasst. Unten finden Sie dieses Skript mit korrekt umgesetztem TLS und anschließend die Argumente für den Wechsel zu einem HTTP API, sobald echter Traffic anfällt.
Wie senden Sie E-Mails mit der Standardbibliothek?
EmailMessage erstellt die Nachricht und setzt die Header für Sie. smtplib.SMTP_SSL öffnet eine verschlüsselte Verbindung auf Port 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 schreibt den Klartext-Body und add_alternative hängt die HTML-Version an, sodass Clients rendern, was sie unterstützen. Beide Teile zu senden ist gute Praxis und hilft bei der Zustellbarkeit.
SSL oder STARTTLS?
Es gibt zwei Verschlüsselungswege, die unterschiedliche Ports nutzen. SMTP_SSL auf 465 handelt TLS ab dem ersten Byte aus. Die Alternative ist reines SMTP auf 587, gefolgt von starttls(), das eine Klartextverbindung hochstuft:
with smtplib.SMTP("smtp.example.com", 587) as server:
server.starttls()
server.login("smtp-user", "smtp-password")
server.send_message(msg)
Wählen Sie den Weg, den Ihr Mailserver unterstützt. Senden Sie Zugangsdaten niemals über eine unverschlüsselte Verbindung. Speichern Sie Benutzername und Passwort in Umgebungsvariablen und lesen Sie sie mit os.environ aus, statt sie fest im Code zu hinterlegen.
Wie fügen Sie einen Anhang hinzu?
add_attachment nimmt die Bytes plus einen MIME-Typ entgegen. Lesen Sie die Datei im Binärmodus:
with open("invoice.pdf", "rb") as f:
msg.add_attachment(
f.read(),
maintype="application",
subtype="pdf",
filename="invoice-1042.pdf",
)
Warum im Produktivbetrieb weg von rohem SMTP?
Das Skript funktioniert, aber der Produktivbetrieb bringt Probleme mit sich, die die Standardbibliothek nicht löst. Sie brauchen einen Mailserver mit sauberer IP-Reputation, korrekte SPF-, DKIM- und DMARC-Einträge, Retry-Logik für vorübergehende Fehler und eine Möglichkeit, Bounces und Beschwerden einzusehen. Ein HTTP API bündelt all das. Sie authentifizieren sich mit einem Schlüssel, senden JSON und lesen strukturierte Antworten, statt SMTP-Statuscodes zu parsen.
Senden mit Bird
Das Bird Python SDK sendet dieselbe Nachricht ohne den SMTP-Unterbau:
import bird
client = bird.Bird(api_key=os.environ["BIRD_API_KEY"])
data, error = client.emails.send(
from_="you@yourdomain.com",
to="delivered@bird.dev",
subject="Hello from Python",
html="<p>It works.</p>",
)
Die delivered@bird.dev-Sandbox-Adresse nimmt immer E-Mails an, sodass der erste Lauf Ihren Schlüssel und Payload bestätigt, bevor Sie auf echte Empfänger umschalten. SDK gibt ein (data, error)-Paar zurück, wodurch die Fehlerbehandlung explizit bleibt, statt SMTP-Exceptions abzufangen. Falls PHP eher Ihre Sprache ist, deckt der PHPMailer-Leitfaden das Äquivalent in diesem Ökosystem ab.
FAQ
Muss ich etwas installieren, um E-Mails in Python zu senden?
Nein. smtplib und email.message sind in der Standardbibliothek enthalten, sodass ein einfacher SMTP-Versand keine Pakete benötigt. Eine Abhängigkeit kommt erst hinzu, wenn Sie einen höherwertigen Client oder einen HTTP API verwenden möchten.
Was ist der Unterschied zwischen Port 465 und 587?
Port 465 erwartet TLS von Anfang an, was smtplib.SMTP_SSL übernimmt. Port 587 beginnt im Klartext und stuft mit starttls() hoch. Beide enden verschlüsselt; sie handeln es nur an verschiedenen Stellen aus.
Wann sollte ich von smtplib zu einem API wechseln?
Wenn Ihnen Zustellbarkeit, Retries und Event-Tracking wichtig sind. Die Standardbibliothek sendet eine Nachricht; sie verwaltet keine Reputation und meldet nicht, was nach der Übergabe passiert ist. Ein API wie Bird email deckt diese Schicht ab.
Die vollständige Request- und Response-Struktur erläutert der Leitfaden zum E-Mail-Versand, der API von Anfang bis Ende durchgeht.