1 use crate::settings::Settings;
3 message::{header, Mailbox, MultiPart, SinglePart},
5 authentication::Credentials,
6 client::{Tls, TlsParameters},
14 use std::str::FromStr;
21 ) -> Result<(), String> {
22 let email_config = Settings::get().email.ok_or("no_email_setup")?;
23 let domain = Settings::get().hostname;
25 let (smtp_server, smtp_port) = {
26 let email_and_port = email_config.smtp_server.split(':').collect::<Vec<&str>>();
31 .expect("email needs a port"),
35 let email = Message::builder()
40 .expect("email from address isn't valid"),
43 Some(to_username.to_string()),
44 Address::from_str(to_email).expect("email to address isn't valid"),
48 MultiPart::mixed().multipart(
49 MultiPart::alternative()
51 SinglePart::eight_bit()
52 .header(header::ContentType(
53 "text/plain; charset=utf8"
55 .expect("email could not parse header"),
60 MultiPart::related().singlepart(
61 SinglePart::eight_bit()
62 .header(header::ContentType(
63 "text/html; charset=utf8"
65 .expect("email could not parse header"),
72 .expect("email built incorrectly");
74 // don't worry about 'dangeous'. it's just that leaving it at the default configuration
76 let mut builder = SmtpTransport::builder_dangerous(smtp_server).port(smtp_port);
79 if email_config.use_tls {
80 let tls_config = TlsParameters::new(smtp_server.to_string()).expect("the TLS backend is happy");
81 builder = builder.tls(Tls::Wrapper(tls_config));
84 // Set the creds if they exist
85 if let (Some(username), Some(password)) = (email_config.smtp_login, email_config.smtp_password) {
86 builder = builder.credentials(Credentials::new(username, password));
89 let mailer = builder.hello_name(ClientId::Domain(domain)).build();
91 let result = mailer.send(&email);
95 Err(e) => Err(e.to_string()),