1 parent
a238ff5e23
commit
93762fe9ef
65 files changed
+5420
-2792
No files matched your search
+37
-43
@@ -43,6 +43,34 @@ pub trait SmtpClient: Send + Sync {
|
||||
/// performs the operation, and disconnects.
|
||||
pub struct RealSmtpClient;
|
||||
|
||||
fn smtp_transport(
|
||||
creds: &SmtpCredentials,
|
||||
) -> Result<lettre::AsyncSmtpTransport<lettre::Tokio1Executor>, SmtpError> {
|
||||
use lettre::transport::smtp::authentication::Credentials;
|
||||
use lettre::transport::smtp::client::{Tls, TlsParameters};
|
||||
use lettre::{AsyncSmtpTransport, Tokio1Executor};
|
||||
|
||||
let smtp_creds = Credentials::new(creds.email.clone(), creds.password.clone());
|
||||
let mut builder = AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&creds.host)
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds);
|
||||
if creds.tls {
|
||||
let parameters = TlsParameters::builder(creds.host.clone())
|
||||
.dangerous_accept_invalid_certs(!creds.tls_verify)
|
||||
.dangerous_accept_invalid_hostnames(!creds.tls_verify)
|
||||
.build()
|
||||
.map_err(|e| SmtpError::ConnectionFailed(e.to_string()))?;
|
||||
builder = builder.tls(if creds.port == 587 {
|
||||
Tls::Required(parameters)
|
||||
} else {
|
||||
Tls::Wrapper(parameters)
|
||||
});
|
||||
} else {
|
||||
builder = builder.tls(Tls::None);
|
||||
}
|
||||
Ok(builder.build())
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl SmtpClient for RealSmtpClient {
|
||||
async fn send_message(
|
||||
@@ -50,8 +78,7 @@ impl SmtpClient for RealSmtpClient {
|
||||
creds: &SmtpCredentials,
|
||||
message: &SendableMessage,
|
||||
) -> Result<SmtpSendResult, SmtpError> {
|
||||
use lettre::transport::smtp::authentication::Credentials;
|
||||
use lettre::{AsyncSmtpTransport, AsyncTransport, Tokio1Executor};
|
||||
use lettre::AsyncTransport;
|
||||
|
||||
let message_id = format!(
|
||||
"<{}.{}@{}>",
|
||||
@@ -62,26 +89,14 @@ impl SmtpClient for RealSmtpClient {
|
||||
let email = crate::smtp::builder::build_message(message, &message_id)
|
||||
.map_err(SmtpError::SendFailed)?;
|
||||
let rfc822 = email.formatted();
|
||||
if message.max_message_size_bytes > 0 && rfc822.len() > message.max_message_size_bytes {
|
||||
return Err(SmtpError::MessageTooLarge {
|
||||
actual: rfc822.len(),
|
||||
limit: message.max_message_size_bytes,
|
||||
});
|
||||
}
|
||||
|
||||
let smtp_creds = Credentials::new(creds.email.clone(), creds.password.clone());
|
||||
let transport: AsyncSmtpTransport<Tokio1Executor> = if creds.tls && creds.port == 587 {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::starttls_relay(&creds.host)
|
||||
.map_err(|e| SmtpError::ConnectionFailed(e.to_string()))?
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
} else if creds.tls {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::relay(&creds.host)
|
||||
.map_err(|e| SmtpError::ConnectionFailed(e.to_string()))?
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
} else {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&creds.host)
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
};
|
||||
let transport = smtp_transport(creds)?;
|
||||
|
||||
transport.send(email).await.map_err(|e| {
|
||||
let msg = e.to_string();
|
||||
@@ -107,28 +122,7 @@ impl SmtpClient for RealSmtpClient {
|
||||
}
|
||||
|
||||
async fn check_connection(&self, creds: &SmtpCredentials) -> Result<(), SmtpError> {
|
||||
use lettre::transport::smtp::authentication::Credentials;
|
||||
use lettre::{AsyncSmtpTransport, Tokio1Executor};
|
||||
|
||||
let smtp_creds = Credentials::new(creds.email.clone(), creds.password.clone());
|
||||
let transport: AsyncSmtpTransport<Tokio1Executor> = if creds.tls && creds.port == 587 {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::starttls_relay(&creds.host)
|
||||
.map_err(|e| SmtpError::ConnectionFailed(e.to_string()))?
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
} else if creds.tls {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::relay(&creds.host)
|
||||
.map_err(|e| SmtpError::ConnectionFailed(e.to_string()))?
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
} else {
|
||||
AsyncSmtpTransport::<Tokio1Executor>::builder_dangerous(&creds.host)
|
||||
.port(creds.port)
|
||||
.credentials(smtp_creds)
|
||||
.build()
|
||||
};
|
||||
let transport = smtp_transport(creds)?;
|
||||
|
||||
let accepted = transport.test_connection().await.map_err(|e| {
|
||||
let message = e.to_string();
|
||||
|
||||
Reference in new issue
Block a user