Dërgoni një email
`emails.send`: një mesazh, tani ose më vonë.
emails.send
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 dhe bcc pranojnë një marrës ose shumë, dhe një i vetëm mbështillet për ju. Secili mund të jetë një adresë e thjeshtë, Name <addr@host>, ose {'email': ..., 'name': ...}.
Parametrat
fromRecipientInpute detyrueshme- Dërguesi. Një adresë e thjeshtë, `Name <addr@host>`, ose një dict. Duhet të jetë një nga adresat si të cilat mund të dërgojë ky çelës. Nuk ka dërgues rezervë, ndaj një dërgim e emërton gjithmonë adresën nga e cila niset.
toRecipientInput | list[RecipientInput]e detyrueshme- Një marrës ose shumë; një i vetëm mbështillet për ju. Më së shumti 50 gjithsej mes to, cc dhe bcc.
ccRecipientInput | list[RecipientInput]- Numërohet te kufiri prej 50 marrësish.
bccRecipientInput | list[RecipientInput]- Kurrë e emërtuar te bajtet që merr kushdo tjetër, sepse transmetohet një zarf për çdo marrës.
replyToRecipientInput- Një adresë e vetme, e dërguar si header-i Reply-To.
subjectstr- Më së shumti 998 karaktere, kufiri i rreshtit sipas RFC 5322. Parazgjedhja është bosh.
htmlstr- Kërkohet një nga html, text, draftId ose template. HTML-ja është ajo që shohin marrësit kur jepen të dyja, html dhe text.
textstr- Pjesa me tekst të thjeshtë.
templateEmailSendTemplate- Renderon një template të ruajtur te serveri. `version` e fikson; lëreni jashtë për të përdorur atë që është e publikuar kur pranohet kërkesa. Një prop i panjohur ose që mungon është një 422 dhe jo një zbrazëti në mesazh.
draftIdstr- Dërgoni një draft të ruajtur nën këtë zarf.
headersdict[str, str]- `X-*`, `List-*`, Reply-To, Precedence, Auto-Submitted, Importance, Priority dhe Feedback-Id. Çdo gjë që e vendos vetë transporti refuzohet në vend që të hiqet në heshtje.
attachmentslist[AttachmentInput]- `{'filename': ..., 'content': ...}` me një `'contentType'` opsional, ose `{'fileId': ...}` që emërton një skedar që gjendet tashmë në hapësirën e punës, si p.sh. një nga `files.upload`. Jepni bajte për content dhe ato kodohen në base64 për ju. 20 skedarë, me skedarët inline të kufizuar në 5 MB gjithsej pasi dekodohen. Një skedar i ruajtur mund të jetë më i madh dhe udhëton si lidhje shkarkimi.
attachmentDeliveryAttachmentDeliveryMode- `mime`, `link` ose `auto`. `auto` i mban skedarët si lidhje shkarkimi sapo kalojnë 2 MB te një domen me një domen skedarësh aktiv, dhe brenda mesazhit përndryshe. E lënë jashtë, zbatohet cilësimi i kutisë postare, dhe ai ka si parazgjedhje `auto`.
threadIdstr- Përgjigjuni brenda një thread-i ekzistues. Transporti shkruan In-Reply-To dhe References.
scheduledAtdatetime | str- Një `datetime`, një çast ISO-8601, ose një kohëzgjatje si `PT1H`. Deri në një vit larg, kurrë në të shkuarën. Nuk mund të kombinohet me cancellableForSeconds.
cancellableForSecondsint- 0 deri në 900. Një dritare anulimi te një dërgim i menjëhershëm: mekanizmi i anulimit i kompozuesit, i ekspozuar në vend që të jetë i ngurtësuar.
tagsdict[str, str]- Deri në 10 etiketa, të kthyera ashtu siç janë dhe të filtrueshme. Kurrë të interpretuara.
signaturebool- Nëse ky mesazh mbart nënshkrimin e adresës nga e cila dërgohet: të vetin e asaj adrese, përndryshe atë të catch-all për një adresë që e kapi një catch-all, përndryshe fundfaqen e OpenEmail, përveç nëse ajo adresë e ka fikur. Nëse mungon, një trup `html` del saktësisht siç është shkruar, pa nënshkrim, dhe një trup vetëm `text` e mbart. Vendosni `False` për postën që një program dërgon në emër të dikujt, si një faturë, një rivendosje fjalëkalimi ose një përmbledhje, asnjëra prej të cilave nuk do nënshkrimin e një personi poshtë.
trackingTrackingRequest- Nëse të shtohet një piksel hapjeje dhe të rishkruhen lidhjet për këtë mesazh. I fikur, veç nëse gjurmimi është ndezur për adresën nga e cila dërgohet (ose për catch-all që e kapi), dhe secila fushë e deklaruar këtu e vendos atë mesazh të vetëm sido që të jetë caktuar adresa.
translateSendTranslateOptions- Dërgojeni në gjuhën e marrësit. `to` pranon një kod, një emër në anglisht ose emrin e vetë gjuhës; `subject` dhe `includeOriginal` kanë të dyja si parazgjedhje true. Zgjidhet kur pranohet kërkesa, kështu që një mesazh i planifikuar mban fjalët që u miratuan. Refuzohet së bashku me `draftId`.
Përgjigje
idstr- Id-ja e dërgimit, `msg_…`. Përdoreni për `get`, `cancel`, `reschedule` dhe `get_tracking`.
statusEmailStatus- queued, scheduled, sending, sent, partial, bounced, cancelled ose failed. Lexoni këtë dhe jo faktin që thirrja u kthye. `partial` është një gjendje më vete: disa marrës e kanë dhe nuk mund t'u hiqet, pra riprovimi është i gabuar dhe raportimi i dështimit është gënjeshtër.
modeApiKeyMode- Cili lloj çelësi e dërgoi. Një dërgim test regjistrohet dhe nuk transmetohet kurrë.
fromstr- Adresa që u autorizua vërtet dhe që doli në rrjet, e cila nuk është gjithmonë ajo që u kërkua.
subjectstr | None- Ashtu siç u dërgua.
messageIdstr | None- Message-ID sipas RFC 5322. Null derisa të ekzistojë MIME-i. Shërbimi dërgues e rishkruan header-in në dalje, pra asnjë bounce apo raport dërgese nuk e mban këtë vlerë. `id` është ajo me të cilën kthehet një ngjarje.
threadIdstr | None- Thread-i te i cili u ul.
transportEmailTransport | str | None- Si u nis mesazhi. Null deri te nisja.
attemptsint- Sa herë është provuar nisja.
lastErrorstr | None- Pse dështoi përpjekja e fundit, fjalë për fjalë.
scheduledAtstr | None- Çasti ISO kur duhet të niset.
cancellableUntilstr | None- Përderisa tani është para kësaj, anulimi funksionon ende.
sentAtstr | None- Çasti ISO kur u nis.
tagsdict[str, str]- Ajo që dërguat, e kthyer ashtu siç është.
sourceEmailSource | str- composer, api, mcp, ai, oauth ose form: cila sipërfaqe e kërkoi. `api` është ky klient me një çelës API, dhe `oauth` është ky klient me një token qasjeje.
createdAtstr- Çasti ISO kur u shkrua regjistri.
replayedbool- True kur një Idempotency-Key përkoi me një dërgim që ekzistonte tashmë. Nuk u dërgua asgjë e re, dhe ky është mesazhi origjinal.
translationNotRequired[EmailTranslationResource]- I pranishëm vetëm te një mesazh që u përkthye, dhe vetëm aty ku bartet e gjithë kërkesa e ruajtur: kjo përgjigje dhe `get`. Një dict me `language`, `languageName`, `detectedSourceLanguage`, `subject` dhe `includeOriginal`, të gjitha kode dhe jo rreshta gjuhësh. Një rresht liste nuk e ka kurrë, pra mungesa e tij atje nuk thotë asgjë në asnjë drejtim. Lexojeni me `email.get('translation')`.
Në gjuhën e marrësit
translate e shkruan mesazhin në gjuhën e dikujt tjetër para se ai të niset. Trupi, dhe subjekti veç nëse e fikni, përkthehet kur API-ja e pranon kërkesën, dhe ajo që doli është ajo që niset: një përkthim që nuk mund të prodhohej e refuzon dërgimin në vend që ta nisë mesazhin në gjuhën në të cilën e shkruat.
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'))Askush nuk e lexoi atë para se të nisej. emails.translate është i njëjti udhëtim, i ndalur një hap më herët. Tregojani një personi, lëreni ta ndryshojë, pastaj dërgoni atë që ai miratoi pa asnjë translate te thirrja. Dhënia e tij sërish do ta përkthente për herë të dytë dhe do t'i hidhte poshtë ndryshimet e tij.
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 '',})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')Tabela vjen e përfshirë në paketë, në rendin e zgjedhësit, kështu që një zgjedhës mund të mbushet para kërkesës së parë. languages.list() kthen të njëjtët rreshta nga rrjeti si një listë të thjeshtë, për një thirrës që i preferon ato aktualet nga ato me të cilat u dërgua ky version. resolve_language pranon një kod, një emër në anglisht, një endonim ose një alias (zh-TW është alias i një kodi që nuk listohet më), language_by_code përputh një kod të saktë pa dallim shkronjash të mëdha e të vogla, dhe gjashtëmbëdhjetë nga rreshtat janë nga e djathta në të majtë. Kërkoni native, label dhe code bashkë, shfaqni native të parin, dhe ruani kodin.
emails.translate nuk riprovohet automatikisht. Ajo shpenzon thirrje modeli dhe nuk shkruan asgjë, pra nuk ka çfarë të bëhet idempotente dhe një riprovim pas një kërkese pa përgjigje do të blinte vetëm dy herë të njëjtën përgjigje.
- Një gjuhë që nuk zgjidhet në asgjë është një
validation_errormbitranslate.to, para se të dërgohet asgjë. translation_too_longmbi 30.000 karaktere,translation_not_configuredkur instalimi nuk ka AI të konfiguruar, një 429ai_quota_exceededkur hapësira e punës i ka përdorur veprimet e AI-së për sot (rivendoset në mesnatë UTC dhe nuk riprovohet),translation_failedkur ofruesi nuk u përgjigj. Asnjëri prej tyre nuk e dërgon mesazhin të papërkthyer si zgjidhje rezervë.- Funksionon me
template: ajo që përkthehet është dalja e RENDERUAR, kështu që një trup i vetëm i ruajtur u shërben të gjitha gjuhëve në të cilat lexojnë klientët tuaj. Një template që renderon një dokument të tërë e ruan doctype-in e vet, blloqet e veta<style>dhe rregullat@font-face: te modeli shkon vetëm trupi dhe pjesa tjetër vendoset sërish rreth tij.<title>i tij lihet i paprekur, gjë që nuk e shfaq gjithsesi asgjë. - Një riprovim nuk kushton asgjë më shumë. Përkthimi nuk është pjesë e gjurmës së idempotencës (kërkesa është, përfshirë
translate), kështu që riprovimi i një dërgimi pa përgjigje me të njëjtinIdempotency-Keyriluan mesazhin që ekziston tashmë në vend që të përkthejë e të dërgojë një të dytë. - Një mesazh i përkthyer që është në radhë ose i planifikuar është i ngrirë ndaj ndryshimeve të formulimit.
emails.reschedulee zhvendos gjithsesi; ndryshimi i asaj që thotë do të thotë ta anuloni dhe ta dërgoni sërish.
Bashkëngjitjet
content është base64 në rrjet. Jepni bajte dhe ato kodohen për ju.
from pathlib import Path from openemail.types import AttachmentInput attachments: list[AttachmentInput] = [ { 'filename': 'invoice.pdf', 'content': Path('invoice.pdf').read_bytes(), 'contentType': 'application/pdf', },]to_base64 eksportohet nëse ju duhet diku tjetër. Një str në content dërgohet ashtu siç është, ndaj duhet të jetë tashmë base64.