2018-12-25 19:06:28 +00:00
|
|
|
use handlebars::Handlebars;
|
2019-02-07 19:58:31 +00:00
|
|
|
use lettre::{EmailTransport, SendmailTransport};
|
2018-11-02 10:50:57 +00:00
|
|
|
use lettre_email::EmailBuilder;
|
|
|
|
|
|
|
|
use serde::Serialize;
|
|
|
|
|
|
|
|
use types::Email;
|
2019-02-07 19:58:31 +00:00
|
|
|
use Result;
|
2018-11-02 10:50:57 +00:00
|
|
|
|
|
|
|
#[derive(Serialize, Clone)]
|
2019-02-07 19:58:31 +00:00
|
|
|
pub struct Context {
|
2018-11-02 10:50:57 +00:00
|
|
|
pub token: String,
|
|
|
|
pub userid: String,
|
|
|
|
pub domain: String,
|
|
|
|
}
|
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
pub struct Service {
|
|
|
|
from: String,
|
|
|
|
templates: Handlebars,
|
|
|
|
transport: Transport,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum Transport {
|
|
|
|
Sendmail,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Service {
|
|
|
|
/// Sends mail via sendmail.
|
|
|
|
pub fn sendmail(from: String, templates: Handlebars) -> Self {
|
|
|
|
Self {
|
|
|
|
from: from,
|
|
|
|
templates: templates,
|
|
|
|
transport: Transport::Sendmail,
|
2019-02-07 19:58:31 +00:00
|
|
|
}
|
2019-03-04 15:43:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn send_verification(&self, userid: &Email, token: &str, domain: &str)
|
|
|
|
-> Result<()> {
|
|
|
|
let ctx = Context {
|
|
|
|
token: token.to_string(),
|
|
|
|
userid: userid.to_string(),
|
|
|
|
domain: domain.to_string(),
|
|
|
|
};
|
2018-12-25 19:06:28 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
self.send(
|
|
|
|
userid,
|
|
|
|
"Please verify your email address",
|
|
|
|
"verify",
|
|
|
|
ctx,
|
2019-02-07 19:58:31 +00:00
|
|
|
)
|
2019-03-04 15:43:10 +00:00
|
|
|
}
|
2018-11-02 10:50:57 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
pub fn send_confirmation(&self, userid: &Email, token: &str, domain: &str)
|
|
|
|
-> Result<()> {
|
|
|
|
let ctx = Context {
|
|
|
|
token: token.to_string(),
|
|
|
|
userid: userid.to_string(),
|
|
|
|
domain: domain.to_string(),
|
|
|
|
};
|
2018-11-02 10:50:57 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
self.send(
|
|
|
|
userid,
|
|
|
|
"Please confirm deletion of your key",
|
|
|
|
"confirm",
|
|
|
|
ctx,
|
|
|
|
)
|
|
|
|
}
|
2018-11-02 10:50:57 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
fn send<T>(&self, to: &Email, subject: &str, template: &str, ctx: T)
|
|
|
|
-> Result<()>
|
|
|
|
where T: Serialize + Clone,
|
|
|
|
{
|
|
|
|
let tmpl_html = format!("{}-html", template);
|
|
|
|
let tmpl_txt = format!("{}-txt", template);
|
|
|
|
let (html, txt) = {
|
|
|
|
if let (Ok(inner_html), Ok(inner_txt)) = (
|
|
|
|
self.templates.render(&tmpl_html, &ctx),
|
|
|
|
self.templates.render(&tmpl_txt, &ctx),
|
|
|
|
) {
|
|
|
|
(Some(inner_html), Some(inner_txt))
|
|
|
|
} else {
|
|
|
|
(None, None)
|
|
|
|
}
|
|
|
|
};
|
2018-11-02 10:50:57 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
let email = EmailBuilder::new()
|
|
|
|
.to(to.to_string())
|
|
|
|
.from(self.from.clone())
|
|
|
|
.subject(subject)
|
|
|
|
.alternative(
|
|
|
|
html.ok_or(failure::err_msg("Email template failed to render"))?,
|
|
|
|
txt.ok_or(failure::err_msg("Email template failed to render"))?,
|
|
|
|
)
|
|
|
|
.build()
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
match self.transport {
|
|
|
|
Transport::Sendmail => {
|
|
|
|
let mut transport = SendmailTransport::new();
|
|
|
|
transport.send(&email)?;
|
|
|
|
},
|
|
|
|
}
|
2018-11-02 10:50:57 +00:00
|
|
|
|
2019-03-04 15:43:10 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
2018-11-02 10:50:57 +00:00
|
|
|
}
|