This is the implementation of a light SMTP server library for Rust. It is designed to be used in a server application that needs to receive emails.
It has a fully custom-built SMTP command parser and handler. The most advanced SMTP server for rust so far has been Stalwart's SMTP Server, which is a great library but I believe there exists use cases where you just want something minimal and simple.
Due to time restrictions I have restricted the scope of this SMTP server to serve as an MTA only. This means that it does not perform any kind of processing on the received emails, it just receives them and transmits them via an unbounded channel. It is up to the user to perform security checks like SPF or DKIM verification.
HELO
- HELOEHLO
- Extended HELOSTARTTLS
- Supports upgrading to TLSMAIL FROM
- Sender email addressRCPT TO
- Recipient email addressDATA
- Email dataQUIT
- Close connection
* As you might notice, not all SMTP commands are supported. This is because of the limited scope of this project. minismtp
is designed to be a simple and very light SMTP server used to just receive raw emails and pipe them elsewhere.
The server supports full encryption via the STARTTLS
command. The encryption upgrade is performed through my tokio-tls-upgrade which is a custom-built library that allows for a seamless upgrade of a TCP connection to a TLS connection.
Add this to your Cargo.toml
:
[dependencies]
minismtp = "0.1.0"
Here is an example of how to use the library:
use minismtp::server::SmtpServer;
use std::time::Duration;
use tokio::time::timeout;
#[tokio::main]
async fn main() {
let server = SmtpServer::new(
"localhost",
2525,
"localhost",
Some(Duration::from_secs(10)),
None,
None,
None,
);
let listening_server = server.start().await.unwrap();
// Actually send an email to the server and do something with this
// returned value.
let _ = timeout(Duration::from_secs(5), listening_server.mail_rx.recv()).await;
listening_server.stop().await.unwrap();
}
The domain replied to in the EHLO
/EHLO
command can be changed by setting the environment variable MINISMTP_DOMAIN
to the desired domain.
export MINISMTP_DOMAIN="mydomain.com"
See the LICENSE file for license rights and limitations (MIT).