Dërgimi i një email-i
`emails.send`: një mesazh, tani ose më vonë.
emails.send
const email = await 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: pdfBytes }], 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ë objekt. Duhet të jetë një nga adresat si të cilat mund të dërgojë ky çelës. Nuk ka dërgues rezervë, sepse rezerva do të ishte adresa e parazgjedhur e hapësirës së punës, e cila ndryshon ndërsa adresat vijnë e shkojnë.
toRecipientInput | 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 | RecipientInput[]- Numërohet te kufiri prej 50 marrësish.
bccRecipientInput | 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.
subjectstring- Më së shumti 998 karaktere, kufiri i rreshtit sipas RFC 5322. Parazgjedhja është bosh.
htmlstring- Kërkohet një nga html, text, draftId ose template. HTML-ja është ajo që shohin marrësit kur jepen të dyja, html dhe text.
textstring- Pjesa me tekst të thjeshtë.
template{ id, version?, props?, slots? }- 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.
draftIdstring- Dërgoni një draft të ruajtur nën këtë zarf.
headersRecord<string, string>- `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.
attachmentsAttachmentInput[]- `{ filename, content, contentType? }`, ose `{ fileId }` që emërton një skedar që gjendet tashmë në hapësirën e punës. 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`.
threadIdstring- Përgjigjuni brenda një thread-i ekzistues. Transporti shkruan In-Reply-To dhe References.
scheduledAtDate | string- Një Date, 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.
cancellableForSecondsnumber- 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.
tagsRecord<string, string>- Deri në 10 etiketa, të kthyera ashtu siç janë dhe të filtrueshme. Kurrë të interpretuara.
signatureboolean- Nëse ky mesazh mban nënshkrimin e adresës nga e cila dërgohet, që është nënshkrimi i vetë asaj adrese ose përndryshe ai i caktuar për Të gjitha adresat. Parazgjedhja është true, sepse një nënshkrim i përket adresës dhe jo klientit që dërgoi mesazhin. Vendoseni `false` për mail-in që dërgon një program në emër të dikujt, si një faturë, një rivendosje fjalëkalimi ose një përmbledhje, asnjëra prej të cilave nuk e do firmën e një personi poshtë.
tracking{ opens?, clicks? }- Nëse të shtohet një piksel hapjeje dhe të rishkruhen lidhjet për këtë mesazh. I ndezur, veç nëse pronari i hapësirës së punës e ka fikur gjurmimin për adresën nga e cila dërgohet ose për Të gjitha adresat, dhe secila fushë e deklaruar këtu e vendos atë mesazh të vetëm sido që të jetë caktuar adresa.
translate{ to, from?, subject?, includeOriginal? }- 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ërgjigjja
idstring- Id-ja e dërgimit, `msg_…`. Përdoreni për `get`, `cancel`, `reschedule` dhe `getTracking`.
statusEmailStatus- queued, scheduled, sending, sent, partial, cancelled ose failed. Lexoni këtë dhe jo faktin që premtimi u zgjidh. `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.
mode'live' | 'test'- Cili lloj çelësi e dërgoi. Një dërgim test regjistrohet dhe nuk transmetohet kurrë.
fromstring- Adresa që u autorizua vërtet dhe që doli në rrjet, e cila nuk është gjithmonë ajo që u kërkua.
subjectstring | null- Ashtu siç u dërgua.
messageIdstring | null- 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.
threadIdstring | null- Thread-i te i cili u ul.
transportstring | null- Si u nis mesazhi. Null deri te nisja.
attemptsnumber- Sa herë është provuar nisja.
lastErrorstring | null- Pse dështoi përpjekja e fundit, fjalë për fjalë.
scheduledAtstring | null- Çasti ISO kur duhet të niset.
cancellableUntilstring | null- Përderisa tani është para kësaj, anulimi funksionon ende.
sentAtstring | null- Çasti ISO kur u nis.
tagsRecord<string, string>- Ajo që dërguat, e kthyer ashtu siç është.
sourceEmailSource- composer, api, mcp, ai ose queue: cila sipërfaqe e kërkoi. `api` është ky klient.
createdAtstring- Çasti ISO kur u shkrua regjistri.
replayedboolean- 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.
translationEmailTranslationResource | undefined- 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`. `{ language, languageName, detectedSourceLanguage, subject, 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.
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.
const email = await 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' },}) console.log(email.translation)// { language: 'de', languageName: 'German', detectedSourceLanguage: 'en', subject: true, includeOriginal: true }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.
const preview = await openemail.emails.translate({ subject: 'Your September invoice', html: '<p>Invoice attached. Payment is due on the 14th.</p>', to: 'de',}) console.log(preview.language.native, preview.detectedSourceLanguage) const approved = await showToSomebody(preview) await openemail.emails.send({ from: '[email protected]', to: '[email protected]', subject: approved.subject, html: approved.html,})import { LANGUAGES, isRtlLanguage, languageByCode, openemail, resolveLanguage } from '@openemail/sdk' LANGUAGES.length // 200 const current = await openemail.languages.list() resolveLanguage('Deutsch')?.code // 'de'resolveLanguage('zh-TW')?.code // 'zh-Hant'languageByCode('DE')?.native // 'Deutsch'isRtlLanguage('ar') // trueTabela vjen e bashkëngjitur në paketë, në rendin e zgjedhësit, kështu që një zgjedhës mund të mbushet para kërkesës së parë. languages.list() jep të njëjtët rreshta nga rrjeti si një array i thjeshtë, për një thirrës që i preferon ato aktualet nga ato me të cilat u dërgua ky version. resolveLanguage pranon një kod, një emër në anglisht, një endonim ose një alias (zh-TW është alias i një kodi që nuk listohet më), languageByCode 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,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.
attachments: [ { filename: 'invoice.pdf', content: pdfBytes, contentType: 'application/pdf' },]toBase64 është i eksportuar nëse ju duhet diku tjetër. Ai punon me copa, gjë që btoa(String.fromCharCode(...bytes)) nuk e bën. Ai i fundit dështon te çdo gjë mbi rreth 100 kB, dhe dështon te skedari i vërtetë e jo te ai me të cilin e provuat.