13 个版本

0.3.2 2024年7月10日
0.3.1 2023年10月2日
0.3.0 2023年6月2日
0.2.5 2023年1月19日
0.1.3 2022年2月16日

#11 in 电子邮件

Download history 2696/week @ 2024-05-02 2468/week @ 2024-05-09 2605/week @ 2024-05-16 2269/week @ 2024-05-23 3017/week @ 2024-05-30 2476/week @ 2024-06-06 2917/week @ 2024-06-13 2300/week @ 2024-06-20 2327/week @ 2024-06-27 2132/week @ 2024-07-04 2222/week @ 2024-07-11 1895/week @ 2024-07-18 2858/week @ 2024-07-25 2402/week @ 2024-08-01 2450/week @ 2024-08-08 2323/week @ 2024-08-15

10,426 每月下载次数
25 个 Crates (14 个直接使用) 中使用

Apache-2.0 OR MIT

97KB
2K SLoC

mail-builder

crates.io build docs.rs crates.io

mail-builder 是一个灵活的 电子邮件构建库,用 Rust 编写。它包含以下特性

  • 生成符合 Internet Message Format 标准的 电子邮件 消息(RFC 5322)。
  • 完整的 MIME 支持(《RFC 2045 - 2049》)和自动选择每个消息正文部分的最佳编码。
  • 基于 Chromium 解码器的 快速 Base64 编码最快的非 SIMD 编码器)。
  • 无依赖(gethostname 是可选的)。

请注意,此库不支持发送或解析电子邮件消息,因为这些功能由 Crates mail-sendmail-parser 提供。

使用示例

构建一个简单的电子邮件消息,包含文本正文和一个附件

    // Build a simple text message with a single attachment
    let eml = MessageBuilder::new()
        .from(("John Doe", "[email protected]"))
        .to("[email protected]")
        .subject("Hello, world!")
        .text_body("Message contents go here.")
        .attachment("image/png", "image.png", [1, 2, 3, 4].as_ref())
        .write_to_string()
        .unwrap();
        
    // Print raw message
    println!("{}", eml);

还可以轻松构建更复杂的消息,包括分组地址、内联部分和 multipart/alternative 部分

    // Build a multipart message with text and HTML bodies,
    // inline parts and attachments.
    MessageBuilder::new()
        .from(("John Doe", "[email protected]"))

        // To recipients
        .to(vec![
            ("Antoine de Saint-Exupéry", "[email protected]"),
            ("안녕하세요 세계", "[email protected]"),
            ("Xin chào", "[email protected]"),
        ])

        // BCC recipients using grouped addresses
        .bcc(vec![
            (
                "My Group",
                vec![
                    ("ASCII name", "[email protected]"),
                    ("ハロー・ワールド", "[email protected]"),
                    ("áéíóú", "[email protected]"),
                    ("Γειά σου Κόσμε", "[email protected]"),
                ],
            ),
            (
                "Another Group",
                vec![
                    ("שלום עולם", "[email protected]"),
                    ("ñandú come ñoquis", "[email protected]"),
                    ("Recipient", "[email protected]"),
                ],
            ),
        ])

        // Set RFC and custom headers
        .subject("Testing multipart messages") 
        .in_reply_to(vec!["message-id-1", "message-id-2"])
        .header("List-Archive", URL::new("http://example.com/archive"))

        // Set HTML and plain text bodies
        .text_body("This is the text body!\n") 
        .html_body("<p>HTML body with <img src=\"cid:my-image\"/>!</p>") 

        // Include an embedded image as an inline part
        .inline("image/png", "cid:my-image", [0, 1, 2, 3, 4, 5].as_ref())
        .attachment("text/plain", "my fíle.txt", "Attachment contents go here.") 

        // Add text and binary attachments
        .attachment(
            "text/plain",
            "ハロー・ワールド",
            b"Binary contents go here.".as_ref(),
        )

        // Write the message to a file
        .write_to(File::create("message.eml").unwrap())
        .unwrap();

可以使用 body 方法创建嵌套的 MIME 正文结构

    // Build a nested multipart message
    MessageBuilder::new()
        .from(Address::new_address("John Doe".into(), "[email protected]"))
        .to(Address::new_address("Jane Doe".into(), "[email protected]"))
        .subject("Nested multipart message")

        // Define the nested MIME body structure
        .body(MimePart::new(
            "multipart/mixed",
            vec![
                MimePart::new("text/plain", "Part A contents go here...").inline(),
                MimePart::new(
                    "multipart/mixed",
                    vec![
                        MimePart::new(
                            "multipart/alternative",
                            vec![
                                MimePart::new(
                                    "multipart/mixed",
                                    vec![
                                        MimePart::new("text/plain", "Part B contents go here...").inline(),
                                        MimePart::new(
                                            "image/jpeg",
                                            "Part C contents go here...".as_bytes(),
                                        )
                                        .inline(),
                                        MimePart::new("text/plain", "Part D contents go here...").inline(),
                                    ],
                                ),
                                MimePart::new(
                                    "multipart/related",
                                    vec![
                                        MimePart::new("text/html", "Part E contents go here...").inline(),
                                        MimePart::new(
                                            "image/jpeg",
                                            "Part F contents go here...".as_bytes(),
                                        ),
                                    ],
                                ),
                            ],
                        ),
                        MimePart::new("image/jpeg", "Part G contents go here...".as_bytes())
                            .attachment("image_G.jpg"),
                        MimePart::new(
                            "application/x-excel",
                            "Part H contents go here...".as_bytes(),
                        ),
                        MimePart::new(
                            "x-message/rfc822",
                            "Part J contents go here...".as_bytes(),
                        ),
                    ],
                ),
                MimePart::new("text/plain", "Part K contents go here...").inline(),
            ],
        ))
        
        // Write the message to a file
        .write_to(File::create("nested-message.eml").unwrap())
        .unwrap();

测试

运行测试套件

 $ cargo test --all-features

或,使用 MIRI 运行测试套件

 $ cargo +nightly miri test --all-features

许可证

根据您的选择,许可如下

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

有关许可证,请参阅 COPYING

依赖关系

~0–7MB