v0.0.3
RustBox CI / rustbox (push) Waiting to run

This commit is contained in:
Mateusz Gruszczyński committed 2026-10-30 00:12:09 +01:00
1 parent a238ff5e23
commit 93762fe9ef
65 files changed
+5420 -2792

No files matched your search

+37 -43
View File
@@ -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();