Pāriet uz dokumentāciju
SDK

Nosūtīt e-pastu

`emails.send`: viens ziņojums, tagad vai vēlāk.

emails.send

send-email.ts
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 un bcc pieņem vienu adresātu vai vairākus, un vienu pašu ietin jūsu vietā. Katrs var būt kaila adrese, Name <addr@host> vai { email, name }.

Parametri

fromRecipientInputobligāts
Sūtītājs. Tikai adrese, `Name <addr@host>` vai objekts. Tai jābūt tādai, kuras vārdā šī atslēga drīkst sūtīt. Rezerves sūtītāja nav, jo rezerve būtu darbvietas noklusējuma adrese, kas mainās, adresēm nākot un ejot.
toRecipientInput | RecipientInput[]obligāts
Viens adresāts vai vairāki; vienu pašu ietin jūsu vietā. Ne vairāk kā 50 laukos to, cc un bcc kopā.
ccRecipientInput | RecipientInput[]
Ieskaitās 50 adresātu ierobežojumā.
bccRecipientInput | RecipientInput[]
Nekad nav nosaukts baitos, ko saņem kāds cits, jo katram adresātam tiek pārraidīta sava aploksne.
replyToRecipientInput
Viena adrese, kas tiek sūtīta kā Reply-To galvene.
subjectstring
Ne vairāk kā 998 rakstzīmes, kas ir RFC 5322 rindas ierobežojums. Pēc noklusējuma tukšs.
htmlstring
Ir vajadzīgs viens no html, text, draftId vai template. HTML ir tas, ko adresāti redz, kad doti gan html, gan text.
textstring
Vienkārša teksta daļa.
template{ id, version?, props?, slots? }
Atveido saglabātu veidni servera pusē. `version` piesaista versiju; izlaidiet to, lai izmantotu to, kas ir publicēts pieprasījuma pieņemšanas brīdī. Nezināms vai trūkstošs prop ir 422, nevis tukša vieta ziņojumā.
draftIdstring
Nosūtiet saglabātu melnrakstu ar šo aploksni.
headersRecord<string, string>
`X-*`, `List-*`, Reply-To, Precedence, Auto-Submitted, Importance, Priority un Feedback-Id. Viss, ko transports iestata pats, tiek atteikts, nevis klusi nomests.
attachmentsAttachmentInput[]
`{ filename, content, contentType? }` vai `{ fileId }`, kas nosauc darbvietā jau esošu failu. Padodiet saturam baitus, un tie tiek base64 iekodēti jūsu vietā. 20 faili, ar iekļautajiem failiem kopā līdz 5 MB pēc atkodēšanas. Saglabāts fails var būt lielāks un ceļo kā lejupielādes saite.
attachmentDeliveryAttachmentDeliveryMode
`mime`, `link` vai `auto`. `auto` nes failus kā lejupielādes saites, tiklīdz tie pārsniedz 2 MB uz domēna ar aktīvu failu domēnu, un citādi — ziņojuma iekšienē. Ja izlaists, tiek piemērots pastkastes iestatījums, un tas pēc noklusējuma ir `auto`.
threadIdstring
Atbilde esošā pavedienā. Transports uzraksta In-Reply-To un References.
scheduledAtDate | string
Date, ISO-8601 brīdis vai ilgums, piemēram, `PT1H`. Līdz gadam uz priekšu, nekad pagātnē. Nevar apvienot ar cancellableForSeconds.
cancellableForSecondsnumber
No 0 līdz 900. Atsaukšanas logs tūlītējam sūtījumam: rakstīšanas loga atsaukšanas mehānisms, padarīts pieejams, nevis iekodēts.
tagsRecord<string, string>
Līdz 10 birkām, atspoguļotas atpakaļ un filtrējamas. Nekad netiek interpretētas.
signatureboolean
Vai šis ziņojums nes tās adreses parakstu, no kuras tas tiek sūtīts, proti, šīs adreses pašas parakstu vai citādi to, kas iestatīts Visām adresēm. Pēc noklusējuma true, jo paraksts pieder adresei, nevis tam klientam, kas ziņojumu nosūtīja. Iestatiet `false` pastam, ko programma sūta kāda vārdā, piemēram, kvītij, paroles atiestatīšanai vai kopsavilkumam, no kuriem nevienam nevajag cilvēka parakstu apakšā.
tracking{ opens?, clicks? }
Vai šim ziņojumam pievienot atvēršanas pikseli un pārrakstīt saites. Ieslēgts, ja vien darbvietas īpašnieks nav izslēdzis izsekošanu adresei, no kuras tas tiek sūtīts, vai Visām adresēm, un jebkurš šeit norādīts lauks izšķir šo vienu ziņojumu neatkarīgi no tā, kā iestatīta adrese.
translate{ to, from?, subject?, includeOriginal? }
Sūtiet to adresāta valodā. `to` pieņem kodu, angļu nosaukumu vai pašas valodas nosaukumu; `subject` un `includeOriginal` abi pēc noklusējuma ir true. Atrisināts, kad pieprasījums tiek pieņemts, tāpēc plānots ziņojums nes tos vārdus, kas tika apstiprināti. Atteikts līdzās `draftId`.

Atbilde

idstring
Sūtījuma id, `msg_…`. Izmantojiet to izsaukumiem `get`, `cancel`, `reschedule` un `getTracking`.
statusEmailStatus
queued, scheduled, sending, sent, partial, cancelled vai failed. Lasiet šo, nevis paļaujieties uz to, ka solījums atrisinājās. `partial` ir atsevišķs stāvoklis: daži adresāti to ir saņēmuši, un nosūtīšanu nevar atsaukt, tāpēc atkārtot ir nepareizi, bet ziņot par neveiksmi ir meli.
mode'live' | 'test'
Kāda veida atslēga to nosūtīja. Testa sūtījums tiek reģistrēts un nekad netiek pārraidīts.
fromstring
Adrese, kas patiešām tika autorizēta un nosūtīta tīklā, un tā ne vienmēr ir tā, kura tika prasīta.
subjectstring | null
Kā nosūtīts.
messageIdstring | null
RFC 5322 Message-ID. Null, kamēr MIME nepastāv. Sūtīšanas pakalpojums galveni ceļā pārraksta, tāpēc neviena atteikuma vēstule vai piegādes atskaite šo vērtību nenes. `id` ir tas, ar ko atgriežas notikums.
threadIdstring | null
Pavediens, kurā tas nonāca.
transportstring | null
Kā ziņojums aizgāja. Null līdz nosūtīšanai.
attemptsnumber
Cik reižu nosūtīšana ir mēģināta.
lastErrorstring | null
Kāpēc pēdējais mēģinājums neizdevās, burtiski.
scheduledAtstring | null
ISO brīdis, kad tam jāaiziet.
cancellableUntilstring | null
Kamēr pašreizējais brīdis ir pirms šī, atcelšana vēl darbojas.
sentAtstring | null
ISO brīdis, kad tas aizgāja.
tagsRecord<string, string>
Tas, ko nosūtījāt, atspoguļots atpakaļ.
sourceEmailSource
composer, api, mcp, ai vai queue: kura virsma pieprasīja. `api` ir šis klients.
createdAtstring
ISO brīdis, kad ieraksts tika izveidots.
replayedboolean
True, kad Idempotency-Key sakrita ar jau esošu sūtījumu. Nekas jauns netika nosūtīts, un šis ir sākotnējais ziņojums.
translationEmailTranslationResource | undefined
Klāt tikai ziņojumam, kas tika tulkots, un tikai tur, kur tiek nests viss saglabātais pieprasījums: šajā atbildē un `get`. `{ language, languageName, detectedSourceLanguage, subject, includeOriginal }`, visur kodi, nevis valodu rindas. Saraksta rindā tā nekad nav, tāpēc tās neesamība tur neko nepasaka.

Adresāta valodā

translate uzraksta ziņojumu kāda cita valodā, pirms tas aiziet. Pamatteksts un, ja vien to neizslēdzat, arī temats tiek iztulkots, kad API pieprasījumu pieņem, un aiziet tieši tas, kas iznāca: tulkojums, ko nevarēja izveidot, sūtījumu atsaka, nevis izsūta to valodā, kurā rakstījāt.

translate.ts
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 }

Neviens to neizlasīja, pirms tas aizgāja. emails.translate ir tas pats gājiens, apturēts vienu soli agrāk. Parādiet rezultātu cilvēkam, ļaujiet to izmainīt un tad nosūtiet apstiprināto, izsaukumā translate vairs nenorādot. Tā norādīšana vēlreiz tulkotu otrreiz un izmestu cilvēka labojumus.

preview-translation.ts
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,})
render-picker.ts
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') // true

Tabula ir iekļauta pakotnē atlasītāja secībā, tāpēc atlasītāju var aizpildīt jau pirms pirmā pieprasījuma. languages.list() atrisinās par tām pašām rindām no tīkla kā vienkāršs masīvs tam, kurš labāk grib pašreizējās, nevis tās, ar kurām šī versija tika izlaista. resolveLanguage pieņem kodu, angļu nosaukumu, endonīmu vai aizstājvārdu (zh-TW ir aizstājvārds kodam, kas vairs nav sarakstā), languageByCode sakrīt ar precīzu kodu neatkarīgi no reģistra, un sešpadsmit no rindām ir rakstāmas no labās uz kreiso. Meklējiet native, label un code kopā, rādiet native pirmo un glabājiet kodu.

emails.translate netiek atkārtots automātiski. Tas tērē modeļa izsaukumus un neko neraksta, tāpēc nav ko padarīt idempotentu, un atkārtojums pēc neatbildēta pieprasījuma tikai nopirktu to pašu atbildi divreiz.

  • Valoda, kas neatrisinās ne uz ko, ir validation_error uz translate.to, pirms kaut kas ir nosūtīts.
  • translation_too_long virs 30 000 rakstzīmēm, translation_not_configured, kad instalācijai nav konfigurēts AI, translation_failed, kad piegādātājs neatbildēja. Neviens no tiem kā rezerves variantu neizsūta ziņojumu neiztulkotu.
  • Darbojas ar template: tiek tulkots ATVEIDOTAIS rezultāts, tāpēc viens saglabāts pamatteksts kalpo katrai valodai, kurā lasa jūsu klienti. Veidne, kas atveido veselu dokumentu, patur savu doctype, <style> blokus un @font-face noteikumus: modelim aiziet tikai pamatteksts, un pārējais tiek uzlikts atpakaļ apkārt. Tās <title> tiek atstāts neskarts, un to tāpat nekas nerāda.
  • Atkārtojums neko papildus nemaksā. Tulkojums nav daļa no idempotences nospieduma (pieprasījums gan ir, ieskaitot translate), tāpēc neatbildēta sūtījuma atkārtošana ar to pašu Idempotency-Key atkārto jau esošo ziņojumu, nevis tulko un sūta otru.
  • Tulkots ziņojums, kas ir rindā vai ieplānots, ir iesaldēts pret formulējuma izmaiņām. emails.reschedule to joprojām pārvieto; mainīt tā saturu nozīmē atcelt un sūtīt no jauna.

Pielikumi

content tīklā ir base64. Padodiet baitus, un tie tiek iekodēti jūsu vietā.

attachment.ts
attachments: [  { filename: 'invoice.pdf', content: pdfBytes, contentType: 'application/pdf' },]

toBase64 ir eksportēts, ja tas vajadzīgs kur citur. Tas apstrādā pa gabaliem, ko btoa(String.fromCharCode(...bytes)) nedara. Tas izgāžas uz jebko lielāku par aptuveni 100 kB, un tas izgāžas uz īstā faila, nevis uz tā, ar kuru testējāt.