a mailer library for Rust

Overview

lettre

A mailer library for Rust


NOTE: this readme refers to the 0.10 version of lettre, which is still being worked on. The master branch and the alpha releases will see API breaking changes and some features may be missing or incomplete until the stable 0.10.0 release is out. Use the v0.9.x branch for stable releases.


Features

Lettre provides the following features:

  • Multiple transport methods
  • Unicode support (for email content and addresses)
  • Secure delivery with SMTP using encryption and authentication
  • Easy email builders
  • Async support

Lettre does not provide (for now):

  • Email parsing

Example

This library requires Rust 1.45 or newer. To use this library, add the following to your Cargo.toml:

[dependencies]
lettre = "0.10.0-beta.1"
use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport};

let email = Message::builder()
    .from("NoBody <[email protected]>".parse().unwrap())
    .reply_to("Yuin <[email protected]>".parse().unwrap())
    .to("Hei <[email protected]>".parse().unwrap())
    .subject("Happy new year")
    .body("Be happy!")
    .unwrap();

let creds = Credentials::new("smtp_username".to_string(), "smtp_password".to_string());

// Open a remote connection to gmail
let mailer = SmtpTransport::relay("smtp.gmail.com")
    .unwrap()
    .credentials(creds)
    .build();

// Send the email
match mailer.send(&email) {
    Ok(_) => println!("Email sent successfully!"),
    Err(e) => panic!("Could not send email: {:?}", e),
}

Testing

The lettre tests require an open mail server listening locally on port 2525 and the sendmail command.

Alternatively only unit tests can be run by doing cargo test --lib.

Code of conduct

Anyone who interacts with Lettre in any space, including but not limited to this GitHub repository, must follow our code of conduct.

License

This program is distributed under the terms of the MIT license.

The builder comes from emailmessage-rs by Kayo, under MIT license.

See LICENSE for details.

Comments
  • Prepare 0.10.0 release

    Prepare 0.10.0 release

    PR for the 0.10.0 release.

    There are still a few changes I want to get in, so at the moment this is a draft:

    • [x] Part 2 of 2 of the AsyncSmtpConnector refactor. #545 #560
    • [x] Seal lettre::transport::smtp::Error so that we don't expose libraries like r2d2, webpki ecc. since they aren't stable yet. The idea is to make it like reqwest::Error #564
    • [ ] ~~Remove lettre::transport::stub, we can always add it back later if people need it.~~
    • [x] Add integration tests for the async versions of the transports (we can probably copy them from the sync version) #561
    • [x] High level method for attaching files #511 #495
    • [ ] Go through the docs again and see if we forgot to fix anything
    • [ ] Anything else I might be forgetting?

    Issues for a future 0.10.n release:

    • #576

    Issues for a future 0.11.0 or 1.0 release:

    • ~~#474 (a workaround is explained in the comments)~~
    • #458

    In the meantime we can use this PR to evaluate what else should go in the changelog.

    Closes #467 Closes #356 Closes #245 Closes #200 Closes #501 Closes #544 Closes #427 Closes #511 Closes #699 Closes #790 Closes #727 Closes #707 Closes #605

    opened by paolobarbolini 27
  • Attachment filename with utf-8 chars is broken

    Attachment filename with utf-8 chars is broken

    Describe the bug When updating from lettre 0.10.0-alpha.4 to 0.10.0-rc.2, the Content-Disposition header handling was replaced with an own implementation in #601.

    When setting an attachment filename with the new attachment API containing an umlaut like "Töööst.pdf", it will also encode the filename= part of the header. Example output:

    Content-Disposition: attachment; =?utf-8?b?ZmlsZW5hbWU9IlTDtnN0?=.pdf
    

    My email client no longer shows any filename for the attachment :)

    This is how I handled an utf-8 based filename for attachments in lettre 0.10.0-alpha.4:

    parts = parts.singlepart(
        SinglePart::base64()
            .header(header::ContentType(
                "application/pdf".parse().unwrap(),
            ))
            .header(lettre::message::header::ContentDisposition {
                disposition: DispositionType::Attachment,
                parameters: vec![DispositionParam::Filename(
                    Charset::Ext("utf-8".into()),
                    None,
                    pdf.filename.as_bytes().to_vec(),
                )],
            })
            .body(raw_pdf),
    );
    

    This resulted in this header:

    Content-Disposition: attachment; filename="Töst.pdf"
    

    Also not ideal since it does not specify the character encoding, the mail client assumed utf-8 though.

    I'm unsure how the attachment API for non utf-8 filenames is best exposed in lettre.

    Related read: https://blog.nodemailer.com/2017/01/27/the-mess-that-is-attachment-filenames/

    type:bug component:builder 
    opened by thomasjfox 22
  • feat(email): add dkim signing capacity to message

    feat(email): add dkim signing capacity to message

    a new module was created to provide dkim_signing capabilities to message given a configuration. I tried to make as few changes as possible in Message struct. It's rust beginner work, so comments are more than welcome. Using existing dkim create was on option but I did not find easy to implement it in the existing code base. I started from the RFC and implement it from scratch. Choices that were made to keep it manageable to develop quickly.

    • Only sha256 hashing with rsa signatures is implemented
    • Repeating headers to be signed not supported since multiple headers does not seem to be implemented in the lib
    • l dkim paramtere was not implemented to keep things simple
    • the sign function is not tested yet, didn't find a way to do so properly using another implementation to check it
    opened by gaetronik 17
  • New Release

    New Release

    The current release on cargo only requires native-tls 0.1. native-tls 0.1 requires openssl 0.9 which does not support openssl 1.1.1. This means any packages depending on lettre do not compile on systems that have the most up-to-date openssl system library.

    native-tls has already been updated on master. Publishing a release would allow systems with system library openssl 1.1.1 to compile their projects.

    opened by FallingSnow 15
  • Content-Type visible in message body

    Content-Type visible in message body

    Message body looks like this:

    --OgB3T6zj15dxZcwauJuVwXGLlqwRXR Content-Type: text/plain; charset=utf-8

    Hello world.

    --OgB3T6zj15dxZcwauJuVwXGLlqwRXR--

    in every email client.

    To Reproduce It always happens this way. Can't get it to stop.

    Expected behavior I only want to see the message body "Hello world."

    Environment (please complete the following information):

    • 0.9.3
    • Local: Windows 10
    • SMTP Server: Kerio Connect 9.1 on Windows
    type:bug component:builder 
    opened by leontoeides 14
  • Add message logging to StubTransport

    Add message logging to StubTransport

    This makes it more useful as a testing tool as it now allows you to retrieve all messages sent via this transport.

    I don't really like the

    message_log: Arc::new(StdMutex::new(vec![])),
    #[cfg(any(feature = "tokio1", feature = "async-std1"))]
    message_log_futures: Arc::new(FuturesMutex::new(vec![])),
    

    construct but I didn't find a better way.

    opened by svenstaro 12
  • 0.10.0 blockers

    0.10.0 blockers

    • [x] make a doc pass (fix outdated docs, fix formatting for some code samples, like some from SMTP transport, which look broken ecc.)
    • [x] prepare a meaningful changelog, and some migration instructions from 0.9 to 0.10
    • [x] Pool customization (https://github.com/lettre/lettre/pull/463#discussion_r485186473) (PR #479)
    • [x] danger_accept_invalid_hostnames for TlsParameters (see gitter discussion) (PR #471)
    • [x] Configure a custom root certificate in TlsParameters (PR #473)
    • [x] Replace usage of unwrap in doctests (see https://rust-lang.github.io/api-guidelines/documentation.html#c-question-mark) (PR #491)
    • [x] Replace the IntoCredentials trait with From (PR #478)
    • [x] Upgrade base64 crate for us and hyperx (PR #477)
    • [x] Adding a README to the examples folder, describing what every example does (PR #489)
    • [x] Reworking the CI configuration and using cargo-hack to test every combination of features
    • [x] Rethink top-level exports (PR #487)
    • [x] Move Envelope into address (PR #488)
    • [x] fix lettre::transport::smtp examples (PR #536)
    • [x] Reconsider features enabled by default
    • [x] get https://lettre.rs ready (https://github.com/lettre/lettre.rs/issues/4)
    • [x] Rethink errors in lettre::smtp::error::Error
    • [x] Tests for AsyncSmtpTransport
    good first issue hacktoberfest 
    opened by amousset 12
  • Build 0.8.2 fails to compile against nom 3.2.1

    Build 0.8.2 fails to compile against nom 3.2.1

    error[E0432]: unresolved import `nom::simple_errors`
     --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/response.rs:5:10
      |
    5 | use nom::simple_errors::Err as NomError;
      |          ^^^^^^^^^^^^^ Could not find `simple_errors` in `nom`
    
    error[E0433]: failed to resolve. Could not find `simple_errors` in `nom`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/error.rs:40:18
       |
    40 |     Parsing(nom::simple_errors::Err),
       |                  ^^^^^^^^^^^^^ Could not find `simple_errors` in `nom`
    
    error[E0433]: failed to resolve. Could not find `simple_errors` in `nom`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/error.rs:98:16
       |
    98 | impl From<nom::simple_errors::Err> for Error {
       |                ^^^^^^^^^^^^^ Could not find `simple_errors` in `nom`
    
    error[E0433]: failed to resolve. Could not find `simple_errors` in `nom`
      --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/error.rs:99:23
       |
    99 |     fn from(err: nom::simple_errors::Err) -> Error {
       |                       ^^^^^^^^^^^^^ Could not find `simple_errors` in `nom`
    
    error[E0119]: conflicting implementations of trait `std::convert::From<[type error]>` for type `smtp::error::Error`:
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/error.rs:104:1
        |
    98  | impl From<nom::simple_errors::Err> for Error {
        | -------------------------------------------- first implementation here
    ...
    104 | impl From<Response> for Error {
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `smtp::error::Error`
    
    error[E0119]: conflicting implementations of trait `std::convert::From<[type error]>` for type `smtp::error::Error`:
       --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/lettre-0.8.2/src/smtp/error.rs:114:1
        |
    98  | impl From<nom::simple_errors::Err> for Error {
        | -------------------------------------------- first implementation here
    ...
    114 | impl From<&'static str> for Error {
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `smtp::error::Error`
    
    error: aborting due to 6 previous errors
    
    Some errors occurred: E0119, E0432, E0433.
    For more information about an error, try `rustc --explain E0119`.
    error: Could not compile `lettre`.
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    
    opened by jnicholls 12
  • Examples Not Working

    Examples Not Working

    I'm trying to use this crate in a project I'm working on, and I can't get the examples to compile. They cause panics.

    My code (the example code):

    use lettre::transport::smtp::{SmtpTransport, SmtpTransportBuilder};
    use lettre::email::EmailBuilder;
    use lettre::transport::EmailTransport;
    
    let email = EmailBuilder::new()
                        .to("root@localhost")
                        .from("user@localhost")
                        .body("Hello World!")
                        .subject("Hello")
                        .build()
                        .unwrap();
    
    // Open a local connection on port 25
    let mut mailer =
    SmtpTransportBuilder::localhost().unwrap().build();
    // Send the email
    let result = mailer.send(email);
    
    assert!(result.is_ok());
    

    The error:

    thread '<main>' panicked at 'assertion failed: result.is_ok()', main.rs:26
    note: Run with `RUST_BACKTRACE=1` for a backtrace.
    Process didn't exit successfully: `/path/to/code` (exit code: 101)
    
    opened by sezna 12
  • Serde support for ContentType

    Serde support for ContentType

    Is your feature request related to a problem? Please describe. I'd like to store attachments in a struct like this:

    #[derive(Debug, Serialize)]
    pub struct Attachment {
        pub filename: String,
        pub content_type: ContentType,
        pub body_raw: Vec<u8>,
    }
    

    but the problem is, that ContentType can't be serialized, unless I implement the trait on my own.

    Describe the solution you'd like That the Serialize macro-derives (I don't really know what the correct name is) serializes the type ContentType automatically for me.

    Describe alternatives you've considered Implementing the Serialize trait on my own.

    Additional context I don't think that we need an additional context here.

    type:feature type:question component:builder 
    opened by TornaxO7 11
  • Error None reported

    Error None reported

    I've used the example smtp-gmail.rs for the 10 alpha release.

    Unfortunately although it builds fine on Windws10 and Linux(RH7.4) I'm getting strange errors. I'm looking to eventually replace some perl scripts one of which sends mail:

            my $owner = "Simon.Heffer\@cpy.com";
            my $smtp = Net::SMTP->new("smtp.cpy.com",
                            Timeout => 60);
            $smtp->mail("Simon.Heffer\@cpy.com");
            $smtp->to($owner);
            $smtp->data;
            $smtp->datasend("Subject:$subject");
            $smtp->datasend("\n");
            $smtp->datasend("To: $owner");
                    $smtp->datasend("\n\n");
            $smtp->datasend("\n");
            $smtp->datasend("\n\n");
            $smtp->dataend;
            $smtp->quit;
    

    I've plugged in the servername/addresses from here into your example but get (on LINUX): Could not send email: Err(Pool(Error(None)))

    I've tried with and without creds (there are none above)

    Any further debugging I can do?

    type:bug component:builder 
    opened by SimonHeffer 11
  • Replace webpki-roots with rustls-native-certs

    Replace webpki-roots with rustls-native-certs

    Potential fix for #742, but not sure if we consider this breaking. See the discussion there for background.

    This implementation is loosely based on hyper-rustls (also MIT): https://github.com/rustls/hyper-rustls/blob/21c4d3749c5bac74eb934c56f1f92d76e1b88554/src/config.rs#L27-L47

    Tested on macOS connecting to GMail.

    opened by stephank 1
  • Getting the following error when using smtp tls example

    Getting the following error when using smtp tls example

    Describe the bug A clear and concise description of what the bug is.

    thread 'tokio-runtime-worker' panicked at 'Could not send email: lettre::transport::smtp::Error { kind: Network, source: Custom { kind: InvalidData, error: CorruptMessage } }', src/email_service.rs:52:19
    

    To Reproduce

    pub fn send_email() -> Result<(), ServiceError> {
        
        let email = Message::builder()
            .from("NoBody <[email protected]>".parse().unwrap())
            .reply_to("Yuin <[email protected]>".parse().unwrap())
            .to("Hei <[email protected]>".parse().unwrap())
            .subject("Happy new year")
            .body(String::from("Be happy!"))
            .unwrap();
    
        let creds = Credentials::new("etherealusername".to_string(), "etherealpassword".to_string());
    
        // Open a remote connection to gmail
        let mailer = SmtpTransport::relay("smtp.ethereal.email")
            .unwrap()
            .timeout(Some(std::time::Duration::new(5, 100)))
            .port(587)
            .credentials(creds)
            .build();
    
        // Send the email
        match mailer.send(&email) {
            Ok(_) => Ok(()),
            Err(e) => panic!("Could not send email: {:?}", e),
        }
    }
    

    Expected behavior Email should be received on ethereal

    Environment (please complete the following information):

    • Lettre version - 0.10.1
    • OS macos m1

    Additional context Add any other context about the problem here.

    opened by shanurrahmanpenny 1
  • Improve mailbox parsing using chumsky

    Improve mailbox parsing using chumsky

    Since #827 #832 and #838, I thought about improving the parsing using https://github.com/zesterer/chumsky. This lib helps to build solid parsers and to be as close as possible to what RFCs propose.

    Here (in this draft PR) a preview of what it could look like, is it sth you would be interested in or not?

    opened by soywod 6
  • Double quote not removed when parsing Mailbox from str

    Double quote not removed when parsing Mailbox from str

    Describe the bug

    Double quote not removed when parsing Mailbox from str.

    To Reproduce

    let mbox: Mailbox = "\"Quoted, name\" <[email protected]>".parse().unwrap();
    assert_eq!(Some("Quoted, name".into()), mbox.name);
    
    // thread 'xxx' panicked at 'assertion failed: `(left == right)`
    //   left: `Some("Quoted, name")`,
    //  right: `Some("\"Quoted, name\"")`'
    

    Expected behavior

    Quotes should be removed

    Environment (please complete the following information):

    • Lettre version v0.10.1
    • OS Linux 5.10.111 #1-NixOS SMP Wed Apr 13 19:01:11 UTC 2022
    opened by soywod 0
  • feat: add lmtp support to smtp transport

    feat: add lmtp support to smtp transport

    I'm not sure what this API should look like, but I have tried my best to reuse most of the code.

    Maybe it would be better to store LMTP as a config parameter and return multiple responses for plain SMTP too, instead of specializing on LMTP protocol using const generic?

    I have tried implementing separate struct for LMTP protocol, wrapping SMTP, however it would be too much boilerplate to delegate every method except send to wrapped SMTP connection.

    I also have tried to use sealed generic instead of boolean const, but this didn't go well too (But maybe this approach can be implemented, if I'll try harder?)

    trait Protocol;
    struct Smtp;
    struct Lmtp;
    impl Protocol for Smtp {}
    impl Protocol for Lmtp {}
    
    impl<P: Protocol> MtpConnection<P> {...}
    impl MtpConnection<Smtp> {...}
    impl MtpConnection<Lmtp> {...}
    

    Fixes: https://github.com/lettre/lettre/issues/820

    opened by CertainLach 1
  • Multipart with inline and attached files

    Multipart with inline and attached files

    Is your feature request related to a problem? Please describe. Creating a multiparty alternative (html & plain text) is not as straightforward as it sounds. Apart from one example for alternative parts there isn't anything in the crate to support this functionality.

    Describe the solution you'd like I have a working example with a struct that I'd like to propose in order to:

    • have attached files to the email
    • have attached files for the html (used with src="cid:context_id.png")
    • add both plain and html representation to the email

    Additional context Should improve greatly the API design by providing this helper/builder for emails.

    opened by elpiel 0
Releases(v0.10.1)
  • v0.10.1(Jul 27, 2022)

    Features

    • Add boring-tls support for SmtpTransport and AsyncSmtpTransport. The latter is only supported with the tokio runtime. (#797) (#798)
    • Make the minimum TLS version configurable. (#799) (#800)

    Bug Fixes

    • Ensure connections are closed on abort. (#801)
    • Fix SMTP dot stuffing. (#803)
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Jun 29, 2022)

  • v0.10.0-rc.1(May 14, 2021)

    After more than two years since 0.9 release, we're close to 0.10! 0.10 branch is already widely used and is thought to be more reliable than 0.9, so it should generally be used for new projects.

    We'd love to hear your feedback about 0.10 design and APIs before final release!

    Start a discussion in the repository, whether for feedback or if you need help or advice using or upgrading lettre 0.10.

    Source code(tar.gz)
    Source code(zip)
  • v0.10.0-alpha.1(May 31, 2020)

Owner
lettre
a mailer library for Rust
lettre
Rust library to parse mail files

mailparse A simple parser for MIME email messages. API The primary entry point for this library is the following function: parse_mail(&[u8]) -> Re

Kartikaya Gupta (kats) 150 Dec 27, 2022
Fast and robust e-mail parsing library for Rust

mail-parser mail-parser is an e-mail parsing library written in Rust that fully conforms to the Internet Message Format standard (RFC 5322), the Multi

Stalwart Labs 158 Jan 1, 2023
mail-builder is a flexible e-mail builder library written in Rust that generates RFC5322 compliant e-mail messages

mail-builder mail-builder is a flexible e-mail builder library written in Rust that generates RFC5322 compliant e-mail messages. The library has full

Stalwart Labs 37 Dec 19, 2022
An ESMTP server library written in Rust.

rs-smtp An ESMTP server library written in Rust. Features ESMTP client & server implementing RFC 5321 Support for SMTP AUTH and PIPELINING UTF-8 suppo

DUNEF 3 Apr 15, 2023
E-mail delivery library for Rust with DKIM support

mail-send mail-send is a Rust library to build, sign and send e-mail messages via SMTP. It includes the following features: Generates e-mail messages

Stalwart Labs 165 Oct 23, 2023
A small unofficial library to send emails using Sendgrid.

sendgrid_thin A thin wrapper around the SendGrid V3 API. It does not use the crate tokio or hyper and is therefore very lightweight and do not interfe

Reinaldo Rozato Junior 3 Nov 17, 2022
新しい IMAP client in Rust

新しい IMAP client 新しい (atarashii/new) IMAP client in Rust. It supports plain and secure connections. In progress It's under development... Usage Put thi

Alex Maslakov 39 Sep 13, 2020
Implementation of mjml in rust

MRML Introduction This project is a reimplementation of the nice MJML markup language in Rust. How to use it use mrml; fn main() { match mrml::to

Jérémie Drouet 228 Dec 28, 2022
Rust implementation of catapulte email sender

Catapulte What is catapulte? Catapulte is an open source mailer you can host yourself. You can use it to quickly catapult your transactionnal emails t

Jérémie Drouet 108 Dec 14, 2022
📫Himalaya: CLI email client written in Rust.

??Himalaya: CLI email client written in Rust.

Clément DOUIN 2.1k Jan 7, 2023
Check if an email address exists without sending any email, written in Rust.

Check if an email address exists without sending any email, written in Rust.

Reacher 3.5k Dec 31, 2022
A mail suite written in rust meant to be easy to use.

Erooster A mail suite written in rust meant to be easy to use. Getting started Currently the setup is quite rough. You need some certificates for your

Marcel 33 Dec 19, 2022
A rewrite of the server side parts of emersion/go-smtp package into rust.

rust-smtp-server A rust smtp server library. It's mainly a rewrite of the server side parts of the emersion/go-smtp library. Features Usage Add this t

Nick Westendorf 3 Apr 26, 2023
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
Rust 核心库和标准库的源码级中文翻译,可作为 IDE 工具的智能提示 (Rust core library and standard library translation. can be used as IntelliSense for IDE tools)

Rust 标准库中文版 这是翻译 Rust 库 的地方, 相关源代码来自于 https://github.com/rust-lang/rust。 如果您不会说英语,那么拥有使用中文的文档至关重要,即使您会说英语,使用母语也仍然能让您感到愉快。Rust 标准库是高质量的,不管是新手还是老手,都可以从中

wtklbm 493 Jan 4, 2023
Rust library for build scripts to compile C/C++ code into a Rust library

A library to compile C/C++/assembly into a Rust library/application.

Alex Crichton 1.3k Dec 21, 2022
Rust Imaging Library's Python binding: A performant and high-level image processing library for Python written in Rust

ril-py Rust Imaging Library for Python: Python bindings for ril, a performant and high-level image processing library written in Rust. What's this? Th

Cryptex 13 Dec 6, 2022
The gRPC library for Rust built on C Core library and futures

gRPC-rs gRPC-rs is a Rust wrapper of gRPC Core. gRPC is a high performance, open source universal RPC framework that puts mobile and HTTP/2 first. Sta

TiKV Project 1.6k Jan 7, 2023
A µTP (Micro/uTorrent Transport Library) library implemented in Rust

rust-utp A Micro Transport Protocol library implemented in Rust. API documentation Overview The Micro Transport Protocol is a reliable transport proto

Ricardo Martins 134 Dec 11, 2022
A library to compile USDT probes into a Rust library

sonde sonde is a library to compile USDT probes into a Rust library, and to generate a friendly Rust idiomatic API around it. Userland Statically Defi

Ivan Enderlin 40 Jan 7, 2023