#![doc(html_no_source)]
#![deny(missing_docs)]
#![forbid(unsafe_code)]
#![warn(rust_2018_idioms)]
#![warn(clippy::all)]
#![warn(clippy::pedantic)]
#![warn(clippy::nursery)]
#![warn(clippy::cargo)]
#![warn(clippy::restriction)]
#![allow(
clippy::blanket_clippy_restriction_lints,
clippy::missing_docs_in_private_items,
clippy::pub_use,
clippy::implicit_return,
clippy::mod_module_files,
clippy::shadow_reuse,
clippy::pattern_type_mismatch
)]
#![cfg_attr(
test,
allow(clippy::unwrap_used, clippy::panic, clippy::std_instead_of_core)
)]
mod send;
mod sender;
pub use send::{split_and_sort_and_send, SenderOutcome};
pub use sender::{Sender, SenderParameters};
use vsmtp_common::{rcpt::Rcpt, Address};
use vsmtp_config::Config;
#[allow(clippy::expect_used)]
fn to_lettre_envelope(from: &Option<Address>, rcpt: &[Rcpt]) -> lettre::address::Envelope {
lettre::address::Envelope::new(
from.as_ref()
.map(|f| f.full().parse().expect("failed to parse from address")),
rcpt.iter()
.map(|r| {
r.address
.full()
.parse()
.expect("failed to parse rcpt address")
})
.collect::<Vec<_>>(),
)
.expect("at least one rcpt")
}
fn get_cert_for_server(server_name: &str, config: &Config) -> Option<Vec<rustls::Certificate>> {
config
.server
.r#virtual
.get(server_name)
.and_then(|v| v.tls.as_ref().map(|tls| tls.certificate.inner.clone()))
}
pub mod transport {
use vsmtp_common::{rcpt::Rcpt, Address, ContextFinished};
use vsmtp_config::Config;
#[async_trait::async_trait]
pub trait Transport {
async fn deliver(
self,
config: &Config,
context: &ContextFinished,
from: &Option<Address>,
to: Vec<Rcpt>,
content: &str,
) -> Vec<Rcpt>;
}
mod deliver;
mod forward;
mod maildir;
mod mbox;
pub use deliver::Deliver;
pub use forward::Forward;
pub use maildir::Maildir;
pub use mbox::MBox;
}