Comment envoyer des e-mails via une API en Python (Tutoriel rapide)

Table des matières
Table des matières 11 sections
Premiers pas
Envoyer des courriels
Production
Référence
Tutoriel Python

Comment faire Envoyer un e-mail via l'API en Python (Tutoriel Rapide)

Évitez la mise en forme standard SMTP. Ce guide vous montre comment utiliser le API unifiée de messagerie Unipile envoyer un e-mail en Python - avec des exemples de copier-coller pour Gmail, Outlook et IMAP en utilisant le demandes bibliothèque.

api email python Envoyer un e-mail API Python Gmail / Outlook / IMAP requêtes / aiohttp Flask / Django / FastAPI
send_email.py
import requiert, os CLÉ_API = os.environ['UNIPILE_API_KEY'] DSN = os.environ['UNIPILE_DSN'] ID_COMPTE = os.environ['UNIPILE_ACCOUNT_ID'] response = requests.poste( f'{DSN}/api/v1/emails', en-têtes={'X-API-KEY': CLÉ_API}, données={ 'identifiant_de_compte': ID_COMPTE, 'à': '[{"display_name":"Alice","identifier":"alice@acme.com"}]', 'sujet': 'Bonjour depuis Python', 'corps': '

Envoyé via Unipile !

'
} ) print(réponse.json())
Email délivré - 202 Accepté
Fonctionne avec : Gmail Outlook IMAP
En bref

Exemple Python en 5 lignes

Si vous savez déjà ce qu'est une API d'envoi d'e-mails et je veux juste le code Python de l'API d'e-mail qui fonctionne réellement, le voici. Le tutoriel complet suit ci-dessous.

1
Installer requests
pip install requests python-dotenv
2
Définir les variables d'environnement
Ajouter UNIPILE_DSN, CLÉ_API_UNIPILE, ou encore ID_COMPTE_UNIPILE à vous .env fichier.
3
Lier un compte e-mail
OAuth pour Gmail/Outlook ou identifiants SMTP pour tout serveur IMAP. Un seul appel d'API - vous ne le faites qu'une fois par compte.
4
POST à /api/v1/emails
Passe account_id, à, sujet, ou encore corps. Fait.
Le même code Python fonctionne pour Gmail, Outlook et n'importe quel serveur IMAP – aucune logique spécifique au fournisseur n'est nécessaire. Vérifiez le Guide de l'API e-mail pour la vue d'ensemble complète du concept.
send_email.py
import requiert, os from dotenv import charger_dotenv charger_dotenv() CLÉ_API = os.environ['UNIPILE_API_KEY'] DSN = os.environ['UNIPILE_DSN'] ID_COMPTE = os.environ['UNIPILE_ACCOUNT_ID'] resp = requests.poste( f'{DSN}/api/v1/emails', en-têtes={'X-API-KEY': CLÉ_API}, données={ 'identifiant_de_compte': ID_COMPTE, 'à': '[{"display_name":"Alice","identifier":"alice@acme.com"}]', 'sujet': 'Bonjour depuis Python', 'corps': '

Envoyé via Unipile !

'
} ) print(respectivement.json()) # {'tracking_id': 'msg_...'}
Mise en place

Prérequis et installation

Avant de pouvoir utiliser le flux de travail Python de l'API d'e-mail en production, vous avez besoin de quatre éléments : Python 3.9+, le demandes bibliothèque, une clé API avec DSN et un compte de messagerie lié.

Python 3.9+ (3.11 recommandé)
Tous les exemples utilisent des chaînes f, | types d'union, et des fonctionnalités de la bibliothèque standard à partir de la version 3.9+. Python 3.11 LTS est recommandé pour la production. Vérifiez votre version avec python --version.
Clé API Unipile et DSN
Inscrivez-vous sur le tableau de bord Unipile pour obtenir votre jeton d'accès et votre DSN (un point d'accès HTTPS personnel tel que api4.unipile.com:13444Les deux sont requis dans chaque en-tête de requête.
Environnement virtuel
Utilisez toujours un environnement virtuel (venv) pour isoler les dépendances : python -m venv .venv && source .venv/bin/activate. N'installez jamais de packages dans le Python système - ceci est particulièrement important pour la gestion des identifiants.
Un compte email lié
Vous envoyez un courriel par un compte lié (Gmail, Outlook ou IMAP). La section suivante vous guide à travers le flux OAuth pour en lier un. Vous ne le faites qu'une seule fois par compte.
Installation des dépendances
pip
pipenv
poésie
pip install requests python-dotenv # Facultatif : prise en charge asynchrone pip install aiohttp httpx # Facultatif : logique de nouvelle tentative pip installer ténacité
pipenv installer requests python-dotenv tenacity
poésie ajouter requests python-dotenv persévérance
.env
# Identifiants Unipile - ne jamais valider ce fichier UNIPILE_DSN=https://api4.unipile.com:13444 CLÉ_API_UNIPILE=ton_jeton_d'accès_ici # L'identifiant du compte de messagerie lié ID_COMPTE_UNIPILE=acc_xxxxxxxxxxxxxxxx

Ajouter .env à vous .gitignore. Charger avec python-dotenv via charger_dotenv() en haut de votre script. En production, privilégiez les variables d'environnement réelles injectées par votre plateforme de déploiement (Heroku, Railway, Docker Compose).

Prêt à envoyer votre premier e-mail ?
Obtenez une clé API gratuite - prend 30 secondes, aucune carte de crédit requise.
Obtenez votre clé API gratuite
Liaison de compte

Connexion de votre premier compte de messagerie

Avant de pouvoir envoyer, vous devez lier un compte de messagerie à Unipile. C'est une étape unique par compte. Voir le complet guide d'intégration API d'email unifiée pour en savoir plus sur les flux multi-comptes.

Unipile utilise un assistant d'authentification hébergé - votre script Python génère un lien d'authentification, l'utilisateur clique dessus et termine l'OAuth dans le navigateur, puis Unipile appelle votre webhook avec le nouveau account_id. Aucune information d'identification SMTP n'est stockée dans votre code pour Gmail ou Outlook.

GmailGmail OAuth
OutlookOutlook OAuth
IMAPIMAP / SMTP
connect_gmail.py
import requiert, os from dotenv import charger_dotenv charger_dotenv() CLÉ_API = os.environ['UNIPILE_API_KEY'] DSN = os.environ['UNIPILE_DSN'] # Étape 1 : créer un lien d'authentification hébergé pour l'authentification OAuth Gmail resp = requests.poste( f'{DSN}/api/v1/hébergé/comptes/lier', en-têtes={'X-API-KEY': CLÉ_API}, données={ 'type': 'Google', 'nom': 'Alice Gmail', 'URL de succès': 'https://yourapp.com/oauth/success', 'url_échec': 'https://yourapp.com/oauth/failure' } ) # Étape 2 : envoyez cette URL à votre utilisateur auth_url = resp.json()['url'] print(Rediriger l'utilisateur vers : {auth_url}') # Étape 3 : Unipile publie {account_id} sur votre webhook après l'authentification OAuth # Voir /gmail-api-send-email-a-comprehensive-guide-for-developers/ pour les détails sur Gmail
import requiert, os from dotenv import charger_dotenv charger_dotenv() # Outlook OAuth - couvre Outlook personnel + Microsoft 365 # Voir /microsoft-graph-api-email-integration-guide/ resp = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/hosted/accounts/link', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'type': 'MICROSOFT', 'nom': 'Bob Outlook', 'URL de succès': 'https://yourapp.com/oauth/success', 'url_échec': 'https://yourapp.com/oauth/failure' } ) print(respectivement.json()['url'])
import requêtes, os, json # IMAP : transmettez les identifiants SMTP/IMAP directement (pas de redirection OAuth nécessaire) # Voir /the-developers-guide-to-imap-api-solution/ pour les détails complets de l'API IMAP resp = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/comptes', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, json={ 'fournisseur': 'IMAP', 'nom d'utilisateur': 'alice@company.com', 'mot de passe': 'mot_de_passe_application_ici', 'imap_hote': 'imap.company.com', 'smtp_host': 'smtp.company.com' } ) compte_id = resp.json()['identifiant_de_compte'] print(Compte lié : {account_id}')
Gmail
Gmail
Utilise Google OAuth 2.0. Mot de passe non stocké. Le renouvellement du jeton est automatique. Voir le Guide d'envoi d'e-mails avec l'API Gmail pour les détails du champ d'application.
Outlook
Outlook / Microsoft 365
Utilise l'authentification OAuth de Microsoft Graph. Couvre Outlook personnel et Microsoft 365 / Exchange Online. Voir Guide de messagerie Microsoft Graph pour les flux de consentement administrateur.
IMAP
IMAP / SMTP
Utilisez les identifiants directement. Fonctionne avec tous les serveurs IMAP : Zoho, Yahoo, FastMail, Exchange personnalisé. Voir Guide de solution API IMAP pour la configuration du port.
API principale

Envoyer votre premier courriel depuis Python

Le point d'envoi accepte multipart/form-data. utiliser données= (pas json=) dans requêtes.post(). Le à, cc, ou encore CCI les champs sont des chaînes de caractères encodées en JSON à l'intérieur des données du formulaire.

1
Email en texte brut
De base
import requêtes, os, json requêtes.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'nom_affichage': 'Alice', 'identifier': 'alice@acme.com'}]), 'sujet': 'Mise à jour rapide', 'corps': 'Bonjour Alice, je voulais juste prendre des nouvelles.' } )
Remarque : Le corps Le champ accepte du texte brut et du HTML. Utiliser

balises pour la mise en forme HTML.

2
E-mail HTML avec CC et Cci
Commun
import requêtes, os, json response = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à'json.vidages([{'identifier': 'alice@acme.com'}]), 'salut'json.vidages([{'identifier': 'manager@acme.com'}]), 'CCI': json.vidages([{'identifier': 'crm@yourapp.com'}]), 'sujet': 'Votre facture est prête', 'corps': '

Facture #1042

Veuillez trouver votre facture ci-jointe.

'
} ) # 202 Accepté = mis en file d'attente pour livraison print(response.code_statut, response.json())
3
Traitement des réponses
Production
import requêtes, os, json déf envoyer_emailÀ_e-mail : chaîne, sujet : chaîne, corps : chaîne) -> dictionnaire: "Envoyer un e-mail via le wrapper Python de l'API e-mail d'Unipile." response = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'identifier': to_email}]), 'sujet': sujet, 'corps'corps, }, délai d'attente=30 ) réponse.lancer_statut() # déclenche une HTTPError sur 4xx/5xx return réponse.json() # {'tracking_id': 'msg_...'}
Astuce : Toujours passer délai d'attente=30 pour éviter de rester bloqué indéfiniment sur des problèmes réseau. Utiliser lancer_pour_statut() remonter les erreurs HTTP en exceptions Python.
Gratuit au démarrage
Essayez maintenant - clé API gratuite en 30 secondes

Obtenez votre clé API, liez un compte Gmail ou Outlook en quelques minutes, et exécutez les exemples Python de ce guide sur des boîtes aux lettres réelles.

Pièces jointes

Envoi de pièces jointes en Python

Les pièces jointes sont envoyées dans le cadre de données de formulaire multipart en utilisant Python. fichiers= paramètre. Ouvrez le fichier en mode binaire ('rb') - octets, pas chaînes de caractères.

attach.py
import requêtes, os, json # Pièce jointe unique avec ouvrir('facture.pdf', 'rb') En tant que F resp = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'identifier': 'client@example.com'}]), 'sujet': 'Facture ci-jointe', 'corps': '

Veuillez consulter la facture ci-jointe.

'
}, fichiers={'pièces jointes': ('facture.pdf', f, 'application/pdf')} ) # Pièces jointes multiples : passer une liste de tuples # fichiers=[('pièces jointes', ('a.pdf', f1, 'application/pdf')), # ('attachments', ('b.png', f2, 'image/png'))]
Toujours ouvert en mode binaire
Utilisez open('file.pdf', 'rb'), pas 'r'. Passer un objet de fichier texte à fichiers= soulever une TypeError. C'est un piège courant spécifique à Python lors de la migration depuis smtplib.
Plusieurs pièces jointes
Passer une liste de tuples à fichiers=: chaque tuple est ('pièces jointes', (nom_fichier, objet_fichier, type_contenu)). Requests gère la délimitation multipart automatiquement.
Fichiers en mémoire (BytesIO)
Pour les PDF générés dynamiquement ou les exportations CSV, passez un BytesIO objet directement : from io import BytesIO; buf = BytesIO(pdf_bytes) puis ('rapport.pdf', buf, 'application/pdf').
Limites du fournisseur : Gmail autorise jusqu'à 25 Mo au total par envoi. Outlook autorise jusqu'à 20 Mo. Les limites IMAP dépendent de la configuration de votre serveur. Pour les fichiers dépassant ces limites, envoyez plutôt un lien de téléchargement.
Besoin de pièces jointes plus grandes ou de limites d'envoi plus élevées ?
Les plans Unipile vont des prototypes aux charges de production. Comparez les quotas sur la page de tarification.
Unipile - API Python avancée
Avancé

Réponses, Fils & Suivi

Pour envoyer un e-mail au nom d'un utilisateur, le multithreading et le suivi des livraisons basé sur les webhooks, voici les modèles Python dont vous avez besoin.

01
Filetage avec in_reply_to

new_thread = False en_réponse_à champ avec le identifiant de suivi du courriel auquel vous souhaitez répondre. Unipile gère Références et En réponse à en-têtes automatiquement.

reply.py
requêtes.poste( f'{DSN}/api/v1/emails', en-têtes={'X-API-KEY': CLÉ_API}, données={ 'identifiant_de_compte': ID_COMPTE, 'à': json.vidages([{'identifier': 'alice@acme.com'}]), 'sujet': 'Re: Votre question', 'corps': '

Suite à votre message.

'
, 'en_réponse_à': 'msg_original_tracking_id' } )
02
Webhooks en Python (exemple Flask)

Enregistrez une URL de webhook dans votre tableau de bord Unipile pour recevoir les événements de livraison (envoyé, rejeté, ouvert). Voici un récepteur Flask minimal :

webhook_flask.py
from flasque import Flask, requête, jsonify import journalisation appliquer Flasque(__nom__) connexion.basicConfigniveau=logging.INFO) @app.itinéraire('/webhook/email', méthodes=[POST]) déf email_webhook(): événement = demande.get_json() type_événement = événement.obtenir('type') tracking_id = événement.obtenir('identifiant_de_suivi') connexion.informations(f'Email événement : {event_type} pour {tracking_id}') return jsonifyD'accord=Vrai), 200
03
Clés d'idempotence

Pour éviter les envois en double lors de la nouvelle tentative sur le réseau, passez un identifiant unique Clé d'idempotence En-tête. Si la même clé est envoyée deux fois, Unipile renvoie la réponse originale sans envoyer de deuxième e-mail.

idempotence.py
import uuid, requêtes, os, json clé = chaîne(uuid.uuid4()) # générer une fois, stocker dans la base de données requêtes.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={ 'X-API-KEY': os.environ['UNIPILE_API_KEY'], 'Clé d'idempotence'clé }, données={'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'identifier': 'alice@acme.com'}]), 'sujet': 'Bienvenue !', 'corps': 'Salut !'} )
Production

Gestion des erreurs et nouvelles tentatives

La production du code Python pour l'API d'e-mail nécessite une gestion appropriée des exceptions, une journalisation structurée et des tentatives automatiques avec une stratégie de retrait exponentiel en utilisant ténacité bibliothèque.

Code HTTPSensAction
202Accepté - mis en attente de livraisonStocker tracking_id
400Mauvaise requête (champs invalides)Corriger la charge utile, ne pas réessayer
401Clé API invalideVérifier UNIPILE_API_KEY
403Compte non autoriséRelier le compte
404Identifiant de compte introuvableVérifier UNIPILE_ACCOUNT_ID
429Limité par le tauxBackoff + relance (voir code)
500Erreur du serveurRéessayer après un délai de 5 secondes
retry.py
import requests, os, json, logging from ténacité import ( réessayer, arrêter_après_tentative, wait_exponential, retry_if_exception_type ) connexion.basicConfigniveau=logging.INFO) logger = logging.getLogger(__nom__) classe ErreurDeLimiteDeRequêtes(Exception) : Passe @Réessayez( arrêter=stopper_après_tentative(4), attendre=attendre_exponentiel(multiplicateur=1, min=2, max=30), réessayer=réessayer_si_type_exception(ErreurDeLimiteDeRequêtes) ) déf envoyer_avec_réessai(à : chaîne, sujet : chaîne, corps : chaîne) -> dictionnaire: resp = requests.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={ 'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'identifier': à}], 'sujet': sujet, 'corps': corps }, délai d'attente=30 ) si resp.status_code == 429: journal.avertissement('Ratelimité, en attente...') soulever ErreurDeLimiteDeRequêtes() resp.lancer_statut() return resp.json()
Sécurité

Bonnes pratiques de sécurité en Python

Pour un guide complet sur la protection de votre intégration d'API d'e-mails, consultez le Guide de sécurité des API d'e-mail. Voici les essentiels spécifiques à Python.

Ne jamais coder en dur les clés
Utilisez os.environ ou python-dotenv. Ne jamais mettre CLÉ_API_UNIPILE comme une chaîne littérale dans votre code source. S'il est accidentellement poussé vers Git, faites pivoter la clé immédiatement depuis votre tableau de bord.
Environnements virtuels
Toujours isoler les dépendances avec environnement virtuel ou conda. Cela évite les attaques par confusion de dépendances et rend votre requirements.txt auditable. Épinglez les versions en production.
Rafraîchissement du jeton OAuth
Unipile gère automatiquement le rafraîchissement des jetons OAuth pour Gmail et Outlook. Vous ne stockez ni ne faites pivoter les jetons du fournisseur vous-même, il vous suffit de conserver votre CLÉ_API_UNIPILE valide.
Côté serveur uniquement
N'appelez jamais l'API Unipile depuis du code côté client (navigateur ou application mobile). En Flask/Django/FastAPI, conservez toujours les appels d'API dans les vues côté serveur ou dans des tâches d'arrière-plan (Celery).
Valider les charges utiles des webhooks
Lorsque vous recevez des webhooks Unipile dans Flask ou FastAPI, validez l'origine de la requête via un en-tête secret ou une signature HMAC avant de traiter l'événement. Ne faites jamais aveuglément confiance aux charges utiles entrantes brutes.
Audit et journalisation
Journal identifiant de suivi pour chaque e-mail envoyé afin d'activer les audits de livraison. Utilisez la bibliothèque standard de Python journalisation module - jamais imprimer() en production. Expédier des journaux vers un SIEM pour des cas d'utilisation à forte conformité.
DKIM et SPF : Ce sont des configurations au niveau du DNS, pas du code Python. Configurez les enregistrements SPF et DKIM pour votre domaine d'envoi. Lisez le contenu intégral Guide de sécurité des API d'e-mail pour une configuration DNS étape par étape.
Pièges

Pièges courants spécifiques à Python

Voici les erreurs les plus courantes commises par les développeurs Python lors de l'intégration de l'API d'e-mail. Si vous êtes plutôt sur Node.js, consultez notre Tutoriel API JavaScript pour envoyer des e-mails.

Utilisation json= au lieu de données=
Le point de terminaison d'envoi Unipile nécessite multipart/form-data, pas JSON. Utilisez toujours requests.post(..., données={...}). En utilisant json={...} renverra une erreur 400. Le à, cc, ou encore CCI les champs sont des chaînes JSON dans les données du formulaire - utiliser json.dumps() pour encoder le tableau des destinataires.
Correction : utiliser data= avec json.dumps() pour les tableaux de destinataires
Ouvrir les fichiers joints en mode texte
Toujours ouvrir les pièces jointes avec open('file.pdf', 'rb') - mode binaire. Mode texte ('r') soulève une TypeError lorsque passé au fichiers= paramètre. Pour le contenu en mémoire, utilisez io.BytesIO.
Corriger : ouvrir toujours les fichiers en mode 'rb'
Mélanger synchrone et asynchrone (asyncio)
Le demandes La bibliothèque est synchrone. L'appeler à l'intérieur d'une asynchrone def La fonction bloque la boucle d'événements. Utiliser httpx.AsyncClient ou aiohttp.ClientSession pour les contextes Python asynchrones (FastAPI, vues Django asynchrones, scripts asyncio).
Corriger : utiliser httpx.AsyncClient pour les contextes async/await
Timeout manquant sur les requêtes
Par défaut, requêtes.post() attend éternellement. Une connexion bloquée immobilisera votre thread (ou votre worker Celery) indéfiniment. Passez toujours délai d'attente=30 (délai d'attente de connexion, délai d'attente de lecture en secondes).
Corriger : passer toujours timeout=(5, 30) à requests.post()
Instances de date et d'heure naïves dans la planification
Si vous programmez des e-mails avec un champ d'horodatage, utilisez toujours des dates et heures conscientes du fuseau horaire : from datetime import datetime, timezone; datetime.now(timezone.utc). Les dates et heures naïves provoquent des erreurs silencieuses d'une heure ou plus dans les déploiements multi-régions.
Correction : toujours utiliser timezone.utc pour les objets datetime
Impact du GIL sur les envois à haut volume sur threads
Le GIL de Python limite le véritable parallélisme des threads pour le travail lié au CPU, mais les requêtes HTTP sont liées aux E/S - les threads fonctionnent bien. Pour des envois à grand volume (1000+/jour), utilisez un pool de threads (concurrent.futures.ThreadPoolExecutor) ou déchargement vers une file d'attente Celery.
Correction : utiliser ThreadPoolExecutor ou Celery pour les envois par lots

Questions fréquemment posées

Questions fréquentes sur l'utilisation de l'API d'e-mail en Python avec l'API unifiée d'e-mail Unipile.

Utilisez l'API unifiée de messagerie Unipile au lieu de smtplib ou d'une connexion SMTP directe. Installer demandes, obtenez votre clé API et votre DSN depuis le tableau de bord Unipile, liez un compte Gmail ou Outlook via OAuth, puis effectuez une requête POST à /api/v1/emails avec toi account_id, à, sujet, ou encore corps. Aucun serveur SMTP, aucun port 587, aucune configuration TLS nécessaire dans votre code Python.

Django : appeler l'API dans une vue ou une commande de gestion. Pour Django asynchrone (3.1+), utilisez httpx.AsyncClient dans les vues asynchrones.

Flasque Appelez l'API dans un gestionnaire de route côté serveur. Ne l'appelez jamais depuis un modèle Jinja ou du JavaScript côté client. Utilisez Flask-Celery pour décharger les envois à haut volume vers des workers en arrière-plan.

FastAPI : Utiliser httpx.AsyncClient à l'intérieur asynchrone def points de terminaison. Le synchrone demandes La bibliothèque bloque la boucle d'événements asynchrone - utilisez toujours un client HTTP asynchrone dans FastAPI.

smtplib se connecte directement à un serveur SMTP depuis votre processus Python. Vous gérez les identifiants SMTP, la configuration TLS et les particularités par fournisseur (mots de passe d'application Gmail, authentification moderne Outlook). Il est également uniquement synchrone.

L'API d'email Unipile est une abstraction cloud : liez les comptes via OAuth (pas d'identifiants SMTP dans votre code pour Gmail/Outlook), obtenez une API HTTP unique et cohérente pour tous les fournisseurs, et Unipile gère le transport, le rafraîchissement des jetons et les nouvelles tentatives. Le compromis est que les envois passent par l'infrastructure d'Unipile plutôt que par une connexion SMTP directe.

Oui, mais vous avez besoin d'un client HTTP asynchrone – le standard demandes La bibliothèque est synchrone et bloquera votre boucle d’événements. Utilisez httpx (recommandé, alternative asynchrone simple) ou aiohttp.

import httpx, os, json asynchrone def envoyer_email_en_asynchrone(à : chaîne, sujet : chaîne, corps : chaîne): en asynchrone avec httpx.AsyncClient() En tant que client : resp = await client.poste( f'{os.environ["UNIPILE_DSN"]}/api/v1/emails', en-têtes={'X-API-KEY': os.environ'UNIPILE_API_KEY']}, données={'identifiant_de_compte': os.environ'UNIPILE_ACCOUNT_ID'], 'à': json.vidages([{'identifier': à}], 'sujet': sujet, 'corps': corps ) resp.lancer_statut() return resp.json()

Utilisez une file d'attente de tâches Celery avec un broker Redis ou RabbitMQ. Chaque e-mail devient une tâche - Celery gère la concurrence et les nouvelles tentatives automatiquement. Limitez la concurrence par travailleur pour éviter les limites de débit (généralement 5 à 10 envois simultanés par compte lié). Pour des envois marketing à très grand volume (millions par jour), combinez Unipile pour les envois transactionnels basés sur OAuth avec un ESP dédié pour les campagnes de masse.

Pour des cas d'utilisation plus légers, concurrent.futures.ThreadPoolExecutor(max_workers=5) avec le demandes la bibliothèque est une approche plus simple qui évite la surcharge de Celery.

Oui. Créez une tâche Celery qui appelle requêtes.post() vers le point de terminaison Unipile. Les workers Celery sont des processus Python synchrones standard, donc demandes fonctionne parfaitement. Utiliser le intégré de Celery autoretry_for=(requests.exceptions.HTTPError,) avec tentatives_max=3 et délai_de_nouvel_essai_par_défaut=5 pour la nouvelle tentative automatique en cas d'échecs temporaires. Combiner avec Clé d'idempotence En-têtes pour éviter les envois en double lors des redémarrages de workers.

Vous avez encore des questions ? Notre équipe est là pour vous aider.

fr_FRFR