Biblioteka standardowa Pythona zawiera smtplib do obsługi połączenia SMTP i email.message.EmailMessage do budowania wiadomości, więc podstawowe wysyłanie przez SMTP nie wymaga pakietów zewnętrznych. Przy dostarczaniu w produkcji API e-mail HTTP zarządza rozgrzewaniem IP, ponownymi próbami i zdarzeniami odrzuceń, a ty nie musisz utrzymywać własnego serwera pocztowego.
Jak wysłać e-mail za pomocą biblioteki standardowej?
EmailMessage buduje wiadomość i ustawia nagłówki za ciebie. smtplib.SMTP_SSL otwiera szyfrowane połączenie na porcie 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 zapisuje treść w postaci zwykłego tekstu, a add_alternative dołącza wersję HTML, dzięki czemu klienty wybierają to, co potrafią wyrenderować. Wysyłanie obu części to dobra praktyka, która pomaga w kwestii dostarczalności.
SSL czy STARTTLS?
Istnieją dwie ścieżki szyfrowania i korzystają z różnych portów. SMTP_SSL na porcie 465 negocjuje TLS od pierwszego bajtu. Alternatywą jest zwykłe SMTP na porcie 587, po którym następuje starttls(), które uaktualnia nieszyfrowane połączenie:
with smtplib.SMTP("smtp.example.com", 587) as server:
server.starttls()
server.login("smtp-user", "smtp-password")
server.send_message(msg)
Wybierz wariant obsługiwany przez twój serwer pocztowy. Nie wysyłaj danych uwierzytelniających przez nieszyfrowane połączenie. Przechowuj nazwę użytkownika i hasło w zmiennych środowiskowych, odczytywanych za pomocą os.environ, a nie w kodzie źródłowym.
Jak dodać załącznik?
add_attachment przyjmuje bajty wraz z typem MIME. Odczytaj plik w trybie binarnym:
with open("invoice.pdf", "rb") as f:
msg.add_attachment(
f.read(),
maintype="application",
subtype="pdf",
filename="invoice-1042.pdf",
)
Dlaczego warto odejść od surowego SMTP w produkcji?
Wysyłanie w produkcji wiąże się z wymaganiami, których biblioteka standardowa nie obsługuje. Potrzebujesz serwera pocztowego z czystą reputacją IP, rekordów SPF, DKIM i DMARC, logiki ponownych prób przy przejściowych błędach oraz sposobu na śledzenie odrzuceń i skarg. HTTP API obsługuje tę warstwę: uwierzytelniasz się kluczem API, wysyłasz JSON i odczytujesz ustrukturyzowane odpowiedzi zamiast parsować kody statusów SMTP.
Wyślij za pomocą Bird
Zainstaluj Bird Python SDK (pip install messagebird-sdk), aby wysyłać przez HTTPS bez zarządzania połączeniem SMTP:
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() automatycznie odczytuje BIRD_API_KEY ze środowiska. Wysyłka z onboarding@messagebird.dev na adres sandboxowy delivered@messagebird.dev pozwala sprawdzić klucz i ładunek, zanim skonfigurujesz własną domenę. Jeśli żądanie nie przejdzie walidacji, APIError zwraca kod statusu HTTP i kod błędu.