#send-email #smtp #dkim #mime #smtp-server

mail-send-fork

支持 SMTP 和 DKIM 的电子邮件投递库

3 个版本

0.4.8 2024年1月6日
0.4.7 2024年1月6日
0.4.6 2024年1月6日

#9 in #dkim

Download history 2/week @ 2024-03-11 47/week @ 2024-04-01 18/week @ 2024-04-08 11/week @ 2024-04-15 25/week @ 2024-04-22 20/week @ 2024-05-20 5/week @ 2024-06-03 58/week @ 2024-06-10 1/week @ 2024-06-17 29/week @ 2024-06-24

93 每月下载量
3 个包中使用 (通过 xsmtp)

Apache-2.0 OR MIT

71KB
1.5K SLoC

mail-send

crates.io build docs.rs crates.io

mail-send 是一个 Rust 库,用于通过 SMTP 构建、签名和发送电子邮件。它包括以下功能

  • 生成符合 Internet Message Format 标准的电子邮件消息 (RFC 5322)。
  • 完全支持 MIME (RFC 2045 - 2049),并为每个消息体部分自动选择最合适的编码。
  • DomainKeys Identified Mail (DKIM) 签名 (RFC 6376),支持 ED25519-SHA256、RSA-SHA256 和 RSA-SHA1。
  • 简单邮件传输协议 (SMTPRFC 5321) 交付。
  • 通过 TLS 的安全 SMTP 服务扩展 (RFC 3207)。
  • 用于身份验证的 SMTP 服务扩展 (RFC 4954),具有自动机制协商(从最安全到最不安全)。
    • CRAM-MD5 (RFC 2195)
    • DIGEST-MD5 (RFC 2831;已过时但仍然支持)
    • XOAUTH2 (Google 独家)
    • LOGIN
    • PLAIN
  • 完全异步(需要 Tokio)。

使用示例

通过需要身份验证的 SMTP 服务器发送消息

    // Build a simple multipart message
    let message = MessageBuilder::new()
        .from(("John Doe", "[email protected]"))
        .to(vec![
            ("Jane Doe", "[email protected]"),
            ("James Smith", "[email protected]"),
        ])
        .subject("Hi!")
        .html_body("<h1>Hello, world!</h1>")
        .text_body("Hello world!");

    // Connect to the SMTP submissions port, upgrade to TLS and
    // authenticate using the provided credentials.
    SmtpClientBuilder::new("smtp.gmail.com", 587)
        .implicit_tls(false)
        .credentials(("john", "p4ssw0rd"))
        .connect()
        .await
        .unwrap()
        .send(message)
        .await
        .unwrap();

使用 DKIM 签名消息并通过 SMTP 中继服务器发送

    // Build a simple text message with a single attachment
    let message = MessageBuilder::new()
        .from(("John Doe", "[email protected]"))
        .to("[email protected]")
        .subject("Howdy!")
        .text_body("These pretzels are making me thirsty.")
        .attachment("image/png", "pretzels.png", [1, 2, 3, 4].as_ref());

    // Sign an e-mail message using RSA-SHA256
    let pk_rsa = RsaKey::<Sha256>::from_rsa_pem(TEST_KEY).unwrap();
    let signer = DkimSigner::from_key(pk_rsa)
        .domain("example.com")
        .selector("default")
        .headers(["From", "To", "Subject"])
        .expiration(60 * 60 * 7); // Number of seconds before this signature expires (optional)

    // Connect to an SMTP relay server over TLS.
    // Signs each message with the configured DKIM signer.
    SmtpClientBuilder::new("smtp.gmail.com", 465)
        .connect()
        .await
        .unwrap()
        .send_signed(message, &signer)
        .await
        .unwrap();

有关构建消息的更多示例,请参阅 mail-builder 包。请注意,此库不支持解析电子邮件消息,因为此功能由单独的 mail-parser 包提供。

测试

要运行测试套件

 $ cargo test --all-features

或,要使用 MIRI 运行测试套件

 $ cargo +nightly miri test --all-features

许可证

根据以下任一许可证授权

任选其一。

版权 (C) 2020-2022,Stalwart Labs Ltd.

依赖项

~11–23MB
~408K SLoC