Inviare email con Python

Per inviare email in Python usa email.message.EmailMessage e smtplib.SMTP_SSL della libreria standard, oppure chiama un API email HTTP con il pacchetto messagebird-sdk per la consegna in produzione.

La libreria standard di Python include smtplib per la connessione SMTP e email.message.EmailMessage per costruire il messaggio, quindi un invio SMTP di base non richiede pacchetti di terze parti. Per la consegna in produzione, un API email HTTP gestisce il riscaldamento degli IP, i nuovi tentativi e gli eventi di bounce senza che tu debba gestire un mail server.

Come si invia un'email con la libreria standard?

EmailMessage costruisce il messaggio e imposta gli header. smtplib.SMTP_SSL apre una connessione cifrata sulla porta 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 scrive il corpo in testo semplice e add_alternative allega la versione HTML, così i client scelgono cosa possono renderizzare. Inviare entrambe le parti è una buona pratica e aiuta con la deliverability.

SSL o STARTTLS?

Esistono due percorsi di cifratura e usano porte diverse. SMTP_SSL sulla 465 negozia TLS dal primo byte. L'alternativa è SMTP in chiaro sulla 587 seguita da starttls(), che aggiorna una connessione in chiaro:

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

Scegli in base a ciò che supporta il tuo mail server. Non inviare credenziali su una connessione non cifrata. Tieni username e password in variabili d'ambiente, lette con os.environ, invece che nel codice sorgente.

Come si aggiunge un allegato?

add_attachment accetta i byte più un tipo MIME. Leggi il file in modalità binaria:

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

Perché abbandonare SMTP raw per la produzione?

L'invio in produzione aggiunge requisiti che la libreria standard non gestisce. Serve un mail server con una reputazione IP pulita, record SPF, DKIM e DMARC, una logica per riprovare in caso di errori transitori e un modo per tracciare bounce e reclami. Un API HTTP gestisce questo livello: ti autentichi con una chiave API, invii JSON e leggi risposte strutturate invece di analizzare codici di stato SMTP.

Inviare con Bird

Installa l'SDK Python di Bird (pip install messagebird-sdk) per inviare tramite HTTPS senza gestire una connessione 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() legge automaticamente BIRD_API_KEY dall'ambiente. Inviando da onboarding@messagebird.dev all'indirizzo sandbox di delivered@messagebird.dev verifichi la chiave e il payload prima di configurare un dominio personalizzato. Se la richiesta non supera la validazione, APIError restituisce il codice di stato HTTP e il codice di errore.

Costruisci sulla stessa rete.

Una chiave API di test è subito tua. L'accesso alla produzione si sblocca quando aggiungi un metodo di pagamento e verifichi un mittente.

Start building with Bird in minutes.