Files
advotracker/advotracker_client/src/services/exports/send_ticketdata.rs
2021-05-21 12:46:33 +02:00

125 lines
4.6 KiB
Rust

/*
* advotracker - Hotline tackingtool for Advocats
*
* Copyright 2021 Ralf Zerres <ralf.zerres@networkx.de>
* 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<dyn Error>> {
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(())
}