|
|
|
@ -15,6 +15,7 @@ cfg_if! { if #[cfg(feature = "ssr")] {
|
|
|
|
|
use crate::backend::data::ResSumWithItems;
|
|
|
|
|
use lettre::message::Message as LettreMessage;
|
|
|
|
|
use lettre::{AsyncSmtpTransport, AsyncFileTransport, AsyncTransport, Tokio1Executor};
|
|
|
|
|
use lettre::transport::smtp::client::{Tls, TlsParameters};
|
|
|
|
|
use lettre::transport::smtp::authentication::Credentials;
|
|
|
|
|
use std::ops::Add;
|
|
|
|
|
|
|
|
|
@ -102,11 +103,35 @@ cfg_if! { if #[cfg(feature = "ssr")] {
|
|
|
|
|
pub async fn send_mail(&self, msg: MailMessage) -> Result<(), AppError> {
|
|
|
|
|
match self.transport() {
|
|
|
|
|
MailTransport::Smtp => {
|
|
|
|
|
let tls = if let Some(t) = self.accept_all_certs() {
|
|
|
|
|
if t {
|
|
|
|
|
let tls = TlsParameters::builder(self.server().clone().unwrap_or_default())
|
|
|
|
|
.dangerous_accept_invalid_certs(true)
|
|
|
|
|
.dangerous_accept_invalid_hostnames(true);
|
|
|
|
|
Some(tls.build().expect("Cannot build TLS params"))
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
None
|
|
|
|
|
};
|
|
|
|
|
let transport = if self.tls().unwrap_or(false) {
|
|
|
|
|
AsyncSmtpTransport::<Tokio1Executor>::starttls_relay(&self.server().clone().unwrap_or_default())
|
|
|
|
|
let transport = AsyncSmtpTransport::<Tokio1Executor>::starttls_relay(&self.server().clone().unwrap_or_default())
|
|
|
|
|
.expect("Cannot create SMTP mail transport");
|
|
|
|
|
if let Some(t) = tls {
|
|
|
|
|
transport.tls(Tls::Required(t))
|
|
|
|
|
} else {
|
|
|
|
|
transport
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
AsyncSmtpTransport::<Tokio1Executor>::relay(&self.server().clone().unwrap_or_default())
|
|
|
|
|
}.expect("Cannot create SMTP mail transport");
|
|
|
|
|
let transport = AsyncSmtpTransport::<Tokio1Executor>::relay(&self.server().clone().unwrap_or_default())
|
|
|
|
|
.expect("Cannot create SMTP mail transport");
|
|
|
|
|
if let Some(t) = tls {
|
|
|
|
|
transport.tls(Tls::Wrapper(t))
|
|
|
|
|
} else {
|
|
|
|
|
transport
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
let transport = if let Some(p) = self.port() {
|
|
|
|
|
transport.port(p)
|
|
|
|
|
} else {
|
|
|
|
|