Kas yra SendGrid ir kam jis reikalingas
Kai kuriate aplikaciją, kuri turi siųsti el. laiškus – nesvarbu, ar tai būtų registracijos patvirtinimai, slaptažodžių atkūrimas, ar pranešimai apie užsakymus – greičiausiai susidursite su klausimu: kaip tai padaryti patikimai? Galite, žinoma, sukonfigūruoti savo SMTP serverį, bet tai panašu į bandymą išrasti dviratį iš naujo. Čia ir ateina į pagalbą SendGrid – vienas populiariausių transakcinio el. pašto sprendimų rinkoje.
SendGrid yra debesų paslaugų teikėjas, specializuojantis el. pašto pristatyme. Jie rūpinasi visa ta nemalonia infrastruktūra, IP adresų reputacija, pristatymo optimizavimu ir kitais dalykais, dėl kurių paprastai galvos skauda. Jūs tiesiog siunčiate užklausą per jų API, o jie pasirūpina, kad laiškas pasiektų gavėją.
Įmonė buvo įkurta 2009 metais ir 2019-aisiais tapo Twilio dalimi. Per tą laiką jie sukaupė solidžią patirtį – kasdien per jų sistemą praeina milijardai laiškų. Tai reiškia, kad jie tikrai žino, ką daro.
API integracijos pradžia
Pradėti naudoti SendGrid API tikrai nesudėtinga. Pirmiausia reikia užsiregistruoti jų platformoje ir gauti API raktą. Tai daroma per kelias minutes – einate į Settings > API Keys ir sukuriate naują raktą. Svarbu: išsaugokite jį saugiai, nes vėliau nebematysite pilnos rakto reikšmės.
SendGrid siūlo kelis integracijos būdus. Galite naudoti jų oficialias bibliotekas Python, Node.js, PHP, Ruby, Go, C# ir kitiems kalboms, arba tiesiog siųsti HTTP užklausas rankiniu būdu. Aš paprastai rekomenduoju naudoti oficialias bibliotekas – jos sutvarko daug smulkmenų už jus ir yra gerai dokumentuotos.
Štai kaip atrodo paprasčiausias pavyzdys su Python:
„`python
import sendgrid
from sendgrid.helpers.mail import Mail
sg = sendgrid.SendGridAPIClient(api_key=’JŪSŲ_API_RAKTAS’)
message = Mail(
from_email=’[email protected]’,
to_emails=’gavė[email protected]’,
subject=’Testas’,
html_content=’Labas, tai testinis laiškas!‘
)
response = sg.send(message)
print(response.status_code)
„`
Jei viskas gerai, gausite 202 statuso kodą, kuris reiškia, kad SendGrid priėmė jūsų laišką apdorojimui. Pastebėkite – tai nereiškia, kad laiškas jau pristatytas, tik kad jis įtrauktas į eilę.
Šablonų sistema ir dinaminis turinys
Vienas iš dalykų, kuris man labiausiai patinka SendGrid platformoje, yra jų šablonų sistema. Vietoj to, kad HTML kodą rašytumėte tiesiai aplikacijos kode, galite sukurti šablonus SendGrid sąsajoje ir juos pakartotinai naudoti.
Šablonai palaiko dinaminius kintamuosius, kuriuos galite perduoti per API. Pavyzdžiui, sukuriate šabloną su tokiu turiniu:
„`html
Sveiki, {{vardas}}!
Jūsų užsakymas #{{uzsakymo_nr}} buvo sėkmingai apdorotas.
„`
O tada kode tiesiog perduodate reikšmes:
„`python
message = Mail(
from_email=’[email protected]’,
to_emails=’[email protected]’
)
message.template_id = ‘d-1234567890abcdef’
message.dynamic_template_data = {
‘vardas’: ‘Jonas’,
‘uzsakymo_nr’: ‘12345’
}
„`
Tai labai patogu, nes dizaineriai gali redaguoti šablonus be programuotojų pagalbos, o jūs nereikia perkompiliuoti aplikacijos kiekvieną kartą, kai reikia pakeisti laiško tekstą. Be to, SendGrid sąsaja turi įmontuotą šablonų peržiūrą ir testinių laiškų siuntimą.
Priedų siuntimas ir sudėtingesni scenarijai
Kartais reikia išsiųsti ne tik tekstą, bet ir priedus – PDF sąskaitas faktūras, CSV ataskaitas ar kitus failus. SendGrid tai palaiko be problemų, nors reikia šiek tiek daugiau kodo.
Priedai perduodami kaip base64 užkoduoti stringai. Štai pavyzdys:
„`python
import base64
from sendgrid.helpers.mail import Attachment, FileContent, FileName, FileType
with open(‘saskaita.pdf’, ‘rb’) as f:
data = f.read()
encoded = base64.b64encode(data).decode()
attachment = Attachment()
attachment.file_content = FileContent(encoded)
attachment.file_type = FileType(‘application/pdf’)
attachment.file_name = FileName(‘saskaita.pdf’)
message.attachment = attachment
„`
Vienas dalykas, kurį svarbu žinoti – SendGrid turi 30 MB limitą vienam laiškui, įskaitant visus priedus. Jei jums reikia siųsti didesnius failus, geriau įkelkite juos kur nors į debesį ir atsiųskite tik nuorodą.
Dar viena naudinga funkcija – galimybė siųsti laiškus keliems gavėjams vienu metu, bet taip, kad kiekvienas gautų personalizuotą versiją. Tai daroma naudojant „personalizations” objektą. Taip galite siųsti skirtingus šablonus ar skirtingus dinaminius duomenis kiekvienam gavėjui, bet visa tai vyksta viena API užklausa.
Webhook’ai ir pristatymo sekimas
Vienas iš svarbiausių dalykų transakciniame el. pašte – žinoti, kas nutiko su jūsų laišku. Ar jis buvo pristatytas? Ar gavėjas jį atidarė? Ar paspaudė ant nuorodos? SendGrid visa tai seka ir gali pranešti jums per webhook’us.
Webhook’ai – tai HTTP užklausos, kurias SendGrid siunčia į jūsų serverį, kai įvyksta tam tikri įvykiai. Jūs tiesiog nurodote savo endpoint’ą SendGrid nustatymuose, ir jie pradės siųsti POST užklausas su informacija apie įvykius.
Štai kokius įvykius galite sekti:
- Processed – laiškas priimtas į sistemą
- Delivered – laiškas sėkmingai pristatytas
- Opened – gavėjas atidarė laišką
- Clicked – paspaudė ant nuorodos laiške
- Bounced – laiškas atmestas (hard bounce arba soft bounce)
- Dropped – SendGrid atmetė laišką (pvz., dėl blogas el. pašto adresas)
- Spam report – gavėjas pažymėjo kaip šlamštą
- Unsubscribe – gavėjas atsisakė prenumeratos
Webhook’ų apdorojimas gali atrodyti maždaug taip (Flask pavyzdys):
„`python
from flask import Flask, request
import json
app = Flask(__name__)
@app.route(‘/sendgrid-webhook’, methods=[‘POST’])
def handle_webhook():
events = request.json
for event in events:
event_type = event.get(‘event’)
email = event.get(’email’)
timestamp = event.get(‘timestamp’)
if event_type == ‘delivered’:
# Atnaujinkite savo duomenų bazę
print(f”Laiškas pristatytas: {email}”)
elif event_type == ‘bounce’:
# Pažymėkite el. paštą kaip negaliojantį
print(f”Bounce: {email}”)
return ”, 200
„`
Svarbu: SendGrid webhook’ai negarantuoja užklausų tvarkos ir gali siųsti dublikatus, todėl jūsų kodas turi būti idempotentiškas. Taip pat rekomenduoju patikrinti webhook’ų autentiškumą – SendGrid leidžia nustatyti paslapties raktą, kurį jie įtrauks į užklausas.
Kainodara ir limitai
SendGrid turi nemokamą planą, kuris leidžia siųsti iki 100 laiškų per dieną. Tai puiku testavimui ar labai mažiems projektams, bet rimtesnei aplikacijai greičiausiai reikės mokamo plano.
Mokamų planų kainos prasideda nuo apie 15 USD per mėnesį už 40,000 laiškų. Tai gana konkurencinga kaina, palyginus su kitais sprendimais. Jei jums reikia daugiau, kaina mažėja proporcingai – kuo daugiau laiškų, tuo pigiau kiekvienas laiškas.
Vienas dalykas, kurį reikia turėti omenyje – SendGrid turi rate limiting. Nemokamame plane galite siųsti tik 100 laiškų per dieną, bet net mokamame plane yra apribojimai, kiek greitai galite siųsti. Paprastai tai apie 600 laiškų per sekundę vienam API raktui, bet praktikoje retai kada pasieksite šį limitą.
Jei viršijate limitą, gausite 429 HTTP klaidos kodą. Geras praktika – implementuoti retry logiką su exponential backoff. Daugelis oficialių bibliotekų tai daro automatiškai.
Saugumas ir geriausia praktika
Dirbant su el. pašto API, saugumas yra kritiškai svarbus. Štai keletas dalykų, į kuriuos tikrai verta atkreipti dėmesį:
API raktų valdymas – niekada nekiškite API raktų tiesiai į kodą. Naudokite aplinkos kintamuosius arba secrets management sistemas. Jei netyčia commit’insite API raktą į Git, nedelsiant jį pakeiskite. SendGrid leidžia sukurti kelis API raktus su skirtingomis teisėmis – naudokite tai, kad suteiktumėte tik būtinas teises.
Siuntėjo autentifikacija – būtinai sukonfigūruokite SPF, DKIM ir DMARC įrašus savo domenui. Tai padės užtikrinti, kad jūsų laiškai nepatektų į spam aplanką. SendGrid turi puikius vedlius, kaip tai padaryti, bet jums reikės prieigos prie DNS nustatymų.
Unsubscribe funkcionalumas – jei siunčiate marketingo laiškus (ne tik transakcinio), privalote turėti aiškų būdą atsisakyti prenumeratos. SendGrid turi įmontuotą unsubscribe valdymą, bet galite ir patys jį implementuoti.
Rate limiting savo pusėje – net jei SendGrid leidžia siųsti daug laiškų greitai, tai nereiškia, kad turėtumėte. Staigus didelis laiškų srautas gali sukelti įtarimą pas el. pašto teikėjus ir pakenkti jūsų reputacijai. Geriau paskirstyti siuntimą per tam tikrą laiką.
Dar vienas patarimas – stebėkite savo bounce rate ir spam complaint rate. Jei šie rodikliai per aukšti, SendGrid gali laikinai sustabdyti jūsų paskyrą. Paprastai norite išlaikyti bounce rate žemiau 5% ir spam complaint rate žemiau 0.1%.
Alternatyvos ir kada rinktis SendGrid
SendGrid nėra vienintelis žaidėjas šioje rinkoje. Yra ir kitų populiarių sprendimų – Mailgun, Amazon SES, Postmark, Mandrill. Kiekvienas turi savo privalumų ir trūkumų.
Amazon SES yra pigiausias variantas, jei jau naudojate AWS infrastruktūrą. Bet jų sąsaja nėra tokia intuityvi, ir jums reikės daugiau rankų darbo su IP reputacija ir pristatymo optimizavimu.
Postmark orientuotas būtent į transakcinio el. pašto pristatymą ir turi puikią pristatymo statistiką. Jie šiek tiek brangesni, bet jų palaikymas tikrai geras.
Mailgun labai panašus į SendGrid funkcionalumu ir kaina. Dažnai pasirinkimas tarp šių dviejų yra tiesiog asmeninių preferencijų klausimas.
SendGrid yra geras pasirinkimas, jei:
– Jums reikia patikimo sprendimo su gera dokumentacija
– Norite turėti ir transakcinio, ir marketingo el. pašto funkcionalumą vienoje platformoje
– Vertinate gerą API ir oficialių bibliotekų palaikymą
– Jums svarbi detalė statistika ir webhook’ai
Galbūt verta ieškoti alternatyvų, jei:
– Jūsų biudžetas labai ribotas (SES pigiau)
– Jums reikia tik transakcinio el. pašto ir maksimalaus pristatymo greičio (Postmark)
– Jau turite daug AWS infrastruktūros (SES integruojasi sklandžiau)
Ką dar reikia žinoti prieš pradedant
Baigiant šį straipsnį, noriu pasidalinti keliais dalykais, kuriuos pats išmokau sunkiu būdu. Pirma – warming up. Jei tik pradėjote naudoti SendGrid ir iš karto bandysite išsiųsti tūkstančius laiškų, greičiausiai didelė dalis jų pateks į spam. Reikia laipsniškai didinti siuntimo apimtis, kad el. pašto teikėjai priprastų prie jūsų siuntimo modelio.
Antra – testuokite viską development aplinkoje. SendGrid turi sandbox režimą, kuris leidžia testuoti API integracijas be realių laiškų siuntimo. Tai labai patogu, kai kuriate naują funkcionalumą.
Trečia – sekite savo statistiką. SendGrid suteikia daug duomenų apie jūsų laiškų pristatymą, atidarymus, paspaudimus. Naudokite šią informaciją, kad optimizuotumėte savo laiškus. Jei matote, kad tam tikro tipo laiškai turi žemą atidarymo rodiklį, galbūt reikia pakeisti subject line ar siuntimo laiką.
Dar vienas dalykas – būkite pasirengę klaidoms. El. pašto pristatymas nėra 100% patikimas – visada bus bounce’ų, laikinų klaidų, serverių, kurie neatsako. Jūsų kodas turi mokėti su tuo susidoroti gracefully. Implementuokite retry logiką, loginkite klaidas, stebėkite, kas vyksta.
Ir galiausiai – skaitykite dokumentaciją. SendGrid dokumentacija tikrai gera ir nuolat atnaujinama. Ten rasite atsakymus į daugumą klausimų, kurie gali kilti. Jie taip pat turi aktyvią bendruomenę ir palaikymo komandą, kuri padeda, kai užstringa.
Transakcinio el. pašto API nėra raketų mokslas, bet yra daug smulkmenų, kurias reikia padaryti teisingai. SendGrid padeda sutvarkyti daugumą jų už jus, kad galėtumėte susikoncentruoti į savo aplikacijos kūrimą, o ne į SMTP serverių administravimą. Ar tai geriausias sprendimas visiems atvejams? Turbūt ne. Bet ar tai solidus, patikimas įrankis, kuris veikia ir turi viską, ko reikia? Definityviai taip.

