André Cruz 2d627b92c7 fix header selection
Header selection routing was not handling correctly duplicate
headers. This is valid, according to the spec, and the mail headers
should be chosen last to first.
2022-10-12 16:37:57 +01:00
2022-10-12 16:37:57 +01:00
2022-07-28 23:41:41 +01:00
2022-01-20 20:47:29 +00:00
2022-09-14 15:02:55 +01:00
2022-09-14 15:02:55 +01:00
2022-09-14 15:02:55 +01:00
2022-01-20 20:47:29 +00:00
2022-01-23 15:13:07 +00:00

cfdkim

DKIM (RFC6376) implementation

Features

Verifying email signatures

Example:

let res: DKIMResult = cfdkim::verify_email(&logger, &from_domain, &parsed_email).await?;

if let Some(err) = &res.error() {
  error!(logger, "dkim verify fail: {}", err);
}

println!("dkim={}", res.with_detail());

The verify_email arguments are the following:

  • logger: slog::Logger
  • from_domain: &str (RFC5322.From's domain)
  • parsed_email: mailparse::ParsedMail

Signing an email

Example:

let private_key =
    rsa::RsaPrivateKey::read_pkcs1_pem_file(Path::new("./test/keys/2022.private"))?;

let signer = SignerBuilder::new()
    .with_signed_headers(&["From", "Subject"])?
    .with_private_key(private_key)
    .with_selector("2020")
    .with_logger(&logger)
    .with_signing_domain("example.com")
    .build()?;
let signature = signer.sign(&email)?;

println!("{}", signature); // DKIM-Signature: ...

See the SignerBuilder object documentation for more information.

Generate a test DKIM key

Using OpenDKIM:

opendkim-genkey \
    --testmode \
    --domain=example.com \
    --selector=2022 \
    --nosubdomains
S
Description
The first Open-Source high-performance MTA developed from the ground-up for high-volume email sending environments.
Readme
37 MiB
Languages
Rust 91.8%
Lua 6.3%
Python 0.9%
Shell 0.8%
JavaScript 0.1%