#![doc(html_no_source)]
#![deny(missing_docs)]
#![deny(unsafe_code)]
#![warn(rust_2018_idioms)]
#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
#![warn(clippy::cargo)]
mod channel_message;
mod runtime;
mod server;
mod receiver {
pub mod handler;
mod post_transaction;
pub mod pre_transaction;
}
pub mod delivery;
pub mod scheduler;
pub mod working;
pub use channel_message::ProcessMessage;
pub use receiver::handler::Handler;
pub use receiver::pre_transaction::ValidationVSL;
pub use runtime::start_runtime;
pub use server::{socket_bind_anyhow, Server};
use anyhow::Context;
use vsmtp_common::status::SmtpConnection;
use vsmtp_common::{Address, ContextFinished};
use vsmtp_mail_parser::MessageBody;
pub(crate) fn delegate(
delegator: &SmtpConnection,
context: &ContextFinished,
message: &MessageBody,
) -> anyhow::Result<lettre::transport::smtp::response::Response> {
use lettre::Transport;
let envelope = lettre::address::Envelope::new(
context
.mail_from
.reverse_path
.as_ref()
.map(Address::to_lettre),
context
.rcpt_to
.delivery
.values()
.flatten()
.map(|rcpt| rcpt.0.to_lettre())
.collect::<Vec<_>>(),
)?;
delegator
.0
.lock()
.unwrap()
.send_raw(&envelope, message.inner().to_string().as_bytes())
.context("failed to delegate email")
}