Prerequisites

To get the most out of this guide, you’ll need to:

Install

First, create a rust project with cargo and cd into it.

cargo init resend-rust-example
cd resend-rust-example

Next, add add the Rust Resend SDK as well as Tokio:

cargo add resend-rs
cargo add tokio -F macros,rt-multi-thread

The Rust SDK is Async-first so Tokio is needed.

Send email

use resend_rs::types::CreateEmailBaseOptions;
use resend_rs::{Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let resend = Resend::new("re_123456789");

  let from = "Acme <onboarding@resend.dev>";
  let to = ["delivered@resend.dev"];
  let subject = "Hello World";

  let email = CreateEmailBaseOptions::new(from, to, subject)
    .with_html("<strong>It works!</strong>");

  let _email = resend.emails.send(email).await?;

  Ok(())
}

Reading the API key

Instead of using Resend::new and hardcoding the API key, the RESEND_API_KEY environment variable can be used instead. The Resend::default() should be used in that scenario instead.

Reading the API key from a .env file

Another popular option is to use a .env file for environment variables. You can use the dotenv crate for that:

cargo add dotenv
// main.rs
use dotenv::dotenv;
use resend_rs::types::CreateEmailBaseOptions;
use resend_rs::{Resend, Result};

#[tokio::main]
async fn main() -> Result<()> {
  let _env = dotenv().unwrap();

  let resend = Resend::default();

  let from = "Acme <onboarding@resend.dev>";
  let to = ["delivered@resend.dev"];
  let subject = "Hello World";

  let email = CreateEmailBaseOptions::new(from, to, subject)
    .with_html("<strong>It works!</strong>");

  let _email = resend.emails.send(email).await?;

  Ok(())
}
# .env
RESEND_API_KEY=re_123456789