Mengirim email dengan Python

Kirim email di Python menggunakan email.message.EmailMessage dan smtplib.SMTP_SSL dari pustaka standar, atau panggil API email HTTP dengan paket messagebird-sdk untuk pengiriman produksi.

Pustaka standar Python menyediakan smtplib untuk koneksi SMTP dan email.message.EmailMessage untuk menyusun pesan, sehingga pengiriman SMTP dasar tidak memerlukan paket pihak ketiga. Untuk pengiriman produksi, API email HTTP mengelola pemanasan IP, percobaan ulang, dan event bounce tanpa mengharuskan Anda menjalankan mail server.

Bagaimana cara mengirim email dengan pustaka standar?

EmailMessage menyusun pesan dan mengatur header untuk Anda. smtplib.SMTP_SSL membuka koneksi terenkripsi pada 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 menulis body teks biasa dan add_alternative melampirkan versi HTML, sehingga klien memilih yang dapat mereka render. Mengirim kedua bagian adalah praktik yang baik dan membantu deliverability.

SSL atau STARTTLS?

Ada dua jalur enkripsi dan keduanya menggunakan port yang berbeda. SMTP_SSL pada 465 menegosiasikan TLS sejak byte pertama. Alternatifnya adalah SMTP biasa pada 587 diikuti starttls(), yang meng-upgrade koneksi cleartext:

with smtplib.SMTP("smtp.example.com", 587) as server:
    server.starttls()
    server.login("smtp-user", "smtp-password")
    server.send_message(msg)

Pilih salah satu berdasarkan yang didukung mail server Anda. Jangan kirim kredensial melalui koneksi yang tidak terenkripsi. Simpan username dan password di environment variable yang dibaca dengan os.environ, bukan di kode sumber.

Bagaimana cara menambahkan lampiran?

add_attachment menerima byte beserta tipe MIME. Baca file dalam mode biner:

with open("invoice.pdf", "rb") as f:
    msg.add_attachment(
        f.read(),
        maintype="application",
        subtype="pdf",
        filename="invoice-1042.pdf",
    )

Mengapa meninggalkan SMTP mentah untuk produksi?

Pengiriman produksi menambah kebutuhan yang tidak ditangani pustaka standar. Anda memerlukan mail server dengan reputasi IP yang bersih, record SPF, DKIM, dan DMARC, logika coba lagi untuk kegagalan sementara, dan cara melacak bounce serta komplain. API HTTP menangani lapisan tersebut: Anda melakukan autentikasi dengan kunci API, mengirim JSON, dan membaca respons terstruktur alih-alih mem-parse kode status SMTP.

Kirim dengan Bird

Instal SDK Python Bird (pip install messagebird-sdk) untuk mengirim melalui HTTPS tanpa mengelola koneksi 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() membaca BIRD_API_KEY dari environment secara otomatis. Mengirim dari onboarding@messagebird.dev ke alamat sandbox delivered@messagebird.dev memvalidasi kunci dan payload Anda sebelum Anda mengonfigurasi domain kustom. Jika permintaan gagal validasi, APIError menampilkan kode status HTTP dan kode kesalahannya.

Bangun di jaringan yang sama.

Kunci API uji coba langsung tersedia untuk Anda. Akses produksi terbuka saat Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Start building with Bird in minutes.