Kalo te dokumentacioni
Ruby

Dërgoni një email

`emails.send`: një mesazh, tani ose më vonë.

emails.send

send_email.rb
email = client.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: Pathname("invoice.pdf")}],  threadId: "CAHk7pQ2x9LmZ4-mail.example.com",  scheduledAt: "PT1H",  tags: {order: "4021"},  tracking: {opens: true, clicks: true}) puts email[:id], email[:status]

to, cc dhe bcc marrin një marrës ose një Array marrësish, dhe një marrës i vetëm mbështillet për ju. Secili mund të jetë një adresë e zhveshur, Name <addr@host> ose një Hash me email dhe name.

Mesazhi jepet si argumente me fjalë kyçe ose si një Hash i vetëm. Argumentet me fjalë kyçe pranë një Hash-i bashkohen në të dhe kanë përparësi kur të dyja emërtojnë një fushë, ndaj client.emails.send(message, subject: "Re: your invoice") ndryshon një fushë të një mesazhi që e ndërtuat më parë. Çelësat ruajnë emrat e API-së; prandaj replyTo dhe scheduledAt mbeten në camelCase, ndërsa idempotency_key: dhe api_key: janë opsione të thirrjes dhe kurrë pjesë e mesazhit.

Parametrat

fromString or Hashe detyrueshme
Dërguesi. Një adresë e zhveshur, `Name <addr@host>` ose një Hash me `email` dhe `name`. Duhet të jetë një adresë në emër të së cilës ky çelës mund të dërgojë, përndryshe thirrja ngre një 403 `from_address_forbidden`. Nuk ka dërgues rezervë, ndaj një dërgim e emërton gjithmonë adresën me të cilën del.
toString, Hash or Arraye detyrueshme
Një marrës ose një Array marrësish, dhe një marrës i vetëm mbështillet për ju. Më së shumti 50 gjithsej në `to`, `cc` dhe `bcc`, dhe më shumë jep një 422 `too_many_recipients`.
ccString, Hash or Array
Numërohet te kufiri prej 50 marrësish.
bccString, Hash or Array
Nuk përmendet kurrë në bajtet që merr dikush tjetër, sepse për çdo marrës transmetohet një zarf më vete. Llogaritet edhe ai te kufiri prej 50.
replyToString or Hash
Një adresë e vetme, e dërguar si header-i Reply-To.
subjectString
Më së shumti 998 karaktere, kufiri i rreshtit sipas RFC 5322. Si parazgjedhje është bosh, dhe një temë bosh zëvendësohet me atë të shabllonit ose të draftit.
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`. Më së shumti 1.000.000 karaktere.
textString
Pjesa me tekst të thjeshtë, më së shumti 1.000.000 karaktere.
templateHash
Përpunon në server një shabllon të ruajtur: një Hash me `id`, që merr një id ose një slug, dhe me `version` (një Integer), `props` dhe `slots` opsionale. `version` fikson një rishikim. Lëreni jashtë për të përdorur atë që është publikuar kur pranohet kërkesa. Një prop i panjohur ose që mungon jep një 422 dhe jo një boshllëk në mesazh.
draftIdString
Dërgoni një draft të ruajtur nën këtë zarf, ashtu siç u shkrua. Nuk mund të kombinohet me `template` ose `translate`.
headersHash
Emër header-i drejt një vlere String, i kufizuar te `X-*`, `List-*`, Reply-To, Precedence, Auto-Submitted, Importance, Priority dhe Feedback-ID. Çdo gjë që e vendos vetë transporti refuzohet me një 422 `reserved_header` në vend që të hidhet në heshtje.
attachmentsArray<Hash>
Secila është një Hash me `filename`, `content` dhe një `contentType` opsional, ose një Hash vetëm me `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. Deri në 20 skedarë, me skedarët inline të kufizuar në 5 MB gjithsej pas dekodimit. Një skedar i ruajtur mund të jetë më i madh dhe udhëton si lidhje shkarkimi.
attachmentDeliveryString
`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.
scheduledAtTime, DateTime or String
Një Time ose një DateTime, i dërguar si çast ISO 8601 në UTC, një çast ISO 8601 si String, ose një kohëzgjatje si `PT1H`. Deri në një vit përpara, kurrë në të kaluarën. Nuk mund të kombinohet me `cancellableForSeconds`. Një Date e Ruby-t dërgohet si datë e zhveshur, që API-ja e lexon si mesnatë UTC të asaj dite, ndaj jepni një Time kur ora ka rëndësi.
cancellableForSecondsInteger
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.
tagsHash
Deri në 10 etiketa, me çelësa nga 1 deri në 64 shkronja, shifra, `_` ose `-` dhe vlera String deri në 256 karaktere. Kthehen ashtu siç janë në çdo lexim dhe nuk interpretohen kurrë.
signatureBoolean
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ë. Dërgimet me shabllon dhe dërgimet e enkriptuara nuk mbartin kurrë nënshkrim.
trackingHash
Një Hash me Boolean opsionale `opens` dhe `clicks`: 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 secili çelës i deklaruar këtu e vendos atë mesazh të vetëm, sido që të jetë konfiguruar adresa.
translateHash
Dërgojeni në gjuhën e marrësit: një Hash me `to` dhe me `from`, `subject` e `includeOriginal` opsionale. `to` merr një kod, një emër në anglisht ose emrin e gjuhës në vetë atë gjuhë, dhe `subject` e `includeOriginal` janë të dyja true si parazgjedhje. Përcaktohet kur pranohet kërkesa, ndaj një mesazh i planifikuar mbart fjalët që u miratuan. Refuzohet bashkë me `draftId`.
idempotency_keyString
Çelësi juaj për këtë dërgim, nga 1 deri në 255 karaktere: shkronja, shifra, `_`, `.`, `:` ose `-`. Pa të, klienti gjeneron një çelës për çdo thirrje, ndaj riprovat e tij nuk dërgojnë kurrë dy herë, dhe me të, një dërgim që ekzekutohet sërish në një proces tjetër riluhet në vend që të përsëritet.
api_keyString
Dërgon me këtë çelës në vend të atij të klientit, për një proces që dërgon në emër të disa hapësirave të punës.

Përgjigje

Një Hash me çelësa Symbol, ndaj email[:status] lexon statusin.

idString
Id-ja e dërgimit: `msg_` e ndjekur nga 24 karaktere heksadecimale. Përdoreni për `get`, `cancel`, `reschedule` dhe `get_tracking`.
statusString
queued, scheduled, sending, sent, partial, bounced, cancelled ose failed. Lexoni këtë dhe jo faktin që thirrja u kthye: një dërgim i menjëhershëm niset brenda kërkesës dhe zakonisht kthehet si `sent`, `partial` ose `failed`, ndërsa një dërgim i mbajtur kthehet si `queued` ose `scheduled`. `partial` është një gjendje më vete: disa marrës e kanë mesazhin dhe nuk mund t’u hiqet, pra riprovimi është i gabuar dhe raportimi i dështimit është gënjeshtër.
modeString
`live` ose `test`: cili lloj çelësi e dërgoi. Një dërgim testimi regjistrohet dhe nuk transmetohet kurrë. Shfaqet si `sent`, me `transport` të barabartë me `test`, ndaj bëni pohimet mbi përgjigjen dhe jo mbi një kuti postare.
fromString
Adresa që u autorizua vërtet dhe që doli në rrjet, e cila nuk është gjithmonë ajo që u kërkua.
subjectString or nil
Ashtu siç u dërgua.
messageIdString or nil
Message-ID sipas RFC 5322. nil derisa të ekzistojë MIME-ja. Shërbimi i dërgimit e rishkruan header-in në dalje, ndaj asnjë kthim apo raport dërgese nuk e mbart këtë vlerë. Një ngjarje kthehet me `id`.
threadIdString or nil
Thread-i te i cili u ul.
transportString or nil
Si u nis mesazhi. nil deri në nisje.
attemptsInteger
Sa herë është provuar nisja.
lastErrorString or nil
Pse dështoi përpjekja e fundit, fjalë për fjalë.
scheduledAtString or nil
Çasti ISO 8601 kur duhet të niset.
cancellableUntilString or nil
Për sa kohë që tani është para këtij çasti, `cancel` funksionon ende.
sentAtString or nil
Çasti ISO 8601 kur u nis.
tagsHash
Ajo që dërguat, e kthyer ashtu siç është.
sourceString
composer, api, mcp, ai ose queue: cila sipërfaqe e kërkoi. `api` është ky klient.
createdAtString
Çasti ISO 8601 kur u shkrua regjistri.
replayedBoolean
True kur një Idempotency-Key përputhej me një dërgim që ekzistonte tashmë. Nuk u dërgua asgjë e re, dhe ky është mesazhi origjinal siç është tani.
translationHash
I pranishëm vetëm te një mesazh që u përkthye, dhe vetëm aty ku mbartet e gjithë kërkesa e ruajtur: në këtë përgjigje dhe te `get`. Mban `language`, `languageName`, `detectedSourceLanguage`, `subject` dhe `includeOriginal`, me kode në vend të rreshtave të plotë të gjuhëve. Një rresht liste nuk e ka kurrë, ndaj mungesa e tij aty nuk tregon asgjë.

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.

translate.rb
email = client.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"}) p email[:translation]

Atëherë email[:translation] lexon {language: "de", languageName: "German", detectedSourceLanguage: "en", subject: true, includeOriginal: true}.

Askush nuk e lexoi atë para se të nisej. emails.translate është e njëjta vajtje-ardhje e 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 tekstin për herë të dytë dhe do t’i hidhte poshtë redaktimet e tij.

preview_translation.rb
preview = client.emails.translate(  subject: "Your September invoice",  html: "<p>Invoice attached. Payment is due on the 14th.</p>",  to: "de") puts preview.dig(:language, :native), preview[:subject], preview[:html]print "Send it as it is? [y/N] " if $stdin.gets.to_s.strip.casecmp?("y")  client.emails.send(    from: "[email protected]",    to: "[email protected]",    subject: preview[:subject],    html: preview[:html]  )end
languages.rb
p OpenEmail::LANGUAGES.size current = client.languages.listp current.size p OpenEmail.resolve_language("Deutsch")&.fetch(:code)p OpenEmail.resolve_language("zh-TW")&.fetch(:code)p OpenEmail.language_by_code("DE")&.fetch(:native)p OpenEmail.rtl_language?("ar")

Këto rreshta printojnë 200, rreshtat me të cilët vjen ky version, pastaj sa mban API-ja tani, pastaj "de", "zh-Hant", "Deutsch" dhe true. Tabela përfshihet në gem, në rendin e përzgjedhësit, si OpenEmail::LANGUAGES, një Array i ngrirë Hash-esh me code, label, native, flag dhe rtl, ndaj një përzgjedhës mund të mbushet para kërkesës së parë. languages.list kthen të njëjtët rreshta nga rrjeti si Array i thjeshtë, për një thirrës që preferon rreshtat aktualë në vend të atyre me të cilët erdhi ky version. OpenEmail.resolve_language merr një kod, një emër në anglisht, një endonim ose një pseudonim (zh-TW është pseudonim i një kodi që nuk listohet më) dhe kthen nil kur asgjë nuk përputhet, OpenEmail.language_by_code përputh një kod të saktë pavarësisht shkronjave të mëdha a të vogla, dhe gjashtëmbëdhjetë nga rreshtat shkruhen nga e djathta në të majtë. Kërkoni njëkohësisht te native, label dhe code, tregoni së pari native 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ë API-ja nuk mund ta përputhë jep një validation_error te translate.to, para se të dërgohet çfarëdo.
  • translation_too_long mbi 30.000 karaktere, translation_not_configured kur instalimi nuk ka AI të konfiguruar, një 429 ai_quota_exceeded kur hapësira e punës i ka përdorur veprimet e AI-së për sot (rivendoset në mesnatë UTC dhe nuk riprovohet), translation_failed kur 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ëjtin Idempotency-Key riluan 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 e ruan tekstin e miratuar. emails.reschedule e zhvendos ende, ndërsa emails.update e refuzon një tekst të ri me një 409 translation_locked, ndaj ndryshimi i asaj që thotë do të thotë anulim dhe dërgim nga e para.

Bashkëngjitjet

content është base64 në rrjet. Jepni bajtet dhe ato kodohen për ju: një String binar si ai që kthen File.binread, një IO si një File i hapur, ose një Pathname, që lexohet për ju.

attachments.rb
attachments = [  {filename: "invoice.pdf", content: File.binread("invoice.pdf"), contentType: "application/pdf"},  {filename: "report.pdf", content: Pathname("report.pdf")},  {fileId: "file_6bb640f5b99e47deb758f1f5"}] client.emails.send(  from: "[email protected]",  to: "[email protected]",  subject: "Your documents",  text: "Both are attached.",  attachments:)

Një String i shënuar si tekst, si ai që kthen File.read, merret si base64 tashmë, dhe një String që nuk është base64 ngre ArgumentError para se të dërgohet çfarëdo. Lexojini skedarët me File.binread, ose thërrisni .b mbi bajtet që mbërritën të shënuara si tekst.

OpenEmail.to_base64 është aty nëse ju duhet i njëjti kodim diku tjetër. Merr një String binar, një IO ose një Pathname dhe kthen base64 strikt, pa ndërprerje rreshtash.