Rust is an enjoyable language, and I have been experimenting with it for a some time. I started with creating a few web servers using different crates including rocket and actix. I needed to use an email api to send messages from the backend to either myself or the user.
I have used Sparkpost as an email service for such purpose in some of my nodejs
apps. Having not found any rust
API lib for it I decided to create one for myself. It is available on https://crates.io/crates/sparkpost.
Current implementation includes transmission api only. That allows you to send emails with metadata, templates and other features.
Here is a complete example of how to use the lib
[dependencies]
sparkpost="0.4"
serde_json="1.0"
serde_derive = "1.0"
serde = "1.0"
chrono = { version = "0.4", features = ["serde"] }
dotenv = "0.13"
// main.rs
#[macro_use]
extern crate serde_derive;
extern crate chrono; // for setting dateTime option to an email
extern crate dotenv; // optional- to read api key from .env file
extern crate serde;
extern crate sparkpost;
use chrono::prelude::*;
use sparkpost::transmission::{
Attachment, EmailAddress, Message, Options, Recipient, Transmission, TransmissionResponse,
};
// this could be any Type to replace vlaues in sparkpost template
// only requirement is that it implements Serialize from serde
#[derive(Debug, Serialize)]
struct Data {
name: String,
}
#[allow(unused)]
fn get_api_key() -> String {
use dotenv::dotenv;
use std::env;
dotenv().ok();
env::var("SPARKPOST_API_KEY").expect("SPARKPOST_API_KEY must be set")
}
fn main() {
// for eu servers use
// let tm = Transmission::new_eu(get_api_key());
let tm = Transmission::new(get_api_key());
// new email message with sender name and email
let mut email = Message::new(EmailAddress::new(
"marketing@example.sink.sparkpostmail.com",
"Example Company",
));
let options = Options {
open_tracking: true,
click_tracking: true,
transactional: false,
sandbox: false,
inline_css: false,
start_time: Some(Utc.ymd(2019, 1, 1).and_hms(0, 0, 0)),
};
// recipient with substitute data for the template
let recipient = Recipient::with_substitution(
EmailAddress::new("bob@company.com", "Bob"),
Data { name: "Bob".into() },
);
let attachment = Attachment {
file_type: "image/png".into(),
name: "AnImage.png".into(),
// data is base64 encoded string
data: "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAmCC".into(),
};
// complete the email message with details
email
.add_recipient(recipient)
.add_attachment(attachment)
.options(options)
.campaign_id("marketing_blitz")
.subject("My Awesome email 😎")
.html("<h1>hello {name}</h1>")
.text("hello {name}");
let result = tm.send(&email);
match result {
Ok(res) => {
match res {
TransmissionResponse::ApiResponse(api_res) => {
println!("API Response: \n {:#?}", api_res);
assert_eq!(1, api_res.total_accepted_recipients);
assert_eq!(0, api_res.total_rejected_recipients);
}
TransmissionResponse::ApiError(errors) => {
println!("Response Errors: \n {:#?}", &errors);
}
}
}
Err(error) => {
println!("error \n {:#?}", error);
}
}
}
As I mentioned above that there are many features that are lacking i.e. saving and retrieving templates and recipient list etc. Reason is that I don't use those features for now. If anyone is interested I will be more than happy to help.
Top comments (0)