Kalo te dokumentacioni
PHP

Dërgoni një email

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

emails->send

send_email.php
$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' => new \SplFileInfo('invoice.pdf')]],    'threadId' => 'CAHk7pQ2x9LmZ4-mail.example.com',    'scheduledAt' => 'PT1H',    'tags' => ['order' => '4021'],    'tracking' => ['opens' => true, 'clicks' => true],]); echo $email['id'], ' ', $email['status'], PHP_EOL;

to, cc dhe bcc marrin një marrës ose një listë 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ë array me email dhe name.

Mesazhi është një array i vetëm me çelësa sipas emrave të fushave të API-së; prandaj replyTo dhe scheduledAt mbeten në camelCase, ndërsa idempotencyKey: dhe apiKey: janë argumente me emër të thirrjes dhe kurrë pjesë e mesazhit. Për të ndryshuar një fushë të një mesazhi që e ndërtuat më parë, shpërndajeni në një array të ri: $client->emails->send([...$message, 'subject' => 'Re: your invoice']) ruan çdo fushë tjetër dhe zëvendëson subjektin.

Parametrat

fromstring or arraye detyrueshme
Dërguesi. Një adresë e zhveshur, `Name <addr@host>` ose një array 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 hedh 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 or arraye detyrueshme
Një marrës ose një listë 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 or array
Numërohet te kufiri prej 50 marrësish.
bccstring 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 array
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.
templatearray
Përpunon në server një shabllon të ruajtur: një array me `id`, që merr një id ose një slug, dhe me `version` (një int), `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`.
headersarray
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
Një listë, ku çdo element është një array me `filename`, `content` dhe një `contentType` opsional, ose një array 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`. `content` është base64: një stream nga `fopen`, një `SplFileInfo` ose një stream PSR-7 lexohet dhe kodohet për ju, ndërsa një string duhet të jetë tashmë base64. 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.
scheduledAtDateTimeInterface or string
Një `DateTimeInterface`, 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ë string date pa orë, si `2027-01-01`, lexohet si mesnatë UTC e asaj dite, ndaj jepni një çast kur ora ka rëndësi.
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.
tagsarray
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ë.
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. Vendoseni 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.
trackingarray
Një array me `opens` dhe `clicks` opsionale, secili një bool: 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.
translatearray
Dërgojeni në gjuhën e marrësit: një array 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`.
idempotencyKeystring
Argument me emër i thirrjes, jo fushë e mesazhit. Ç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.
apiKeystring
Edhe ky është argument me emër. 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ë array me çelësa sipas emrave camelCase të API-së, 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 `getTracking`.
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 null
Ashtu siç u dërgua.
messageIdstring or null
Message-ID sipas RFC 5322. null 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 null
Thread-i te i cili u ul.
transportstring or null
Si u nis mesazhi. null deri në nisje.
attemptsint
Sa herë është provuar nisja.
lastErrorstring or null
Pse dështoi përpjekja e fundit, fjalë për fjalë.
scheduledAtstring or null
Çasti ISO 8601 kur duhet të niset.
cancellableUntilstring or null
Për sa kohë që tani është para këtij çasti, `cancel` funksionon ende.
sentAtstring or null
Çasti ISO 8601 kur u nis.
tagsarray
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.
replayedbool
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.
translationarray
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.php
$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'],]); print_r($email['translation'] ?? []);

Atëherë $email['translation'] mban language të barabartë me de, languageName me German, detectedSourceLanguage me en, dhe subject e includeOriginal të dyja 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.php
$preview = $client->emails->translate([    'subject' => 'Your September invoice',    'html' => '<p>Invoice attached. Payment is due on the 14th.</p>',    'to' => 'de',]); echo $preview['language']['native'], PHP_EOL, $preview['subject'], PHP_EOL, $preview['html'], PHP_EOL;echo 'Send it as it is? [y/N] '; $answer = fgets(STDIN); if ($answer !== false && strtolower(trim($answer)) === 'y') {    $client->emails->send([        'from' => '[email protected]',        'to' => '[email protected]',        'subject' => $preview['subject'],        'html' => $preview['html'],    ]);}
languages.php
use OpenEmail\Constants\Languages;use OpenEmail\OpenEmail; echo count(Languages::ALL), PHP_EOL; $current = $client->languages->list();echo count($current), PHP_EOL; echo OpenEmail::resolveLanguage('Deutsch')['code'] ?? 'none', PHP_EOL;echo OpenEmail::resolveLanguage('zh-TW')['code'] ?? 'none', PHP_EOL;echo OpenEmail::languageByCode('DE')['native'] ?? 'none', PHP_EOL;var_dump(OpenEmail::isRtlLanguage('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 bool(true). Tabela përfshihet në paketë, në rendin e përzgjedhësit, si OpenEmail\Constants\Languages::ALL, një listë array-sh 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 listë e thjeshtë, për një thirrës që preferon rreshtat aktualë në vend të atyre me të cilët erdhi ky version. OpenEmail::resolveLanguage() 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 null kur asgjë nuk përputhet, OpenEmail::languageByCode() përputh një kod të saktë pavarësisht shkronjave të mëdha a të vogla, dhe OpenEmail::isRtlLanguage() tregon nëse një gjuhë lexohet nga e djathta në të majtë, siç ndodh me gjashtëmbëdhjetë nga rreshtat. 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. Jepini klientit diçka që mund ta lexojë dhe ai i kodon bajtet për ju: një burim stream-i nga fopen, një SplFileInfo, ose një stream PSR-7 apo skedar i ngarkuar. Një string dërgohet ashtu siç është, ndaj duhet të jetë tashmë base64, që është ajo që bën OpenEmail::toBase64() me bajtet që mbani në memorie.

attachments.php
use OpenEmail\OpenEmail; $attachments = [    ['filename' => 'invoice.pdf', 'content' => OpenEmail::toBase64(file_get_contents('invoice.pdf')), 'contentType' => 'application/pdf'],    ['filename' => 'report.csv', 'content' => new \SplFileInfo('report.csv')],    ['filename' => 'contacts.csv', 'content' => fopen('contacts.csv', 'rb')],    ['fileId' => 'file_6bb640f5b99e47deb758f1f5'],]; $client->emails->send([    'from' => '[email protected]',    'to' => '[email protected]',    'subject' => 'Your documents',    'text' => 'All three are attached.',    'attachments' => $attachments,]);

Një content string që nuk është base64 hedh OpenEmail\Exception\InvalidArgumentException para se të dërgohet çfarëdo. Bajtet e papërpunuara që rastësisht lexohen si base64 do të dilnin të ngatërruara, ndaj mos i jepni kurrë bajtet e një skedari ashtu siç janë: mbështillini me OpenEmail::toBase64(), ose jepni vetë skedarin.

OpenEmail::toBase64() është aty nëse ju duhet i njëjti kodim diku tjetër. Merr një string bajtesh, një burim stream-i, një SplFileInfo ose një stream PSR-7 dhe kthen base64 pa ndërprerje rreshtash.