Rust
Async-first Rust client built on reqwest. Every method returns Result<T, sevk::Error>.
Install
cargo add sevk tokio --features tokio/full
Requires Rust 1.63 or later. The SDK repository's Cargo.lock is tested on Rust 1.63. Dependency version ranges also allow newer releases for current Rust projects.
Applications using older Rust must keep a compatible Cargo.lock and build with cargo build --locked. Cargo uses the application's lockfile, not the SDK's; updating dependencies to their latest releases can require a newer compiler.
Initialize
Sevk::new takes the API key as a &str.
use sevk::Sevk;#[tokio::main]async fn main() -> Result<(), sevk::Error> {let sevk = Sevk::new("sevk_full_xxxxxxxx");let _ = sevk;Ok(())}
Send Email
HTML body
use sevk::{SendEmailRequest, Sevk};#[tokio::main]async fn main() -> Result<(), sevk::Error> {let sevk = Sevk::new("sevk_full_xxxxxxxx");let result = sevk.emails().send(SendEmailRequest {subject: "Welcome".into(),html: Some("<h1>Welcome</h1><p>Thanks for signing up.</p>".into()),..Default::default()}).await?;match result {sevk::SendEmailResponse::Single(email) => println!("{}", email.id),sevk::SendEmailResponse::Multiple(emails) => println!("{:?}", emails.ids),}Ok(())}
With attachments
use sevk::{EmailAttachment, SendEmailRequest};sevk.emails().send(SendEmailRequest {subject: "Your invoice".into(),html: Some("<p>Invoice attached.</p>".into()),attachments: Some(vec![EmailAttachment {filename: "invoice.pdf".into(),content: base64_pdf,content_type: "application/pdf".into(),cid: None,}]),..Default::default()}).await?;
Send Bulk
use sevk::{BulkEmailItem, BulkEmailRequest};let result = sevk.emails().send_bulk(BulkEmailRequest {emails: vec![BulkEmailItem {subject: "Welcome".into(),html: Some("<p>Hi 1</p>".into()),..Default::default()},BulkEmailItem {subject: "Welcome".into(),html: Some("<p>Hi 2</p>".into()),..Default::default()},],}).await?;println!("ok={} failed={}", result.success, result.failed);
Contacts
use sevk::{ContactDataUpdate, CreateContactRequest, ListContactsParams, UpdateContactRequest};data: Some(serde_json::json!({"firstName": "John", "plan": "pro"}).as_object().unwrap().clone()),..Default::default()})).await?;sevk.contacts().get(&contact.id).await?;sevk.contacts().update(&contact.id, UpdateContactRequest {data: Some(ContactDataUpdate::Object(serde_json::json!({"plan": "enterprise"}).as_object().unwrap().clone())),..Default::default()}).await?;let page = sevk.contacts().list(Some(ListContactsParams {limit: Some(50),..Default::default()})).await?;for c in page.items { println!("{}", c.email); }sevk.contacts().delete(&contact.id).await?;
Audiences
use sevk::CreateAudienceRequest;let audience = sevk.audiences().create(CreateAudienceRequest {name: "Newsletter".into(),..Default::default()}).await?;sevk.audiences().add_contacts(&audience.id, vec!["b2c3d4e5-f678-4901-abcd-ef1234567890".into(),"b2c3d4e5-f678-4901-abcd-ef1234567891".into(),]).await?;let contacts = sevk.audiences().list_contacts(&audience.id, None).await?;for c in contacts.items { println!("{}", c.email); }
Render Markup
use sevk::markup;fn main() {let html = markup::render(r#"<section padding="32px"><heading level="1">Hello</heading><paragraph>Rendered locally.</paragraph></section>"#);println!("{html}");}
Error Handling
use sevk::Error;match sevk.emails().send(/* ... */).await {Ok(sevk::SendEmailResponse::Single(email)) => println!("{}", email.id),Ok(sevk::SendEmailResponse::Multiple(emails)) => println!("{:?}", emails.ids),Err(Error::Api { status, message, .. }) => eprintln!("api {status}: {message}"),Err(Error::Request(e)) => eprintln!("transport error: {e}"),Err(e) => eprintln!("{e}"),}