Wysyłanie e-maili w Pythonie

Wyślij e-mail w Pythonie za pomocą email.message.EmailMessage i smtplib.SMTP_SSL z biblioteki standardowej albo wywołaj API e-mail HTTP przy użyciu pakietu messagebird-sdk, aby dostarczać wiadomości w produkcji.

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.

Buduj na tej samej sieci.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i zweryfikowaniu nadawcy.

Start building with Bird in minutes.