Wie man E-Mails über API in Python sendet (Schnelles Tutorial)

Inhaltsübersicht
Inhaltsübersicht 11 Abschnitte
Erste Schritte
E-Mails senden
Produktion
Referenz
Python Tutorial

Wie man E-Mail über API senden in Python (Schnell-Tutorial)

Überspringen Sie den SMTP-Boilerplate-Code. Diese Anleitung zeigt Ihnen, wie Sie Unipile einheitliche E-Mail-API E-Mails in Python senden - mit Copy-Paste-Beispielen für Gmail, Outlook und IMAP mit dem Anfragen Bibliothek.

E-Mail-API Python E-Mail-API Python Gmail / Outlook / IMAP Requests / aiohttp Flask / Django / FastAPI
send_email.py
import Anfragen, Betriebssystem API-Schlüssel = os.environ['UNIPILE_API_SCHLÜSSEL'] DSN = os.environ['UNIPILE_DSN'] KONTO_ID = os.environ['UNIPILE_KONTO_ID'] response = requests.Beitrag( f'{DSN}/api/v1/emails', Kopfzeilen={'X-API-KEY': API-Schlüssel}, daten={ 'Konto-ID': KONTO_ID, 'zu': '[{"display_name":"Alice","identifier":"alice@acme.com"}]', 'Betreff': 'Hallo von Python', 'Körper': '

Gesendet über Unipile!

'
} ) print(Antwort.json())
E-Mail zugestellt - 202 Akzeptiert
Kompatibel mit: Google Mail Ausblick IMAP
Zu lang; nicht gelesen

5-Zeilen-Python-Beispiel

Wenn du es bereits weißt Was ist eine E-Mail-Send-API und möchte nur den Python-Code für die E-Mail-API, der tatsächlich funktioniert, hier ist er. Das vollständige Tutorial folgt unten.

1
Installiere Anfragen
pip install requests python-dotenv
2
Umgebungsvariablen setzen
Hinzufügen UNIPILE_DSN, UNIPILE_API_KEYund UNIPILE_KONTO_ID zu dir .env Datei.
3
E-Mail-Konto verknüpfen
OAuth für Gmail/Outlook oder SMTP-Zugangsdaten für jeden IMAP-Server. Ein API-Aufruf – dies tun Sie nur einmal pro Konto.
4
POST an /api/v1/emails
Pass account_id, zu, Themaund Körper. Erledigt.
Dieselbe Python-Code funktioniert für Gmail, Outlook und jeden IMAP-Server – keine anbieterspezifische Logik erforderlich. Überprüfen Sie die E-Mail-API-Leitfaden Für die vollständige Konzeptübersicht.
send_email.py
import Anfragen, Betriebssystem from dotenv import laden_dotenv laden_dotenv() API-Schlüssel = os.environ['UNIPILE_API_SCHLÜSSEL'] DSN = os.environ['UNIPILE_DSN'] KONTO_ID = os.environ['UNIPILE_KONTO_ID'] resp = Anfragen.Beitrag( f'{DSN}/api/v1/emails', Kopfzeilen={'X-API-KEY': API-Schlüssel}, daten={ 'Konto-ID': KONTO_ID, 'zu': '[{"display_name":"Alice","identifier":"alice@acme.com"}]', 'Betreff': 'Hallo von Python', 'Körper': '

Gesendet über Unipile!

'
} ) printbzw.json()) # {'tracking_id': 'msg_...'}
Einrichtung

Voraussetzungen & Einrichtung

Bevor Sie den Python-Workflow der E-Mail-API in der Produktion verwenden können, benötigen Sie vier Dinge: Python 3.9+, die Anfragen Bibliothek, ein API-Schlüssel mit DSN und ein verknüpftes E-Mail-Konto.

Python 3.9+ (3.11 empfohlen)
Alle Beispiele verwenden f-Strings, | Union-Typen und Standardbibliothek-Funktionen ab 3.9+. Python 3.11 LTS wird für die Produktion empfohlen. Überprüfen Sie Ihre Version mit python --version.
Unipile API-Schlüssel & DSN
Registrieren Sie sich im Unipile Dashboard, um Ihren Zugriffstoken und DSN (einen persönlichen HTTPS-Endpunkt wie api4.unipile.com:13444). Beide sind in jedem Anfrage-Header erforderlich.
Virtuelle Umgebung
Nutzen Sie immer eine venv, um Abhängigkeiten zu isolieren: python -m venv .venv && source .venv/bin/activate. Installieren Sie niemals Pakete in der System-Python – dies ist besonders wichtig für die Handhabung von Anmeldedaten.
Ein verknüpftes E-Mail-Konto
Sie senden E-Mail durch ein verknüpftes Konto (Gmail, Outlook oder IMAP). Der nächste Abschnitt führt Sie durch den OAuth-Flow, um eines zu verknüpfen. Dies tun Sie nur einmal pro Konto.
Abhängigkeiten installieren
pip
pipenv
Gedicht
pip install requests python-dotenv # Optional: Asynchroner Support pip install aiohttp httpx # Optionale: Wiederholungslogik pip install tenacity
pipenv install requests python-dotenv tenacity
poetry add requests python-dotenv tenacity
.env
# Unipile-Anmeldeinformationen – diese Datei niemals einchecken UNIPILE_DSN=https://api4.unipile.com:13444 UNIPILE_API_KEY=dein_zugangstoken_hier # Die Konto-ID des verknüpften E-Mail-Kontos UNIPILE_KONTO_ID=acc_xxxxxxxxxxxxxxxx

Hinzufügen .env zu dir .gitignore. Laden mit python-dotenv über load_dotenv() Am Anfang Ihres Skripts. In der Produktion sollten Sie bevorzugt tatsächliche Umgebungsvariablen verwenden, die von Ihrer Bereitstellungsplattform (Heroku, Railway, Docker Compose) injiziert werden.

Bereit, Ihren ersten E-Mail-Versand zu starten?
Holen Sie sich einen kostenlosen API-Schlüssel – dauert 30 Sekunden, keine Kreditkarte erforderlich.
Holen Sie sich Ihren kostenlosen API-Schlüssel
Konto verknüpfen

Einrichten Ihres ersten E-Mail-Kontos

Bevor Sie senden können, müssen Sie ein E-Mail-Konto mit Unipile verknüpfen. Dies ist ein einmaliger Schritt pro Konto. Sehen Sie sich die vollständige einheitlicher E-Mail-API-Integrationsleitfaden für weitere Informationen zu Mehrkonten-Flüssen.

Unipile verwendet einen gehosteten Auth-Assistenten – Ihr Python-Skript generiert einen Auth-Link, der Benutzer klickt darauf und schließt OAuth im Browser ab, dann ruft Unipile Ihren Webhook mit dem neuen account_id. Keine SMTP-Anmeldeinformationen für Gmail oder Outlook werden in Ihrem Code gespeichert.

Google MailGmail OAuth
AusblickOutlook OAuth
IMAPIMAP / SMTP
connect_gmail.py
import Anfragen, Betriebssystem from dotenv import laden_dotenv laden_dotenv() API-Schlüssel = os.environ['UNIPILE_API_SCHLÜSSEL'] DSN = os.environ['UNIPILE_DSN'] # Schritt 1: Erstellen Sie einen gehosteten Authentifizierungslink für Gmail OAuth resp = Anfragen.Beitrag( f'{DSN}/api/v1/hosted/accounts/link', Kopfzeilen={'X-API-KEY': API-Schlüssel}, daten={ 'Typ': 'GOOGLE', 'Name': 'Alice Gmail', 'erfolgreicher_pfad': '`https://yourapp.com/oauth/success`', 'Fehlgeschlagene_URL': 'https://yourapp.com/oauth/fehler' } ) # Schritt 2: Senden Sie diese URL an Ihren Benutzer auth_url = resp.json()['URL'] print(Leiten Sie den Benutzer weiter an: {auth_url}') # Schritt 3: Unipile POSTet {account_id} nach OAuth an Ihren Webhook # Siehe /gmail-api-send-email-a-comprehensive-guide-for-developers/ für Gmail-Details
import Anfragen, Betriebssystem from dotenv import laden_dotenv laden_dotenv() # Outlook OAuth - deckt privates Outlook + Microsoft 365 ab # Siehe /microsoft-graph-api-email-integration-guide/ resp = Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/hosted/accounts/link', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Typ': 'MICROSOFT', 'Name': 'Bob Outlook', 'erfolgreicher_pfad': '`https://yourapp.com/oauth/success`', 'Fehlgeschlagene_URL': 'https://yourapp.com/oauth/fehler' } ) printbzw.json()['URL'])
import requests, os, json # IMAP: IMAP-Anmeldedaten direkt übergeben (keine OAuth-Weiterleitung erforderlich) # Siehe /the-developers-guide-to-imap-api-solution/ für vollständige IMAP-Details resp = Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/konten', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, json={ 'Anbieter': 'IMAP', 'Benutzername': 'alice@company.com', 'Passwort': 'app_password_hier', 'imap_host': 'imap.company.com', 'smtp_host': 'smtp.company.com' } ) account_id = resp.json()['Konto-ID'] print(Verknüpfter Account: {account_id}')
Google Mail
Google Mail
Verwendet Google OAuth 2.0. Keine Passwörter gespeichert. Token-Aktualisierung ist automatisch. Siehe Leitfaden zum Senden von E-Mails mit der Gmail API für Umfangsdetais.
Ausblick
Outlook / Microsoft 365
Verwendet Microsoft Graph OAuth. Deckt persönliches Outlook und Microsoft 365 / Exchange Online ab. Siehe die Microsoft Graph E-Mail-Leitfaden für Administratorzustimmungsabläufe.
IMAP
IMAP / SMTP
Geben Sie Anmeldedaten direkt ein. Funktioniert mit jedem IMAP-Server: Zoho, Yahoo, FastMail, benutzerdefinierter Exchange. Siehe IMAP API-Lösungsleitfaden für Portkonfiguration.
Kern-API

Ihre erste E-Mail von Python senden

Der Send-Endpunkt akzeptiert multipart/form-data. Benutzen Daten= nicht json=) in requests.post(). Der zu, ccund BCC Die Felder sind als JSON kodierte Strings im Formulardaten.

1
E-Mail im Nur-Text-Format
Grundlegend
import requests, os, json Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu': json.Müll([{'Anzeigename': 'Alice', 'Bezeichner': 'alice@acme.com'}]), 'Betreff': 'Kurzes Update', 'Körper': 'Hallo Alice, ich melde mich nur kurz.' } )
Anmerkung: Die Körper Feld akzeptiert sowohl reinen Text als auch HTML. Verwenden Sie

Tags für HTML-Formatierung.

2
HTML-E-Mail mit CC und BCC
Gemeinsam
import requests, os, json response = requests.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu'json.Müll([{'Bezeichner': 'alice@acme.com'}]), 'cc'json.Müll([{'Bezeichner': 'manager@acme.com'}]), 'BCC': json.Müll([{'Bezeichner': 'crm@yourapp.com'}]), 'Betreff': 'Ihre Rechnung ist fertig', 'Körper': '

Rechnung #1042

Bitte finden Sie Ihre Rechnung beigefügt.

'
} ) # 202 Akzeptiert = in Zustellung print(response.status_code, response.json())
3
Handhabung der Antwort
Produktion
import requests, os, json def E-Mail sendenan_email: Str, Betreff: Str, Körper: Str) -> Wörterbuch: "E-Mail über die Python-Wrapper der Unipile E-Mail-API senden." response = requests.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu'JSON.Müll([{'Bezeichner': to_email}]), 'Betreff'Betreff:, 'Körper': Körper, }, timeout=30 ) Antwort.raise_for_status() # löst HTTPError bei 4xx/5xx aus return Antwort.json() # {'tracking_id': 'msg_...'}
Tipp: Immer bestehen timeout=30 um endlose Wartezeiten bei Netzwerkproblemen zu vermeiden. Verwenden Sie raise_for_status() HTTP-Fehler als Python-Exceptions weitergeben.
Kostenlos starten
Probieren Sie es jetzt aus – kostenloser API-Schlüssel in 30 Sekunden

Holen Sie sich Ihren API-Schlüssel, verknüpfen Sie in wenigen Minuten ein Gmail- oder Outlook-Konto und führen Sie die Python-Beispiele aus diesem Leitfaden anhand echter Postfächer aus.

Anhänge

Anhänge senden in Python

Anhänge werden im Rahmen von Multipart-Formulardaten mit Pythons gesendet Dateien= Parameter. Öffne die Datei im Binärmodus ('RB') - Bytes, keine Zeichenketten.

attach.py
import requests, os, json # Einzelne Dateianlage mit öffnen('Rechnung.pdf', 'RB') als w resp = Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu': json.Müll([{'Bezeichner': 'client@example.com'}]), 'Betreff': 'Rechnung angehängt', 'Körper': '

Bitte sehen Sie sich die angehängte Rechnung an.

'
}, Dateien={'Anhänge': ('Rechnung.pdf', w, 'Anwendung/pdf')} ) # Mehrere Anhänge: eine Liste von Tupeln übergeben # Dateien=[('Anhänge', ('a.pdf', f1, 'application/pdf')), # ('Anhänge', ('b.png', f2, 'image/png'))]
Immer im Binärmodus öffnen
Verwenden Sie open('file.pdf', 'rb'), nicht 'r'. Übergabe eines Textdateiobjekts an Dateien= hebt sich TypeError. Dies ist eine häufige Besonderheit, die nur Python-spezifisch ist, wenn man von smtplib migriert.
Mehrere Anhänge
Eine Liste von Tupeln übergeben Dateien=jedes Tupel ist ('Anhänge', (Dateiname, Dateiobjekt, Inhaltstyp)). Requests behandelt die Multipart-Grenze automatisch.
In-Memory-Dateien (BytesIO)
Für dynamisch generierte PDFs oder CSV-Exporte geben Sie einen BytesIO Objekt direkt: from io import BytesIO; buf = BytesIO(pdf_bytes) dann ('Bericht.pdf', buf, 'application/pdf').
Anbieterbeschränkungen Gmail erlaubt bis zu 25 MB insgesamt pro Sendung. Outlook erlaubt bis zu 20 MB. IMAP-Limits hängen von Ihrer Serverkonfiguration ab. Für Dateien, die diese Limits überschreiten, senden Sie stattdessen einen Download-Link.
Größere Anhänge oder höhere Sendelimits benötigt?
Unipile-Pläne reichen von Prototypen bis hin zu Produktions-Workloads. Vergleichen Sie die Quoten auf der Preisseite.
Unipile - Erweiterte Python-API
Fortgeschrittene

Antworten, Threads & Nachverfolgung

Für E-Mails im Namen eines Benutzers senden, Threading, und Webhook-basierte Zustellverfolgung, hier sind die Python-Muster, die Sie benötigen.

01
Threading mit in_reply_to

Um innerhalb eines bestehenden Threads zu antworten, übergeben Sie antworten_an Feld mit dem Sendungs-ID der E-Mail, auf die Sie antworten möchten. Unipile kümmert sich um die Referenzen und Antwort auf Kopfzeilen automatisch.

reply.py
Anfragen.Beitrag( f'{DSN}/api/v1/emails', Kopfzeilen={'X-API-KEY': API-Schlüssel}, daten={ 'Konto-ID': KONTO_ID, 'zu': json.Müll([{'Bezeichner': 'alice@acme.com'}]), 'Betreff': 'Betreff: Ihre Frage', 'Körper': '

Als Nachfassung zu Ihrer Nachricht.

'
, 'antwort_auf': 'ursprüngliche_Sendungsverfolgungs_ID' } )
02
Webhooks in Python (Flask Beispiel)

Registrieren Sie eine Webhook-URL in Ihrem Unipile-Dashboard, um Zustellungsereignisse (gesendet, zurückgewiesen, geöffnet) zu empfangen. Hier ist ein minimaler Flask-Empfänger:

webhook_flask.py
from Flasche import Flask, Anfrage, jsonify import Protokollierung app Flasche(__name__) Protokollierung.Grundkonfiguration(level=logging.INFO) @app.Route('/webhook/email', Methoden=['POST']) def E-Mail-Webhook(): Ereignis = Anfrage.get_json() event_typ = ereignis.bekommen.('Typ') tracking_id = event.bekommen.('tracking_id') Protokollierung.Informationen(f'E-Mail-Ereignis: {event_type} für {tracking_id}') return in JSON umwandelnOK=Wahr), 200
03
Idempotenzschlüssel

Um doppelte Übertragungen bei Netzwerk-Wiederholungen zu verhindern, übergeben Sie eine eindeutige Idempotenzschlüssel Header. Wenn derselbe Schlüssel zweimal gesendet wird, gibt Unipile die ursprüngliche Antwort zurück, ohne eine zweite E-Mail zu senden.

idempotenz.py
import uuid, anfragen, os, json Schlüssel = Str(uuid.uuid4()) # einmal generieren, in DB speichern Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={ 'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL'], 'Idempotenz-Schlüssel'Schlüssel }, daten={'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu': json.Müll([{'Bezeichner': 'alice@acme.com'}]), 'Betreff': 'Willkommen!', 'Körper': 'Hallo!'} )
Produktion

Fehlerbehandlung & Wiederholungsversuche

Produktions-Python-Code für die E-Mail-API benötigt eine ordnungsgemäße Fehlerbehandlung, strukturiertes Logging und automatische Wiederholungsversuche mit exponentiellem Backoff unter Verwendung des Hartnäckigkeit Bibliothek.

HTTP-CodeBedeutungAktion
202Akzeptiert - in der Warteschlange für die Lieferungtracking_id speichern
400Ungültige Anfrage (ungültige Felder)Payload reparieren, nicht erneut versuchen
401Ungültiger API-SchlüsselÜberprüfen Sie UNIPILE_API_KEY
403Konto nicht autorisiertKonto neu verknüpfen
404Konto-ID nicht gefundenUNIPILE_ACCOUNT_ID prüfen
429Rate begrenztBackoff + Wiederholung (siehe Code)
500ServerfehlerWiederholen Sie den Vorgang nach 5 Sekunden Verzögerung
retry.py
import requests, os, json, logging from Hartnäckigkeit import ( wiederholen, stoppen_nach_versuch, warte_exponentiell, wiederhole_bei_Ausnahmetyp ) Protokollierung.Grundkonfiguration(level=logging.INFO) logger = logging.getLogger(__name__) Klasse RateLimitError(Ausnahme): Pass @Erneut versuchen( stoppen=nach_dem_versuch_stoppen(4), warteexponential_warten(Multiplikator=1, Minimum=2, Maximum=30), Erneut versuchen=wiederholen_bei_Ausnahmeart(RateLimitError) ) def mit_wiederholung_senden(an: Str, Betreff: Str, Körper: Str) -> Wörterbuch: resp = Anfragen.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={ 'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu'JSON.Müll([{'Bezeichner': zu}]), 'Betreff'Betreff:, 'Körper'Körper }, timeout=30 ) wenn resp.status_code == 429: Protokollierer.Warnung('Limit erreicht, verlangsame...') erhöhen RateLimitError() bzw.raise_for_status() return bzw.json()
Sicherheit

Sicherheitspraktiken in Python

Für eine vollständige Anleitung zum Schutz Ihrer E-Mail-API-Integration siehe E-Mail-API-Sicherheitsleitfaden. Hier sind die Python-spezifischen Grundlagen.

Niemals Schlüssel fest codieren
Verwenden Sie os.environ oder python-dotenv. Niemals legen UNIPILE_API_KEY als Zeichenkette in Ihrem Quellcode. Wenn der Schlüssel versehentlich in Git hochgeladen wird, drehen Sie ihn sofort über Ihr Dashboard.
Virtuelle Umgebungen
Abhängigkeiten immer isolieren mit venv oder conda. Dies verhindert Abhängigkeitsverwirrungsangriffe und macht Ihr Anforderungen.txt prüfbar. Versionen in der Produktion fixieren.
OAuth-Token-Aktualisierung
Unipile übernimmt die automatische Aktualisierung von OAuth-Tokens für Gmail und Outlook. Sie speichern oder rotieren niemals selbst Anbieter-Tokens – behalten Sie einfach Ihre UNIPILE_API_KEY gültig.
Nur serverseitig
Rufen Sie die Unipile API niemals clientseitig (Browser oder mobile App) auf. Halten Sie API-Aufrufe in Flask/Django/FastAPI immer innerhalb von serverseitigen Views oder Hintergrundaufgaben (Celery).
Webhook-Nutzlasten validieren
Bei der Entgegennahme von Unipile Webhooks in Flask oder FastAPI, validieren Sie den Ursprung der Anfrage über einen geheimen Header oder eine HMAC-Signatur, bevor Sie das Ereignis verarbeiten. Vertrauen Sie niemals blindlings rohen eingehenden Payloads.
Audit & Protokollierung
Protokoll Sendungs-ID für jede gesendete E-Mail, um Zustellungsprüfungen zu ermöglichen. Verwenden Sie den Standard von Python Protokollierung Modul - nie drucken() in Produktion. Senden Sie Protokolle an ein SIEM für stark regulierte Anwendungsfälle.
DKIM & SPF: Dies sind DNS-Konfigurationen, kein Python-Code. Richten Sie SPF- und DKIM-Einträge für Ihre sendende Domain ein. Lesen Sie die vollständige E-Mail-API-Sicherheitsleitfaden für schrittweise DNS-Einrichtung.
Fallstricke

Gängige Python-spezifische Fallstricke

Das sind die häufigsten Fehler, die Python-Entwickler bei der Integration der E-Mail-API machen. Wenn Sie stattdessen Node.js verwenden, sehen Sie unsere JavaScript E-Mail-Senden API-Tutorial.

Verwendung von json= anstatt Daten=
Der Unipile-Endpunkt benötigt multipart/form-data, nicht JSON. Immer benützen requests.post(..., data={...}). Verwendung von JSON={...} wird einen 400er-Fehler zurückgeben. Die zu, ccund BCC Felder sind JSON-Zeichenketten innerhalb der Formulardaten - verwenden json.dumps() zum Kodieren des Empfängerarrays.
Korrigieren: data= mit json.dumps() für Empfänger-Arrays verwenden
Anhangsdateien im Textmodus öffnen
Dateianhänge immer öffnen mit open('file.pdf', 'rb') - Binärmodus. Textmodus ('r') wirft eine TypeError wenn übergeben an die Dateien= Parameter. Verwenden Sie für In-Memory-Inhalte io.BytesIO.
Behebung: Dateien immer als 'rb' öffnen'
Mischen von Sync und Async (asyncio)
Die Anfragen Die Bibliothek ist synchron. Wenn sie in einem async def blockiert die Ereignisschleife. Verwende httpx.AsyncClient oder aiohttp.ClientSession für asynchrone Python-Kontexte (FastAPI, asynchrone Django-Views, asyncio-Skripte).
Beheben: httpx.AsyncClient für async/await-Kontexte verwenden
Fehlendes Timeout bei Anfragen
Standardmäßig, requests.post() wartet ewig. Eine hängende Verbindung blockiert Ihren Thread (oder Celery-Worker) unbegrenzt. Übergeben Sie immer timeout=30 (Verbindungszeitüberschreitung, Lesezeitüberschreitung in Sekunden).
Beheben: Übergeben Sie immer timeout=(5, 30) an requests.post()
Zeitzonen-naive Datumsangaben in der Planung
Wenn Sie E-Mails mit einem Zeitstempelfeld planen, verwenden Sie immer zeitzonenbewusste Datumsangaben: from datetime import datetime, timezone; datetime.now(timezone.utc). Naive Datumsangaben führen in Multi-Region-Bereitstellungen zu stillschweigenden Fehlern um Stunden.
Beheben: Immer timezone.utc für datetime-Objekte verwenden
GIL-Auswirkungen auf Threading bei hohem Sendovolumen
Pythons GIL schränkt echte Thread-Parallelität für CPU-gebundene Arbeiten ein, aber HTTP-Anfragen sind I/O-gebunden – Threads funktionieren einwandfrei. Für ein hohes Sendevolumen (1000+/Tag) verwenden Sie einen Thread-Pool (concurrent.futures.ThreadPoolExecutor) oder in eine Celery-Warteschlange auslagern.
Korrigieren: ThreadPoolExecutor oder Celery für Batch-Sendungen verwenden

Häufig gestellte Fragen

Häufige Fragen zur Verwendung der E-Mail-API in Python mit der Unipile Unified Email API.

Verwenden Sie die Unipile Unified Email API anstelle von smtplib oder einer direkten SMTP-Verbindung. Installieren Sie Anfragen, holen Sie sich Ihren API-Schlüssel und DSN vom Unipile Dashboard, verknüpfen Sie ein Gmail- oder Outlook-Konto über OAuth und senden Sie dann eine POST-Anfrage an /api/v1/emails mit Ihrem account_id, zu, Themaund Körper. Kein SMTP-Server, kein Port 587, keine TLS-Konfiguration in Ihrem Python-Code erforderlich.

Django: rufe die API in einer Ansicht oder einem Management-Befehl auf. Für asynchrone Django-Versionen (3.1+) verwende httpx.AsyncClient in asynchronen Ansichten.

Flasche Rufe die API in einem Routenhandler serverseitig auf. Rufe sie niemals aus einer Jinja-Vorlage oder clientseitigem JavaScript auf. Verwende Flask-Celery, um Sends mit hohem Volumen an Hintergrund-Worker auszulagern.

FastAPI: verwenden httpx.AsyncClient innen async def Endpunkte. Die synchronen Anfragen Bibliotheken blockieren die asynchrone Ereignisschleife – verwenden Sie immer einen asynchronen HTTP-Client in FastAPI.

smtplib verbindet sich direkt mit einem SMTP-Server aus Ihrem Python-Prozess. Sie verwalten SMTP-Anmeldedaten, TLS-Einrichtung und anbieterspezifische Eigenheiten (Gmail App-Passwörter, Outlook Modern Authentication). Es ist auch nur synchron.

Die Unipile-E-Mail-API ist eine Cloud-Abstraktion: Verknüpfen Sie Konten über OAuth (keine SMTP-Anmeldeinformationen in Ihrem Code für Gmail/Outlook), erhalten Sie eine einzige konsistente HTTP-API für alle Anbieter, und Unipile kümmert sich um Transport, Token-Aktualisierung und Wiederholungsversuche. Der Kompromiss besteht darin, dass die Sendungen über die Infrastruktur von Unipile und nicht über eine direkte SMTP-Verbindung laufen.

Ja, aber Sie benötigen einen asynchronen HTTP-Client – den Standard Anfragen Die Bibliothek ist synchron und blockiert Ihre Ereignisschleife. Verwenden Sie httpx (empfohlen, asynchrone Drop-in-Alternative) oder aiohttp.

import httpx, os, json async def send_email_async(an: Str, Betreff: Str, Körper: Str): asynchron mit httpx.AsyncClient() als Kunde resp = await Klient.Beitrag( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', Kopfzeilen={'X-API-KEY'os.environ['UNIPILE_API_SCHLÜSSEL']}, daten={'Konto-ID'os.environ['UNIPILE_KONTO_ID'], 'zu': json.Müll([{'Bezeichner': zu}]), 'Betreff'Betreff:, 'Körper': Body} ) bzw.raise_for_status() return bzw.json()

Verwenden Sie eine Celery-Aufgabenwarteschlange mit einem Redis- oder RabbitMQ-Broker. Jede E-Mail wird zu einer Aufgabe - Celery verwaltet die Gleichzeitigkeit und Wiederholungen automatisch. Begrenzen Sie die Gleichzeitigkeit pro Worker, um Ratenbeschränkungen zu vermeiden (typischerweise 5-10 gleichzeitige Sendungen pro verbundenem Konto). Kombinieren Sie Unipile für den OAuth-basierten Transaktionsversand mit einem dedizierten ESP für Massenkampagnen, wenn Sie wirklich große Mengen an Marketing-E-Mails versenden möchten (Millionen pro Tag).

Für leichtere Anwendungsfälle, concurrent.futures.ThreadPoolExecutor(max_workers=5) mit dem Anfragen Die Bibliothek ist ein einfacherer Ansatz, der den Celery-Overhead vermeidet.

Ja. Erstellen Sie eine Celery-Aufgabe, die aufruft requests.post() an den Unipile-Endpunkt. Celery-Arbeiter sind standardmäßige synchrone Python-Prozesse, so dass Anfragen funktioniert perfekt. Verwenden Sie das integrierte Celery autoretry_for=(requests.exceptions.HTTPError,) mit max_versuche=3 und Standard-Wiederholung-Verzögerung=5 für automatisierte Wiederholungen bei transienten Fehlern. Kombinieren Sie mit Idempotenzschlüssel Headerdateien zur Verhinderung von Mehrfachsendungen bei Neustarts von Workern.

Haben Sie noch Fragen? Unser Team ist für Sie da.

de_DEDE