/* * advotracker - Hotline tackingtool for Advocats * * Copyright 2021 Ralf Zerres * SPDX-License-Identifier: (0BSD or MIT) */ use lettre::{ message::{header, MultiPart, SinglePart}, Message, SmtpTransport, Transport, transport::smtp::authentication::Credentials, }; use maud::html; use std::error::Error; //use std::process; use tracing::{info, trace}; use crate::{ data::structures::Email, Lang, }; /// send ticket data via eMail pub fn sendticketdata(email: &Email, lang: &Lang) -> Result<(), Box> { let mut res = t!(sendticketdata_export_started => lang); let mut state = t!(state_started =>lang); trace!(target: "sendticketdata", process = ?res, state = ?state); // The html we want to send. // It uses https://crates.io/crates/maud let html = html! { head { title { (email.subject) " (" (email.policy_code) ")" } style type="text/css" { "h2, h4 { font-family: Arial, Helvetica, sans-serif; }" } } div style="display: flex; flex-direction: column; align-items: left;" { // compose with variables and strings h2 { (email.subject) " (" (email.policy_code) ")" } p { "Vers.-Schein/Schadennummer: " (email.policy_code) } p { "Versicherungsnehmer: " (email.policy_holder) } p { "Selbstbehalt: " (email.deductible) } p { "Rückrufnummer: " (email.callback_number) } p { "Erreichbarkeit: " (email.callback_date) } p { "Rechtsproblem: " (email.harm_type) } p { "Rechtsrat: " (email.ivr_comment) } } }; let ascii_body = String::new() + &"Vers.-Schein/Schadennummer".to_string() + &(email.policy_code) + &"\n" + &"Versicherungsnehmer: ".to_string() + &(email.policy_holder) + &"\n" + &"Selbstbehalt: ".to_string() + &(email.deductible) + &"\n" + &"Rückrufnummer: ".to_string()+ &(email.callback_number) + &"\n" + &"Erreichbarkeit: ".to_string() + &(email.callback_date) + &"\n" + &"Rechtsproblem: ".to_string() + &(email.harm_type) + &"\n" + &"Rechtsrat: ".to_string() + &(email.ivr_comment) + &"\n"; info!("email body: {:?}", ascii_body); let message = Message::builder() .from((email.mail_from).parse().unwrap()) .reply_to((email.mail_reply).parse().unwrap()) .to((email.mail_to).parse().unwrap()) .cc((email.mail_cc).parse().unwrap()) // we do not use bcc yet //.bcc((email.mail_bcc).parse().unwrap()) .subject(String::new() + &email.subject.to_string() + &" (".to_string() + &email.policy_code.to_string() + &")".to_string() ) .multipart( MultiPart::alternative() // This is composed of two parts. .singlepart( SinglePart::builder() .header(header::ContentType( "text/plain; charset=utf8".parse().unwrap(), )) .body(String::from(ascii_body)), ) .singlepart( SinglePart::builder() .header(header::ContentType( "text/html; charset=utf8".parse().unwrap(), )) .body(html.into_string()), ), ) .expect("failed to build email"); info!("message: {:?}", message); // Create credential for remote authentication (username, password) // WIP: get credentials from config file / cli let credentials = Credentials::new("service@hiedemann.de".to_string(), "88service99$".to_string()); // standard smtp client connection //let mailer = SmtpTransport::starttls_relay("hiedemannsbs.kanzlei.hiedemann.de") // Open a remote connection to relay server (port 2525) // WIP: get relay address from config file / cli //let relay = "hiedemannsbs.kanzlei.hiedemann.de" let relay = "smtp.strato.de"; let mailer = SmtpTransport::relay(relay) .unwrap() .credentials(credentials) .build(); trace!(target: "sendticketdata", email = ?email); // Send the email and catch the error if it isn't successfully let _result = mailer.send(&message)?; state = t!(state_finished => lang); res = t!(sendticketdata_export_finished => lang); trace!(target: "sendticketdata", process = ?res, state = ?state); Ok(()) }