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 {
from: "sevk <[email protected]>".into(),
to: "[email protected]".into(),
subject: "Welcome".into(),
html: Some("<h1>Welcome</h1><p>Thanks for signing up.</p>".into()),
reply_to: Some("[email protected]".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 {
from: "sevk <[email protected]>".into(),
to: "[email protected]".into(),
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 {
from: "sevk <[email protected]>".into(),
to: "[email protected]".into(),
subject: "Welcome".into(),
html: Some("<p>Hi 1</p>".into()),
..Default::default()
},
BulkEmailItem {
from: "sevk <[email protected]>".into(),
to: "[email protected]".into(),
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};
let contact = sevk.contacts().create("[email protected]", Some(CreateContactRequest {
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}"),
}