#smtp-server #smtp #server #peg #async #parser

samotop

基于 async-std 的 SMTP 服务器和库

25 个版本

0.13.2 2022 年 1 月 30 日
0.13.0 2021 年 8 月 4 日
0.12.0 2021 年 2 月 6 日
0.11.1 2020 年 11 月 21 日
0.7.2 2018 年 7 月 13 日

#45 in 电子邮件

Download history 81/week @ 2024-03-12 62/week @ 2024-03-19 42/week @ 2024-03-26 82/week @ 2024-04-02 72/week @ 2024-04-09 92/week @ 2024-04-16 98/week @ 2024-04-23 103/week @ 2024-04-30 96/week @ 2024-05-07 132/week @ 2024-05-14 87/week @ 2024-05-21 377/week @ 2024-05-28 141/week @ 2024-06-04 88/week @ 2024-06-11 115/week @ 2024-06-18 25/week @ 2024-06-25

554 次每月下载
2 crate 中使用

MIT/Apache 和可能 GPL-3.0-or-later

260KB
6K SLoC

Build Status Maintenance

samotop 0.13.2

这是一个专注于隐私的 SMTP 服务器库。还有一个实际的 SMTP 服务器 - 请参阅 samotop-server

SMTP 服务器(中继/MTA、投递/MDA)库,针对 Rust,专注于垃圾邮件消除和隐私。其动机是复兴电子邮件基础设施和架构,解决当前问题,并允许新的系统集成 SMTP。它被称为 SaMoToP,这是一个很棒的捷克语单词。

状态

您可以实现自己的邮件服务并将其插入,专注于功能而不是协议本身或样板代码。API 基于 async/await 提供了一个便捷的异步接口。我们有一个相当不错的 SMTP 命令解析器,它是一个 PEG 语法编写的。模型与 RFCs 紧密相关。基于 async-std 的服务器将听取您的 SMTP 命令,驱动 SMTP 状态机,并在您偏离时纠正您。一旦邮件会话准备就绪,邮件可以输出到控制台,保存在文件夹中或传递给下游的 SMTP/LMTP 服务器。之后,您可以再次进行。请参阅 api 文档。samotop crate 已在 crates.io 上发布。

完成

  • 根据 RFC 解析 SMTP 命令并编写响应
  • SMTP 状态机 - helo、mail、rcpt*、data、rset、quit - 必须按 RFCs 中的顺序排列
  • 正确处理并终止 DATA(转义点,结束点)。
  • 基于 async-std 的 async/await
  • 隐私:支持 TLS/STARTTLS,使用 rustlsnative_tls
  • 隐私:静态加密,S/MIME 加密电子邮件,只有收件人才能够解密
  • MTA:简单的邮件中继,将 smtp 会话记录到标准输出,但能够接收来自常见中继的邮件
  • MDA:全局邮箱 - 所有未声明的域/地址的邮箱 - 将邮件保存在文件夹中以供进一步处理
  • MDA:域名邮箱 - 未声明的地址的邮箱(通过 LMTP 到另一个 LDA)
  • MDA: 用户邮箱 - 特定地址或别名的邮箱(通过LMTP连接到另一个LDA)
  • MDA: 将邮件存储在Maildir中(通过LMTP连接到另一个LDA)
  • MDA: 智能邮箱 - 通过约定具有多个邮箱地址
  • 集成:LMTP套接字 - 可以通过LMTP在Unix或网络套接字上发送到LDA
  • 集成:LMTP子进程 - 可以使用LMTP协议通过父子进程与io通信发送到LDA
  • LDA:可以处理LMTP会话(LHLO + 每个rcpt的投递状态)
  • 反垃圾邮件:拒绝SPF检查失败的邮件 - 通过 viaspf 框架,现在为异步
  • 反垃圾邮件:严格的SMTP - 需要CRLF
  • 反垃圾邮件:严格的SMTP - 如果客户端在提示信息之前发送邮件,则拒绝会话 - Prudence
  • 反滥用:命令超时 - Impatience
  • 可扩展性:模块化和可组合的服务 - Builder + Configuration + MailSetup => Service

待办事项

  • 账户:通过SMTP/IMAP进行自助账户订阅
  • MTA:队列和队列管理器,转发邮件到另一个MTA
  • 反垃圾邮件:白名单和黑名单
  • 反垃圾邮件:灰名单
  • 反垃圾邮件:带有UI的白/黑/灰名单 - 用户决定新的联系人处理方式
  • 反垃圾邮件:是否加密?
  • 反垃圾邮件:反向查找
  • 反垃圾邮件:带有UI的DANE(DNSSEC) - 用户验证签名
  • 隐私:拒绝未加密的会话
  • 隐私:不留痕迹,无日志,混淆的文件日期...

安装

将此内容添加到您的 Cargo.toml

[dependencies.samotop]
version = "0"

使用方法

请参阅 docs.rs 上的文档。

请注意,API仍不稳定。请使用最新版本。

从Samotop中可以提取一些有趣的配置

  • TCP服务器(TcpServer) - 它监听IP:port,然后您可以 serve 您自己的 IoService 实现。
  • Unix套接字服务器(UnixServer) - 它监听套接字文件路径,然后您可以像使用 TcpServer 一样 serve
  • SMTP会话解析器(SmtpParser) - 它接受 &[u8] 并返回解析的命令或数据。
  • SMTP会话和域名模型(在 samotop-core 中) - 这些描述了根据RFC的域名和行为。
  • samotop-delivery 中的邮件投递抽象包括TCP/Unix套接字上的SMTP/LMTP客户端,子进程,简单的maildir,sendmail。
  • 可扩展设计 - 您可以插入或组合自己的解决方案。

SMTP服务器(带STARTTLS)

运行带有STARTTLS支持的SMTP服务器在设置TLS配置方面稍微复杂一些。该库包含了一个用于异步-tls(rustls)和异步-native-tls(native-tls)的 TlsProvider 实现。samotop-server是该TLS设置的参考,其中您只需要提供证书和密钥。您还可以实现自己的 TlsProvider 并将其插入。

SMTP服务器(明文)

您可以轻松运行不提供STARTTLS支持的纯文本SMTP服务。用您自己的实现替换 Builder 或用 Builder + mailsetup 和提供的功能组合邮件服务。

查看samotop-server以获取具有TLS和其他功能的示例。

extern crate async_std;
extern crate env_logger;
extern crate samotop;
#[async_std::main]
async fn main() {
    use samotop::mail::*;
    use samotop::smtp::*;
    use samotop::server::*;
    env_logger::init();

    let mail = Builder
                + Esmtp.with(SmtpParser);

    let srv = TcpServer::on("localhost:25").serve(mail.build());

    srv.await.expect("success")
}

TCP服务器

任何TCP服务都可以被提供。请参阅关于IoService的文档。使用RUST_LOG=trace运行以显示跟踪日志。使用它来理解网络I/O是如何处理的。从这里开始,逐步构建SMTP服务。

extern crate async_std;
extern crate env_logger;
extern crate samotop;
use samotop::server::TcpServer;
use samotop::io::DummyService;
fn main() {
    env_logger::init();
    let mut srv = TcpServer::on("localhost:0").serve(DummyService);
    async_std::task::block_on(srv).unwrap()
}

Unix套接字服务器

您也可以在Unix套接字上提供相同的服务

extern crate async_std;
extern crate env_logger;
extern crate samotop;
use samotop::server::UnixServer;
use samotop::io::DummyService;
fn main() {
    env_logger::init();
    let mut srv = UnixServer::on("local.socket").serve(DummyService);
    async_std::task::block_on(srv).unwrap()
}

标准输入输出服务器

您可以在命令行I/O上提供相同的服务。请参阅on-cmd示例。

开发

  • 需要常规的rustup + cargo设置。
  • 软件将使用Gitlab CI/CD流水线自动构建、测试和发布。
  • README是从rust文档使用cargo-readme手动生成的。请勿直接修改README。
    $ cargo readme > README.md`
    

公司

在Rust世界中,我迄今为止发现的大部分都是SMTP客户端。

SMTP服务器实现和库

  • mailinSaul Hazledine创建,与samotop相当类似
    • 相同:最近的活动(Mailin最后提交:2020年2月)
    • 相同:允许在Rust中编写SMTP服务器。
    • 相同:包括SMTP解析、响应和SMTP状态机。
    • 不同:Samotop使用PEG,Mailin使用Nom定义SMTP解析器。
    • 不同:Samotop是异步的,而Mailin在裸露的std阻塞I/O上运行。异步引入了更多的依赖项,但允许我们转向新的I/O范式。在Samotop中,SMTP会话处理是一个未来的树。Mailin使用线程池来调度工作,而Samotop可以通过异步在单个线程上运行。
    • 不太不同:samotop包含默认的TCP服务器,并允许用户以不同的方式实现它,Mailin期望用户提供套接字,但在mailin-embedded中有一个TCP服务器。因此,仅Mailin就有更小的依赖项足迹。Samotop可能也会遵循类似的做法,将crates拆分。
    • ...
  • smtpbisrustyknifeJonathan Bastien-Filiatrault创建,是异步和tokio上的SMTP库。
    • 相同:异步。
    • 不同:Samotop迁移到async-std,smtpbis在tokio上。
    • ...
  • rust-smtpmneumann创建,最后提交于2014年,解析器是手动编写的,看起来不完整且已被弃用。
  • rust-smtp是上述项目的分支,由synlestidae在2016年进行了改进

其他

  • async-smtp是来自令人惊叹的delta.chat项目的SMTP客户端。我已经将其分支为samotop-delivery。
  • lettre是SMTP客户端,看起来仍然活跃且状况良好!
  • segimapuiri创建,实际上是一个IMAP服务器。
  • ferric-mailwraithan创建,看起来自2014年以来已被弃用。
  • new-tokio-smtp是来自Philipp Korber的SMTP客户端,现在仅被动维护

许可证

MIT OR Apache-2.0

⚠️ 警告:samotop-parser-nom crate中的GPLv3 - 此crate的parser-nom功能

由于rustyknife crate采用GPLv3许可,其条款适用于您,如果您发布了包含parser-nom功能的二进制文件。

贡献

除非您明确说明,否则您提交给samotop项目的任何贡献,根据Apache-2.0许可证定义,应按上述方式许可,不附加任何额外的条款或条件。

依赖项

~5–20MB
~299K SLoC