Python ile API Üzerinden E-posta Gönderme (Hızlı Eğitim)

İçindekiler
İçindekiler 11 bölüm
Başlarken
E-posta Gönderme
Üretim
Referans
Python Eğitimleri

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.

email api python E-posta gönderimi api python Gmail / Outlook / IMAP istekler / aiohttp Flask / Django / FastAPI
email_gönder.py
İ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())
E-posta teslim edildi - 202 Kabul edildi
Şunlarla çalışır: Gmail Görünüm IMAP
Özetle

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.

1
requests kur
pip install requests python-dotenv
2
Ortam değişkenlerini ayarla
Ekle UNIPILE_DSN, UNIPILE_API_KEYve UNIPILE_HESAP_KODU sana .env dosya.
3
Bir e-posta hesabı bağla
Gmail/Outlook için OAuth veya herhangi bir IMAP sunucusu için SMTP kimlik bilgileri. Tek API çağrısı - bunu hesap başına yalnızca bir kez yaparsınız.
4
POST'a /api/v1/emails
Geç account_id, için, konuve vücut. Tamamlandı.
Aynı Python kodu, Gmail, Outlook ve herhangi bir IMAP sunucusu için çalışır - sağlayıcıya özel bir mantık gerekmez. Kontrol et E-posta API rehberi tam kavramsal bakış için.
email_gönder.py
İ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_...'}
Kurulum

Ö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ı.

Python 3.9+ (3.11 önerilir)
Tüm örnekler f-string kullanıyor, | 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.
Unipile API Anahtarı ve DSN
Erişim jetonunuzu ve DSN'yi (kişisel bir HTTPS uç noktası gibi) almak için Unipile kontrol paneline kaydolun api4.unipile.com:13444Her iki parametre de her istek başlığında gereklidir.
Sanal ortam
Bağımlılıkları izole etmek için her zaman bir venv kullanın: python -m venv .venv && source .venv/bin/activate. Paketleri asla sistem Python'una kurmayın - bu, kimlik bilgisi işlemesi için özellikle önemlidir.
Bağlı bir e-posta hesabı
E-posta gönderiyorsun aracılığıyla bağlı bir hesap (Gmail, Outlook veya IMAP). Bir sonrakı bölüm, birini bağlamak için OAuth akışında size yol gösterir. Bunu hesap başına yalnızca bir kez yaparsınız.
Bağımlılıkları yükleniyor
pip
pipenv
şiir
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 tenacity
pipenv install requests python-dotenv tenacity
poetry add requests python-dotenv tenacity
.env
# 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_xxxxxxxxxxxxxxxx

Ekle .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 gönderinize hazır mısınız?
Ücretsiz bir API anahtarı alın - 30 saniye sürer, kredi kartı gerekmez.
Ücretsiz API anahtarınızı alın
Hesap Bağlama

İ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.

GmailGmail OAuth
GörünümOutlook OAuth
IMAPIMAP / SMTP
connect_gmail.py
İ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}')
Gmail
Gmail
Google OAuth 2.0 kullanır. Parola saklanmaz. Token yenileme otomatik olarak yapılır. Bkz. Gmail API e-posta gönderme rehberi kapsam detayları için.
Görünüm
Outlook / Microsoft 365
Microsoft Graph OAuth kullanır. Kişisel Outlook ve Microsoft 365 / Exchange Online'ı kapsar. Bkz. Microsoft Graph e-posta kılavuzu yönetici onay akışları için.
IMAP
IMAP / SMTP
Kimlik bilgilerini doğrudan iletin. Zoho, Yahoo, FastMail, özel Exchange gibi tüm IMAP sunucularıyla çalışır. Ayrıntılı bilgi için IMAP API çözüm rehberi port yapılandırması için.
Çekirdek API

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.

1
Düz metin e-posta
Temel
İ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.' } )
Not: Bu vücut alan hem düz metin hem de HTML kabul eder. Kullan

HTML biçimlendirme etiketleri.

2
HTML e-posta ile CC ve BCC
Yaygın
İ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())
3
Yanıt işleme
Üretim
İ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_...'}
İpucu: Her zaman geç 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.
Başlangıç için ücretsiz
Şimdi dene - 30 saniyede ücretsiz API anahtarı

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.

Ekler

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.

attach.py
İthalat requests, os, json # Tek dosya eki ile ('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'))]
Her zaman ikili modda aç.
Kullanım '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.
Birden fazla dosya
tuple'lardan oluşan bir liste olarak geçin dosyalar=her bir demet ('ekler', (dosya_adı, dosya_nesnesi, içerik_türü)). Requests, multipart sınırını otomatik olarak halleder.
Bellek İçi Dosyalar (BytesIO)
Dinamik olarak oluşturulan PDF'ler veya CSV dışa aktarımları için şunu geçirin: BytesIO nesne doğrudan from io import BytesIO; buf = BytesIO(pdf_bytes) sonra ('rapor.pdf', buf, 'application/pdf').
Sağlayıcı limitleri: Gmail, gönderim başına toplam 25 MB'a kadar izin verir. Outlook, 20 MB'a kadar izin verir. IMAP sınırları sunucu yapılandırmanıza bağlıdır. Bu sınırların üzerindeki dosyalar için bunun yerine bir indirme bağlantısı gönderin.
Daha büyük ekler veya daha yüksek gönderme sınırları mı gerekiyor?
Unipile planları prototiplerden üretim iş yüklerine kadar ölçeklenir. Fiyatlandırma sayfasındaki kotaları karşılaştırın.
Unipile - Gelişmiş Python API
Gelişmiş

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.

01
Yanı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.

reply.py
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' } )
02
Python'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ı:

webhook_flask.py
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), 200
03
Tekrarlanabilir 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.

idempotency.py
İ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!'} )
Üretim

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 KoduAnlamAksiyon
202Kabul edildi - teslimat için sıraya alındıtracking_id'yi sakla
400Kötü istek (geçersiz alanlar)Yükü düzelt, yeniden deneme
401Geçersiz API anahtarıUNIPILE_API_KEY'i Kontrol Et
403Hesap yetkilendirilmediHesabı yeniden bağla
404Hesap Kimliği bulunamadıUNIPILE_ACCOUNT_ID'yi kontrol et
429Hız Limiti UygulandıGeri çekilme + yeniden deneme (koda bakınız)
500Sunucu hatası5 saniye gecikmeyle tekrar dene
retry.py
İ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()
Güvenlik

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.

Anahtarları asla sabit kodlama
Kullanım 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 ortamlar
Bağımlılıkları her zaman izole et 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.
OAuth belirteç yenileme
Unipile, Gmail ve Outlook için OAuth belirteç yenilemesini otomatik olarak yönetir. Sağlayıcı belirteçlerini asla saklamazsınız veya yenilemezsiniz - siz sadece kendi UNIPILE_API_KEY Geçerli.
Yalnızca sunucu tarafı
Unipile API'yi asla istemci taraflı koddan (tarayıcı veya mobil uygulama) çağırmayın. Flask/Django/FastAPI'de, API çağrılarını her zaman sunucu taraflı görünümlerde veya arka plan görevlerinde (Celery) tutun.
Webhook yüklerini doğrula
Flask veya FastAPI'de Unipile web kancaları alırken, olayı işlemeden önce gizli başlık veya HMAC imzası aracılığıyla istek kaynağını doğrulayın. Asla ham gelen yükleri körü körüne güvenmeyin.
Denetim ve günlükleme
Kütük 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.
DKIM ve SPF Bunlar DNS düzeyindedir, Python kodu değildir. Gönderen alanınız için SPF ve DKIM kayıtlarını ayarlayın. Tamamını okuyun E-posta API Güvenlik Rehberi Adım adım DNS kurulumu için.
Sakıncalar

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.

Kullanma json= yerine veri=
Unipile gönderi uç noktası gerektiriyor 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.
Düzeltme: gönderici dizileri için json.dumps() ile data= kullanın
Metin modunda ek dosyaları açma
Her zaman dosya eklerini şununla aç '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.
Düzeltme: Dosyaları her zaman 'rb' olarak aç'
Async ve senkron (asyncio) karıştırma
Bu 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).
Düzeltme: async/await bağlamları için httpx.AsyncClient kullanın
İsteklerde zaman aşımı eksik
Varsayılan olarak, 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ı).
Düzeltme: requests.post()'a her zaman timeout=(5, 30) iletin
Zaman dilimi-bilinçsiz tarihler zamanlamada
Zaman damgası alanıyla e-posta zamanlarken, her zaman saat dilimi duyarlı tarihler kullanın. from datetime import datetime, timezone; datetime.now(timezone.utc). Saf olmayan tarihler, çok bölgeli dağıtımlarda sessiz saat sapmalarına neden olur.
Düzeltme: datetime nesneleri için her zaman timezone.utc'yi kullanın
GIL'in yüksek hacimli ileti gönderme işlemleri üzerindeki etkisi
Python'ın GIL'i CPU'ya bağlı işler için gerçek iş parçacığı paralelliğini sınırlar, ancak HTTP istekleri G/Ç'ye bağlıdır - iş parçacıkları işe yarar. Yüksek hacimli gönderiler (günde 1000+/gün) için bir iş parçacığı havuzu kullanın (concurrent.futures.ThreadPoolExecutor) veya Celery kuyruğuna aktar.
Düzeltme: toplu gönderimler için ThreadPoolExecutor veya Celery kullanın

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.

tr_TRTR