Nasıl API Üzerinden E-posta Gönder Python'da (Hızlı Eğitim)
SMTP'nin standart metinlerini atlayın. Bu kılavuz, nasıl kullanılacağını gösterir Unipile birleştirilmiş e-posta API'si Python ile e-posta gönderme - Gmail, Outlook ve IMAP için kopyala-yapıştır örnekleri istekleri kütüphane.
İthalat istemler, işletim sistemi
API_ANAHTARI = os.environ['UNIPILE_API_ANAHTARI']
DSN = os.environ['UNIPILE_DSN']
HESAP_KODU = os.environ['UNIPILE_ACCOUNT_ID']
response = requests.POST(
f'{DSN}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI': API_ANAHTARI},
veri={
'hesap_kimliği': HESAP_KODU,
'için': '[{"display_name":"Alice","identifier":"alice@acme.com"}]',
'konu': 'Merhaba Python'dan',
'gövde': 'Unipile ile Gönderildi!
'
}
)
print(Yanıt.json())5 Satırlık Python Örneği
Zaten biliyorsan E-posta Gönder API nedir ve yalnızca çalışan e-posta api python kodunu istiyorsunuz, işte bu. Tüm öğretici aşağıdadır.
pip install requests python-dotenvUNIPILE_DSN, UNIPILE_API_KEYve UNIPILE_HESAP_KODU sana .env dosya./api/v1/emailsaccount_id, için, konuve vücut. Tamamlandı.İthalat istemler, işletim sistemi
itibaren dotenv İthalat dotenv yükle
dotenv yükle()
API_ANAHTARI = os.environ['UNIPILE_API_ANAHTARI']
DSN = os.environ['UNIPILE_DSN']
HESAP_KODU = os.environ['UNIPILE_ACCOUNT_ID']
resp = requests.POST(
f'{DSN}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI': API_ANAHTARI},
veri={
'hesap_kimliği': HESAP_KODU,
'için': '[{"display_name":"Alice","identifier":"alice@acme.com"}]',
'konu': 'Merhaba Python'dan',
'gövde': 'Unipile ile Gönderildi!
'
}
)
print(veya.json()) # {'tracking_id': 'msg_...'}Önkoşullar ve Kurulum
E-posta API Python iş akışını üretime geçirmeden önce dört şeye ihtiyacınız olacak: Python 3.9+, istekleri bir kütüphane, DSN'li bir API anahtarı ve bağlı bir e-posta hesabı.
| 3.9+ sürümünden birleşme türleri ve standart kütüphane özellikleri. Üretim ortamı için Python 3.11 LTS önerilir. Sürümünüzü şununla kontrol edin: python --sürüm.api4.unipile.com:13444Her iki parametre de her istek başlığında gereklidir.python -m venv .venv && source .venv/bin/activate. Paketleri asla sistem Python'una kurmayın - bu, kimlik bilgisi işlemesi için özellikle önemlidir.pip install requests python-dotenv
# İsteğe bağlı: eşzamansız destek
aiohttp httpx kur
# İsteğe bağlı: yeniden deneme mantığı
pip install tenacitypipenv install requests python-dotenv tenacitypoetry add requests python-dotenv tenacity# Unipile kimlik bilgileri - bu dosyayı asla teslim etmeyin
UNIPILE_DSN=https://api4.unipile.com:13444
UNIPILE_API_KEY=buraya_erişim_tokenin
# Bağlı e-posta hesabının hesap kimliği
UNIPILE_HESAP_KODU=acc_xxxxxxxxxxxxxxxxEkle .env sana .gitignore. Yükle ile python-dotenv vasıtasıyla load_dotenv() kodunuzun en başında. Üretimde, dağıtım platformunuz (Heroku, Railway, Docker Compose) tarafından enjekte edilen gerçek ortam değişkenlerini tercih edin.
İlk E-posta Hesabınızı Bağlama
Göndermeden önce Unipile'a bir e-posta hesabı bağlamanız gerekir. Bu, hesap başına bir kerelik bir işlemdir. Tamamını gör Birleştirilmiş e-posta API entegrasyon kılavuzu Çoklu hesap akışları hakkında daha fazla bilgi için.
Unipile barındırılan bir kimlik doğrulama sihirbazı kullanır - Python betiğiniz bir kimlik doğrulama bağlantısı oluşturur, kullanıcı buna tıklayıp tarayıcıda OAuth'u tamamlar, ardından Unipile yeni kimlik bilgileriyle webhook'unuzu çağırır account_id. Gmail veya Outlook için hiçbir SMTP kimlik bilgisi kodunuzda saklanmıyor.
İthalat istemler, işletim sistemi
itibaren dotenv İthalat dotenv yükle
dotenv yükle()
API_ANAHTARI = os.environ['UNIPILE_API_ANAHTARI']
DSN = os.environ['UNIPILE_DSN']
# Adım 1: Gmail OAuth için barındırılan bir kimlik doğrulama bağlantısı oluşturun
resp = requests.POST(
f'{DSN}/api/v1/hosted/accounts/link',
başlıklar='X-API-ANAHTARI': API_ANAHTARI},
veri={
'tip': 'Google',
'isim': 'Alice Gmail',
'success_url': 'https://yourapp.com/oauth/success',
'/başarısız_url': 'https://seninuygulamann.com/oauth/basarisiz'
}
)
# Adım 2: bu URL'yi kullanıcınıza gönderin
auth_url = resp.json()['URL']
print(Kullanıcıyı şuraya yönlendir: {auth_url}')
# Adım 3: OAuth sonrasında Unipile WEBHOOK'unuza POST gönderir {account_id}
# Geliştiriciler için Kapsamlı Bir Kılavuz olan /gmail-api-send-email/ adresine bakınİthalat istemler, işletim sistemi
itibaren dotenv İthalat dotenv yükle
dotenv yükle()
# Outlook OAuth - kişisel Outlook + Microsoft 365 kapsamındadır
# /microsoft-graph-api-email-integration-guide/ adresine bakınız
resp = requests.POST(
f'os.environ[\"UNIPILE_DSN\"]/api/v1/hosted/accounts/link',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'tip': 'MİCROSOFT',
'isim': 'Bob Outlook',
'success_url': 'https://yourapp.com/oauth/success',
'/başarısız_url': 'https://seninuygulamann.com/oauth/basarisiz'
}
)
print(veya.json()['URL'])İthalat requests, os, json
# IMAP: SMTP/IMAP kimlik bilgilerini doğrudan iletin (OAuth yönlendirmesi gerekmez)
# Tam IMAP ayrıntıları için /the-developers-guide-to-imap-api-solution/ adresine bakın
resp = requests.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/hesaplar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
json={
'sağlayıcı': 'IMAP',
'kullanıcı adı': 'alice@company.com',
'şifre': 'buraya_uygulama_şifresi',
'imap_host': 'imap.company.com',
'smtp_sunucu': 'smtp.şirketim.com'
}
)
account_id = resp.json()['hesap_kimliği']
print(Bağlı hesap: {account_id}')Python'dan İlk E-postanızı Gönderme
Gönder uç noktası kabul eder multipart/form-data. Kullan veri= değil json=) içinde requests.post(). Nokta için, ccve gizli kopya Alanlar form verileri içinde JSON kodlu dizelerdir.
İthalat requests, os, json
istemler.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'görünebilir_isim': 'Alice', 'tanımlayıcı': 'alice@acme.com'}]),
'konu': 'Hızlı güncelleme',
'gövde': 'Merhaba Alice, sadece haberleşmek istedim.'
}
)vücut alan hem düz metin hem de HTML kabul eder. Kullan HTML biçimlendirme etiketleri.İthalat requests, os, json
response = requests.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': 'alice@acme.com'}]),
'cc'json.çöpler([{'tanımlayıcı': 'manager@acme.com'}]),
'gizli kopya'json.çöpler([{'tanımlayıcı': 'crm@yourapp.com'}]),
'konu': 'Faturanız hazır',
'gövde': 'Fatura #1042
Faturanız ektedir.
'
}
)
# 202 Kabul Edildi = teslimata hazr
print(yanıt.durum_kodu, yanıt.json())İthalat requests, os, json
fonksiyon e-posta gönder(e_posta_kime: dizi, konu: dizi, gövde: dizi) -> sözlük:
"""Unipile e-posta API Python sarmalayıcısı aracılığıyla e-posta gönder."""
response = requests.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': to_email}]),
'konu': konu,
'gövde'vücut,
},
zaman aşımı=30
)
cevap.raisen_for_status() # 4xx/5xx'te HTTPError yükseltir
return cevap.json() # {'tracking_id': 'msg_...'}zaman aşımı=30 ağ sorunlarında sonsuza dek takılıp kalmamak için. Kullanın raise_for_status() HTTP hatalarını Python istisnaları olarak yükseltmek için.API anahtarınızı alın, birkaç dakika içinde bir Gmail veya Outlook hesabı bağlayın ve bu kılavuzdaki Python örneklerini gerçek posta kutularına karşı çalıştırın.
Pythonda Ek Gönderme
Ekler Python kullanarak multipart form verisinin bir parçası olarak gönderilir. dosyalar= parameter. Dosyayı ikili modda aç'rb') - baytlar, dizgiler değil.
İthalat requests, os, json
# Tek dosya eki
ile aç('fatura.pdf', 'rb') olarak f:
resp = requests.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': 'client@example.com'}]),
'konu': 'Fatura ektedir',
'gövde': 'Lütfen ekteki faturaya bakınız.
'
},
dosyalar={'Ekler': ('fatura.pdf', f, 'uygulama/pdf')}
)
# Birden fazla ek: tuple listesi geçirin
# dosyalar=[('ekler', ('a.pdf', f1, 'application/pdf')),
# ('eki', ('b.png', f2, 'image/png'))]'file.pdf', 'rb' dosyasını aç, değil 'r'. Bir metin dosyası nesnesi geçirme dosyalar= yükseltir Tür Hatası. Bu smtplib'den geçiş yaparken yaygın bir Python'a özgü püf noktasıdır.dosyalar=her bir demet ('ekler', (dosya_adı, dosya_nesnesi, içerik_türü)). Requests, multipart sınırını otomatik olarak halleder.BytesIO nesne doğrudan from io import BytesIO; buf = BytesIO(pdf_bytes) sonra ('rapor.pdf', buf, 'application/pdf').Yanıtlar, Konular ve Takip
İçin Bir kullanıcı adına e-posta gönderme, iş parçacığı ve webhook tabanlı teslimat takibi için ihtiyacınız olan Python kalıpları şunlardır.
01Yanıtı olan başlıklarla
Mevcut bir iş parçacığında yanıtlamak için, şunu geçirin yanıt_olarak alanı takip_kimliği e-postanın, yanıtlamak istediğiniz. Unipile yönetir Referanslar ve Yanıt-Kime başlıklar otomatik olarak.
istemler.POST(
f'{DSN}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI': API_ANAHTARI},
veri={
'hesap_kimliği': HESAP_KODU,
'için'json.çöpler([{'tanımlayıcı': 'alice@acme.com'}]),
'konu': 'Y: Sorunuz',
'gövde': 'Mesajınızın devamı olarak.
',
'cevap_verilen': 'orijinal_takip_kimliği'
}
)02Python'da Webhook'lar (Flask örneği)
Teslimat olaylarını (gönderildi, sekti, açıldı) almak için Unipile kontrol panelinize bir webhook URL'si kaydedin. İşte minimal bir Flask alıcısı:
itibaren şişe İthalat Flask, request, jsonify
İthalat Günlük kaydı
uygulama = Flask(__isim__)
günlükleme.basicConfigloglama=logging.BİLGİ)
@uygulama.rota('/webhook/email', yöntemler=['POST'])
fonksiyon email_webhook():
etkinlik = istek.get_json()
etkinlik_tipi = etkinlik.olsun('tip')
tracking_id = event.olsun('takip_kimliği')
günlükleme.bilgi(f'E-posta olayı: {event_type} - {tracking_id} için')
return json'a dönüştürtamam=Doğru), 20003Tekrarlanabilir Anahtarlar
Ağ tekrarında yinelenen göndermeleri önlemek için benzersiz bir Idempotans Anahtarı header. Aynı anahtar iki kez gönderilirse, Unipile ikinci bir e-posta göndermeden orijinal yanıtı döndürür.
İthalat uuid, istekler, os, json
anahtar = dizi(uuid.uuid4()) # bir kez oluştur, veritabanında sakla
istemler.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar=
'X-API-ANAHTARI'os.environ'UNIPILE_API_ANAHTARI'],
'Idempotency-Key'anahtar
},
veri={'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': 'alice@acme.com'}]),
'konu': 'Hoş geldiniz!', 'gövde': 'Merhaba!'}
)Hata Yönetimi ve Yeniden Denemeler
E-posta API'si için üretim Python kodu, uygun hata işleme, yapılandırılmış günlük kaydı ve üssel geri çekilme ile otomatik yeniden denemeler gerektirir azim kütüphane.
| HTTP Kodu | Anlam | Aksiyon |
|---|---|---|
| 202 | Kabul edildi - teslimat için sıraya alındı | tracking_id'yi sakla |
| 400 | Kötü istek (geçersiz alanlar) | Yükü düzelt, yeniden deneme |
| 401 | Geçersiz API anahtarı | UNIPILE_API_KEY'i Kontrol Et |
| 403 | Hesap yetkilendirilmedi | Hesabı yeniden bağla |
| 404 | Hesap Kimliği bulunamadı | UNIPILE_ACCOUNT_ID'yi kontrol et |
| 429 | Hız Limiti Uygulandı | Geri çekilme + yeniden deneme (koda bakınız) |
| 500 | Sunucu hatası | 5 saniye gecikmeyle tekrar dene |
İthalat requests, os, json, logging
itibaren azim İthalat (
yeniden dene, deneme sonrası durdur,
bekle_üstel, hata_tipi_varsa_tekrar_dene
)
günlükleme.basicConfigloglama=logging.BİLGİ)
logger = logging.kayıtçıal(__isim__)
sınıf Hız Limiti Hatası(İstisna):
geç
@tekrar dene(
dur=denemeden_sonra_durdur(4),
bekle=bekleme_üstel(çarpım=1, min=2, maks=30),
tekrar dene=retry_if_exception_type(Hız Limiti Hatası)
)
fonksiyon yeniden_dene_ile_gönder(kime: dizi, konu: dizi, gövde: dizi) -> sözlük:
resp = requests.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={
'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': [y,
'konu': konu, 'gövde'gövde
},
zaman aşımı=30
)
eğer resp.status_code == 429:
kayıtçı.Uyarı('Sınır aşıldı, geri çekiliyor...')
yükseltmek Hız Limiti Hatası()
yanıt olarak.raisen_for_status()
return yanıt olarak.json()Python'da Güvenlik En İyi Uygulamaları
E-posta API entegrasyonunuzu korumaya yönelik eksiksiz bir kılavuz için şuraya bakın: E-posta API Güvenlik Rehberi. İşte Python'a özgü temel bilgiler.
os.environ veya python-dotenv. Asla koymayın UNIPILE_API_KEY Bunu kaynak kodunuzda dize değişmez değeri olarak bırakın. Yanlışlıkla Git'e gönderilirse, anahtarı panonuzdan hemen değiştirin.sanal ortam veya conda. Bu, bağımlılık karmaşası saldırılarını önler ve sizin gereksinimler.txt denetlenebilir. Üretim ortamında sürümleri sabitleyin.UNIPILE_API_KEY Geçerli.takip_kimliği gönderilen her e-posta için teslimat denetimlerini etkinleştirin. Python'ın standart """ Günlük kaydı modül - asla yazdır() üretimde. Uyumluluk açısından yoğun kullanım durumları için SIEM'e günlükleri gönderin.Yaygın Python'a Özgü Tuzaklar
Bunlar, e-posta API'sini entegre ederken Python geliştiricilerinin yaptığı en yaygın hatalardır. Bunun yerine Node.js kullanıyorsanız, bizimkini inceleyin JavaScript e-posta gönderme API'si eğitim rehberi.
json= yerine veri=multipart/form-data, JSON değil. Her zaman kullan requests.post(..., data={...}). Kullanma json={...} 400 hatası döndürecektir. için, ccve gizli kopya alanlar form verisi içindeki JSON dizeleridir - kullan json.dumps() alıcı dizisini kodlamak için.'file.pdf', 'rb' dosyasını aç - ikili mod. Metin modu ('r') bir yükseliş gösteriyor Tür Hatası geçildiğinde dosyalar= parametre. Bellekteki içerik için kullanın io.BytesIO.istekleri kütüphane senkrondur. İçinde çağırmak asenkron olarak tanımla işlev olay döngüsünü engeller. Kullan httpx.AsyncClient veya aiohttp.ClientSession asenkron Python bağlamları için (FastAPI, asenkron Django görünümleri, asyncio betikleri).requests.post() sonsuza dek bekler. Bozuk bir bağlantı, iş parçacığınızı (veya Celery işçisini) süresiz olarak engelleyecektir. Daima geçirin zaman aşımı=30 (bağlantı zaman aşımı, saniye cinsinden okuma zaman aşımı).from datetime import datetime, timezone; datetime.now(timezone.utc). Saf olmayan tarihler, çok bölgeli dağıtımlarda sessiz saat sapmalarına neden olur.concurrent.futures.ThreadPoolExecutor) veya Celery kuyruğuna aktar.Sıkça Sorulan Sorular
Python'da Unipile birleşik e-posta API'sini kullanmayla ilgili sık sorulan sorular.
smtplib veya doğrudan SMTP bağlantısı yerine Unipile birleşik e-posta API'sini kullanın. Kurulum istekleri, API anahtarınızı ve DSN'nizi Unipile kontrol panelinden alın, Gmail veya Outlook hesabını OAuth aracılığıyla bağlayın, ardından POST ile /api/v1/emails sizinle account_id, için, konuve vücut. Python kodunuzda SMTP sunucusu, 587 numaralı bağlantı noktası veya TLS yapılandırması gerekmez.
Django: Bir görünümde veya yönetim komutunda bir API çağrısı yapın. Asenkron Django (3.1+) için şunu kullanın: httpx.AsyncClient asenkron görünümlerde.
Flask: Yüksek hacimli gönderimleri arka plan işçilerine yüklemek için Flask-Celery kullanın. API'yi sunucu tarafında bir rota işleyicisinde çağırın. Jinja şablonundan veya istemci tarafı JS'den asla çağırmayın.
FastAPI: kullan httpx.AsyncClient içinde asenkron olarak tanımla uç noktaları. Eşzamanlı istekleri library eşzamansız olay döngüsünü engeller - FastAPI'de her zaman eşzamansız bir HTTP istemcisi kullanın.
smtplib Python işleminizden doğrudan bir SMTP sunucusuna bağlanır. SMTP kimlik bilgilerini, TLS kurulumunu ve sağlayıcıya özel tuhaflıkları (Gmail uygulama şifreleri, Outlook modern kimlik doğrulaması) siz yönetirsiniz. Ayrıca yalnızca senkronizedir.
Unipile e-posta API'si bir bulut soyutlamasıdır: OAuth aracılığıyla hesapları bağlayın (Gmail/Outlook için kodunuzda SMTP kimlik bilgisi yok), tüm sağlayıcılar için tek ve tutarlı bir HTTP API elde edin ve Unipile iletimi, jeton yenilemeyi ve yeniden deneme işlemlerini üstlenir. Karşılığında gönderimler doğrudan bir SMTP bağlantısı yerine Unipile'ın altyapısı üzerinden yönlendirilir.
Evet, ancak standart bir asenkron HTTP istemcisine ihtiyacınız var istekleri kütüphane senkroniktir ve olay döngünüzü engelleyecektir. Kullanın httpx (önerilen, açılır asenkron alternatif) veya aiohttp.
İthalat httpx, os, json
asenkron olarak tanımla e_posta_gönder_eşzamansız(kime: dizi, konu: dizi, gövde: dizi):
eşzamanlı olarak httpx.AsyncClient() olarak müşteri:
resp = bekliyor müşteri.POST(
f'{os.environ["UNIPILE_DSN"]}/api/v1/e-postalar',
başlıklar='X-API-ANAHTARI'os.environ['UNIPILE_API_ANAHTARI']},
veri={'hesap_kimliği'os.environ['UNIPILE_ACCOUNT_ID'],
'için'json.çöpler([{'tanımlayıcı': [y,
'konu': konu, 'gövde': vücut}
)
yanıt olarak.raisen_for_status()
return yanıt olarak.json()E-postaları görev haline getirerek bir Celery görev kuyruğu kullanın ve bir Redis veya RabbitMQ aracısı (broker) ile çalıştırın. Celery, eş zamanlılığı ve yeniden denemeleri otomatik olarak yönetir. Hız sınırlarını aşmamak için işçi başına eşzamanlılığı sınırlayın (genellikle bağlantılı hesap başına 5-10 eşzamanlı gönderim). Gerçekten yüksek hacimli pazarlama gönderileri (günlük milyonlarca) için, OAuth tabanlı işlemsel gönderimler için Unipile'ı toplu kampanyalar için özel bir ESP ile birleştirin.
Daha hafif kullanım durumları için, concurrent.futures.ThreadPoolExecutor(max_workers=5) ile istekleri kütüphane, Celery'nin ek yükünden kaçınan daha basit bir yaklaşımdır.
Evet. Çağıran bir Celery görevi oluşturun requests.post() Unipile uç noktasına. Celery worker'ları standart senkron Python işlemleridir, bu yüzden istekleri mükemmel çalışıyor. Celery'nin yerleşik özelliğini kullan autoretry_for=(requests.exceptions.HTTPError,) ile maksimum_deneme_sayısı=3 ve varsayılan_yeniden_deneme_gecikmesi=5 geçici hatalarda otomatik yeniden deneme için. Şununla birleştirin Idempotans Anahtarı işçi yeniden başlatmalarında yinelenen gönderimleri önlemek için üstbilgiler.
Hala sorularınız mı var? Ekibimiz yardım etmek için burada.