Python potrafi wysłać e-mail bez instalowania czegokolwiek. Biblioteka standardowa dostarcza smtplib do połączenia SMTP i email.message.EmailMessage do budowania wiadomości, więc działający skrypt to około piętnaście linii. Poniżej znajdziesz ten skrypt z poprawnie wykonanym TLS, a następnie argumenty za przejściem na HTTP API, gdy pojawi się prawdziwy ruch.
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 na stałe w kodzie.
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?
Skrypt działa, ale produkcja rodzi problemy, których biblioteka standardowa nie rozwiązuje. Potrzebujesz serwera pocztowego z czystą reputacją IP, poprawnych rekordów SPF, DKIM i DMARC, logiki ponawiania przy przejściowych błędach oraz sposobu na śledzenie odrzuceń i skarg. HTTP API obejmuje to wszystko. Uwierzytelniasz się kluczem, wysyłasz JSON i odczytujesz ustrukturyzowane odpowiedzi zamiast parsować kody statusów SMTP.
Wyślij za pomocą Bird
Bird Python SDK wysyła tę samą wiadomość bez warstwy SMTP:
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>",
)
Adres sandboxowy delivered@bird.dev zawsze przyjmuje pocztę, więc pierwszy test potwierdza poprawność klucza i ładunku, zanim skierujesz wiadomości do prawdziwych odbiorców. SDK zwraca parę (data, error), co sprawia, że obsługa błędów jest jawna, zamiast przechwytywać wyjątki SMTP. Jeśli bliższy jest ci PHP, poradnik PHPMailer opisuje odpowiednik w tamtym ekosystemie.
FAQ
Czy muszę coś instalować, żeby wysłać e-mail w Pythonie?
Nie. smtplib i email.message znajdują się w bibliotece standardowej, więc podstawowe wysyłanie przez SMTP nie wymaga żadnych pakietów. Zależność dodajesz dopiero wtedy, gdy chcesz klienta wyższego poziomu lub HTTP API.
Jaka jest różnica między portem 465 a 587?
Port 465 oczekuje TLS od pierwszego bajtu, co obsługuje smtplib.SMTP_SSL. Port 587 startuje w trybie nieszyfrowanym i przechodzi na szyfrowanie za pomocą starttls(). Oba kończą z szyfrowaniem; różnią się tylko momentem negocjacji.
Kiedy przejść ze smtplib na API?
Gdy zależy ci na dostarczalności, ponawianiu i śledzeniu zdarzeń. Biblioteka standardowa wysyła wiadomość, ale nie zarządza reputacją ani nie raportuje, co stało się po przekazaniu. API takie jak Bird email pokrywa tę warstwę.
Pełny kształt żądania i odpowiedzi znajdziesz w przewodniku po wysyłaniu e-maili, który prowadzi przez API od początku do końca.