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 电子邮件
554 次每月下载
在 2 crate 中使用
260KB
6K SLoC
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,使用 rustls 和 native_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服务器实现和库
- mailin由Saul 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拆分。
- ...
- smtpbis和rustyknife由Jonathan Bastien-Filiatrault创建,是异步和tokio上的SMTP库。
- 相同:异步。
- 不同:Samotop迁移到async-std,smtpbis在tokio上。
- ...
- rust-smtp由mneumann创建,最后提交于2014年,解析器是手动编写的,看起来不完整且已被弃用。
- rust-smtp是上述项目的分支,由synlestidae在2016年进行了改进
其他
- async-smtp是来自令人惊叹的delta.chat项目的SMTP客户端。我已经将其分支为samotop-delivery。
- lettre是SMTP客户端,看起来仍然活跃且状况良好!
- segimap由uiri创建,实际上是一个IMAP服务器。
- ferric-mail由wraithan创建,看起来自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