Belgelere geç
Python

E-posta gönderme

`emails.send`: tek mesaj, şimdi veya sonra.

emails.send

send_email.py
from openemail import openemail email = openemail.emails.send({    'from': {'email': '[email protected]', 'name': 'Acme Billing'},    'to': ['[email protected]', 'Grace <[email protected]>'],    'cc': '[email protected]',    'bcc': [{'email': '[email protected]'}],    'replyTo': '[email protected]',    'subject': 'Your September invoice',    'html': '<p>Invoice attached.</p>',    'text': 'Invoice attached.',    'headers': {'X-Campaign': 'invoices'},    'attachments': [{'filename': 'invoice.pdf', 'content': pdf_bytes}],    'threadId': 'thread_…',    'scheduledAt': 'PT1H',    'tags': {'order': '4021'},    'tracking': {'opens': True, 'clicks': True},})

to, cc ve bcc bir veya birden çok alıcı alır; tek bir alıcı sizin için diziye sarılır. Her biri çıplak bir adres, Name <addr@host> veya {'email': ..., 'name': ...} olabilir.

Parametreler

fromRecipientInputzorunlu
Gönderen. Çıplak bir adres, `Name <addr@host>` veya bir sözlük. Bu anahtarın gönderebileceği bir adres olmalıdır. Yedek gönderen yoktur; bu yüzden bir gönderim çıktığı adresi her zaman kendisi belirtir.
toRecipientInput | list[RecipientInput]zorunlu
Bir veya birden çok alıcı; tek bir alıcı sizin için diziye sarılır. to, cc ve bcc toplamında en fazla 50.
ccRecipientInput | list[RecipientInput]
50 alıcı sınırına dahil edilir.
bccRecipientInput | list[RecipientInput]
Başka kimsenin aldığı baytlarda asla adı geçmez, çünkü alıcı başına bir zarf iletilir.
replyToRecipientInput
Tek bir adres; Reply-To başlığı olarak gönderilir.
subjectstr
En fazla 998 karakter, RFC 5322 satır sınırı. Varsayılanı boştur.
htmlstr
html, text, draftId veya template alanlarından biri zorunludur. html ve text birlikte verildiğinde alıcıların gördüğü HTML'dir.
textstr
Düz metin parça.
templateEmailSendTemplate
Saklanan bir şablonu sunucu tarafında işler. `version` sürümü sabitler; belirtmezseniz istek kabul edildiğinde yayımda olan sürüm kullanılır. Bilinmeyen veya eksik bir özellik, mesajda bir boşluk değil 422 verir.
draftIdstr
Kaydedilmiş bir taslağı bu zarf altında gönderir.
headersdict[str, str]
`X-*`, `List-*`, Reply-To, Precedence, Auto-Submitted, Importance, Priority ve Feedback-Id. Taşıma katmanının kendi ayarladığı her şey sessizce düşürülmek yerine reddedilir.
attachmentslist[AttachmentInput]
İsteğe bağlı bir `'contentType'` ile `{'filename': ..., 'content': ...}` ya da çalışma alanında zaten bulunan bir dosyayı, örneğin `files.upload` ile yükleneni gösteren `{'fileId': ...}`. content için bayt geçirin, sizin için base64'e kodlanır. 20 dosya; satır içi dosyalar çözüldükten sonra toplam 5 MB ile sınırlıdır. Saklanan bir dosya daha büyük olabilir ve indirme bağlantısı olarak gider.
attachmentDeliveryAttachmentDeliveryMode
`mime`, `link` veya `auto`. `auto`, etkin bir dosya alan adı olan bir alan adında dosyaları 2 MB'ı aştıklarında indirme bağlantısı olarak, aksi hâlde mesajın içinde taşır. Belirtilmezse posta kutusu ayarı geçerli olur ve onun varsayılanı `auto`'dur.
threadIdstr
Var olan bir konuşma dizisine yanıt verir. Taşıma katmanı In-Reply-To ve References başlıklarını yazar.
scheduledAtdatetime | str
Bir `datetime`, bir ISO-8601 anı veya `PT1H` gibi bir süre. En fazla bir yıl sonrası, asla geçmiş değil. cancellableForSeconds ile birlikte kullanılamaz.
cancellableForSecondsint
0 ile 900 arası. Anlık bir gönderimde geri alma penceresi: yazma ekranının geri alma mekanizması, koda gömülmek yerine dışarı açılmış hâli.
tagsdict[str, str]
En fazla 10 etiket; aynen geri döndürülür ve filtrelenebilir. Asla yorumlanmaz.
signaturebool
Bu iletinin gönderen adresin imzasını taşıyıp taşımayacağı: adresin kendi imzası, yoksa bir catch-all'un yakaladığı adres için catch-all'un imzası, o da yoksa OpenEmail alt bilgisi (o adres kapatmadıysa). Belirtilmezse `html` gövde yazıldığı gibi imzasız gider, yalnızca `text` olan gövde ise imzayı taşır. Bir programın birinin adına gönderdiği postada, örneğin bir makbuz, parola sıfırlama ya da özet için `False` verin; bunların hiçbiri altında bir kişinin imzasını istemez.
trackingTrackingRequest
Bu mesaja açılma pikseli eklenip bağlantılarının yeniden yazılıp yazılmayacağı. Mesajın gönderildiği adres (ya da onu yakalayan catch-all) için izleme açılmadıkça kapalıdır ve burada belirtilen her iki alan da, adres nasıl ayarlanmış olursa olsun o tek mesaj için kararı verir.
translateSendTranslateOptions
Alıcının dilinde gönderir. `to` bir kod, İngilizce bir ad veya dilin kendi adını alır; `subject` ve `includeOriginal` varsayılan olarak true'dur. İstek kabul edildiğinde çözümlenir, dolayısıyla zamanlanmış bir mesaj onaylanan sözcükleri taşır. `draftId` ile birlikte kullanılamaz.

Yanıt

idstr
Gönderim id'si, `msg_…`. Onu `get`, `cancel`, `reschedule` ve `get_tracking` için kullanın.
statusEmailStatus
queued, scheduled, sending, sent, partial, bounced, cancelled veya failed. Çağrının dönmüş olmasına değil buna bakın. `partial` kendi başına bir durumdur: bazı alıcılar mesajı almıştır ve bu geri alınamaz, dolayısıyla yeniden denemek yanlış, başarısızlık bildirmek ise yalandır.
modeApiKeyMode
Hangi tür anahtarın gönderdiği. Test gönderimi kaydedilir ve asla iletilmez.
fromstr
Gerçekte yetkilendirilen ve ağa konan adres; bu her zaman istenen adres değildir.
subjectstr | None
Gönderildiği hâliyle.
messageIdstr | None
RFC 5322 Message-ID. MIME oluşana kadar null. Gönderim servisi başlığı çıkışta yeniden yazar; dolayısıyla hiçbir geri dönüş veya teslim raporu bu değeri taşımaz. Bir olayın geri döndüğü değer `id`'dir.
threadIdstr | None
Düştüğü konuşma dizisi.
transportEmailTransport | str | None
Mesajın nasıl gittiği. Gönderime kadar null.
attemptsint
Gönderimin kaç kez denendiği.
lastErrorstr | None
Son denemenin neden başarısız olduğu, olduğu gibi.
scheduledAtstr | None
Gitmesi gereken ISO anı.
cancellableUntilstr | None
Şu an bundan önce olduğu sürece iptal hâlâ çalışır.
sentAtstr | None
Gittiği ISO anı.
tagsdict[str, str]
Gönderdiğiniz şey, aynen geri döndürülür.
sourceEmailSource | str
composer, api, mcp, ai, oauth veya form: hangi yüzeyin istediği. `api`, bir API anahtarıyla çalışan bu istemcidir; `oauth` ise bir erişim tokenıyla çalışan bu istemcidir.
createdAtstr
Kaydın yazıldığı ISO anı.
replayedbool
Bir Idempotency-Key, zaten var olan bir gönderimle eşleştiğinde True olur. Yeni bir şey gönderilmemiştir ve bu, özgün mesajdır.
translationNotRequired[EmailTranslationResource]
Yalnızca çevrilmiş bir mesajda ve yalnızca saklanan isteğin tamamının taşındığı yerlerde bulunur: bu yanıt ve `get`. `language`, `languageName`, `detectedSourceLanguage`, `subject` ve `includeOriginal` alanlarından oluşan bir sözlük; hepsi dil satırları değil kodlardır. Bir liste satırında hiç bulunmaz, dolayısıyla oradaki yokluğu hiçbir yönde bir şey söylemez. Onu `email.get('translation')` ile okuyun.

Alıcının dilinde

translate, mesajı gitmeden önce bir başkasının dilinde yazar. Gövde ve (siz kapatmadıkça) konu, API isteği kabul ettiğinde çevrilir ve ortaya çıkan metin gidenin ta kendisidir: üretilemeyen bir çeviri, mesajı sizin yazdığınız dilde göndermek yerine gönderimi reddeder.

translate.py
from openemail import openemail email = openemail.emails.send({    'from': '[email protected]',    'to': '[email protected]',    'subject': 'Your September invoice',    'html': '<p>Invoice attached. Payment is due on the 14th.</p>',    'translate': {'to': 'de'},}) print(email.get('translation'))

Kimse gitmeden önce onu okumadı. emails.translate, aynı gidiş dönüşün bir adım önce durdurulmuş hâlidir. Sonucu bir insana gösterin, değiştirmesine izin verin, sonra onun onayladığı metni çağrıda hiç translate olmadan gönderin. Yeniden geçirmek ikinci kez çeviri yapar ve o kişinin düzenlemelerini çöpe atar.

preview_translation.py
from openemail import openemail preview = openemail.emails.translate({    'subject': 'Your September invoice',    'html': '<p>Invoice attached. Payment is due on the 14th.</p>',    'to': 'de',}) print(preview['language']['native'], preview['detectedSourceLanguage'])print(preview['html']) approved_subject = input(f"Subject [{preview['subject']}]: ") or preview['subject'] or '' openemail.emails.send({    'from': '[email protected]',    'to': '[email protected]',    'subject': approved_subject,    'html': preview['html'] or '',})
render_picker.py
from openemail import LANGUAGES, is_rtl_language, language_by_code, openemail, resolve_language current = openemail.languages.list() german = resolve_language('Deutsch')traditional = resolve_language('zh-TW')upper = language_by_code('DE') assert len(LANGUAGES) == 200assert german is not None and german['code'] == 'de'assert traditional is not None and traditional['code'] == 'zh-Hant'assert upper is not None and upper['native'] == 'Deutsch'assert is_rtl_language('ar')

Tablo, seçici sırasıyla pakete gömülüdür; böylece bir seçici ilk istekten önce doldurulabilir. languages.list(), ağdan gelen aynı satırları düz bir liste olarak döndürür; bu, bu sürümle gelenler yerine güncel olanları tercih eden çağıranlar içindir. resolve_language bir kodu, İngilizce adı, dilin kendi adını veya bir takma adı alır (zh-TW, artık listelenmeyen bir kodun takma adıdır); language_by_code büyük/küçük harf duyarsız olarak tam kod eşleşmesi yapar ve satırların on altısı sağdan soladır. native, label ve code alanlarında birlikte arayın, önce native değerini gösterin ve kodu saklayın.

emails.translate otomatik olarak yeniden denenmez. Model çağrısı harcar ve hiçbir şey yazmaz; dolayısıyla idempotent kılınacak bir şey yoktur ve yanıtsız kalan bir isteğin ardından yeniden denemek yalnızca aynı yanıtı iki kez satın almak olur.

  • Hiçbir şeye çözümlenmeyen bir dil, hiçbir şey gönderilmeden önce translate.to üzerinde bir validation_error verir.
  • 30.000 karakteri aşınca translation_too_long, kurulumda yapılandırılmış bir AI yoksa translation_not_configured, çalışma alanı bugünkü AI işlemlerini tükettiyse 429 ai_quota_exceeded (UTC gece yarısında sıfırlanır ve yeniden denenmez), sağlayıcı yanıt vermediyse translation_failed. Hiçbiri yedek olarak mesajı çevrilmemiş hâlde göndermez.
  • template ile birlikte çalışır: çevrilen şey İŞLENMİŞ çıktıdır, dolayısıyla saklanan tek bir gövde, müşterilerinizin okuduğu her dile hizmet eder. Tam bir belge üreten bir şablon doctype'ını, <style> bloklarını ve @font-face kurallarını korur: modele yalnızca gövde gider, geri kalanı çevresine geri konur. Zaten hiçbir yerde görüntülenmeyen <title> öğesine dokunulmaz.
  • Yeniden denemenin ek bir maliyeti yoktur. Çeviri, idempotency parmak izinin parçası değildir (istek ise translate dahil parçasıdır); dolayısıyla yanıtsız kalan bir gönderimi aynı Idempotency-Key ile yeniden denemek, ikinci kez çevirip göndermek yerine zaten var olan mesajı yeniden oynatır.
  • Kuyrukta bekleyen veya zamanlanmış, çevrilmiş bir mesaj, metin değişikliklerine karşı dondurulmuştur. emails.reschedule onu yine de erteleyebilir; ne söylediğini değiştirmek ise iptal edip yeniden göndermek demektir.

Ekler

content ağ üzerinde base64'tür. Bayt geçirin, sizin için kodlanır.

attachment.py
from pathlib import Path from openemail.types import AttachmentInput attachments: list[AttachmentInput] = [    {        'filename': 'invoice.pdf',        'content': Path('invoice.pdf').read_bytes(),        'contentType': 'application/pdf',    },]

Başka bir yerde ihtiyacınız olursa to_base64 dışa aktarılmıştır. content içindeki bir str olduğu gibi gönderilir; bu yüzden zaten base64 olmalıdır.

Referans