Plume/src/mail.rs

94 lines
2.6 KiB
Rust
Raw Normal View History

#![warn(clippy::too_many_arguments)]
use lettre_email::Email;
use std::env;
pub use self::mailer::*;
#[cfg(feature = "debug-mailer")]
mod mailer {
use plume_models::smtp::{SendableEmail, Transport};
2019-03-20 17:56:17 +01:00
use std::io::Read;
pub struct DebugTransport;
impl<'a> Transport<'a> for DebugTransport {
type Result = Result<(), ()>;
fn send(&mut self, email: SendableEmail) -> Self::Result {
println!(
"{}: from=<{}> to=<{:?}>\n{:#?}",
email.message_id().to_string(),
2019-03-20 17:56:17 +01:00
email
.envelope()
.from()
.map(ToString::to_string)
.unwrap_or_default(),
email.envelope().to().to_vec(),
{
let mut message = String::new();
2019-03-20 17:56:17 +01:00
email
.message()
.read_to_string(&mut message)
.map_err(|_| ())?;
message
},
);
Ok(())
}
}
pub type Mailer = Option<DebugTransport>;
pub fn init() -> Mailer {
Some(DebugTransport)
}
}
#[cfg(not(feature = "debug-mailer"))]
mod mailer {
use plume_models::smtp::{
authentication::{Credentials, Mechanism},
extension::ClientId,
ConnectionReuseParameters, SmtpClient, SmtpTransport,
};
use plume_models::{SmtpNewWithAddr, CONFIG};
pub type Mailer = Option<SmtpTransport>;
pub fn init() -> Mailer {
let config = CONFIG.mail.as_ref()?;
let mail = SmtpClient::new_with_addr((&config.server, config.port))
2019-03-20 17:56:17 +01:00
.unwrap()
.hello_name(ClientId::Domain(config.helo_name.clone()))
.credentials(Credentials::new(
config.username.clone(),
config.password.clone(),
))
.smtp_utf8(true)
.authentication_mechanism(Mechanism::Plain)
.connection_reuse(ConnectionReuseParameters::NoReuse)
.transport();
Some(mail)
}
}
pub fn build_mail(dest: String, subject: String, body: String) -> Option<Email> {
Email::builder()
2019-03-20 17:56:17 +01:00
.from(
env::var("MAIL_ADDRESS")
.or_else(|_| {
Ok(format!(
"{}@{}",
env::var("MAIL_USER")?,
env::var("MAIL_SERVER")?
)) as Result<_, env::VarError>
})
.expect("The email server is not configured correctly"),
2019-03-20 17:56:17 +01:00
)
.to(dest)
.subject(subject)
.text(body)
.build()
.ok()
}