3 个不稳定版本
0.1.1 | 2024 年 2 月 13 日 |
---|---|
0.1.0 | 2023 年 6 月 22 日 |
0.0.0 | 2023 年 5 月 11 日 |
#51 in 电子邮件
41KB
890 行
Mailfred
通过电子邮件基础设施公开服务,将电子邮件作为请求和响应处理。
动机
仅设置自定义服务以供用户使用就非常困难。您需要部署服务器、支付资源、通过公共地址托管它,并提供一个他们可以用来与您的服务交互的客户应用程序。
这是一项大量工作和维护。有时这是有道理的,但有时唯一目的是公开一个他们可以使用的基本服务,而您不希望处理这么多工作。
mailfred
试图通过当前电子邮件基础设施解决这个问题。它从电子邮件账户中读取电子邮件,获取它们,处理它们,并将其作为回复发送给发件人。它不充当电子邮件服务器;它充当一个客户端(使用 SMTP 和 IMAP 协议),连接到电子邮件服务提供商。您不需要设置和部署电子邮件服务器。您不需要托管任何内容或购买公共域名地址来使其可访问(如果您想的话,您可以从自己的家中运行它)。更重要的是,您的所有用户都已经在其手机和电脑上拥有您的客户应用程序:他们自己的电子邮件客户端应用程序,他们已经知道如何使用它们。
它是如何工作的?
mailfred
受到了 axum
的启发。它作为一个 HTTP 服务器工作,但它通过 IMAP 和 SMTP 协议 在 电子邮件地址 上连接,而不是通过 TCP 传输 在 端口 80 上连接。
发送到该电子邮件地址的每封电子邮件都会被获取并解释为 HTTP 请求。请求电子邮件通过 主题 路由到正确的服务。一旦服务处理完毕,就会发送一封新的电子邮件给发件人,就像它是 HTTP 响应一样。
文档
入门
将以下内容添加到您的 Cargo.toml
mailfred = "0.1"
tokio = { version = "1", features = ["full"] }
tokio
是运行异步任务所必需的。
示例
use mailfred::{
router::{Router, layers::LowercaseHeader},
service::{user_error, Request, Response, ResponseResult},
transports::Gmail,
};
use tokio::sync::Mutex;
use std::sync::Arc;
#[derive(Default)]
struct MyState {
counter: u32,
}
type State = Arc<Mutex<MyState>>;
async fn count(_: Request, state: State) -> ResponseResult {
let mut state = state.lock().await;
state.counter += 1;
Response::ok("Counter stats", format!("Value: {}", state.counter))
}
async fn echo(req: Request, _: State) -> ResponseResult {
Response::ok(req.header, req.body)
}
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
let gmail = Gmail::new("user", "1234");
let router = Router::default()
.route("Count", count)
.route("Echo", echo)
.layer(LowercaseHeader);
mailfred::serve(gmail, State::default(), router).await
}
Gmail 账户配置
如果您想使用 Gmail 账户,您需要先设置一些事项。
- 创建一个新的账户,不要使用您的常规账户。
mailfred
的 IMAP 传输会从收件箱中删除它所读取的消息。 - 在 Gmail 配置中启用 IMAP。
- 为该账户启用 Gmail的应用程序密码。
贡献
-
您是否实现了路由过滤器层或新的传输? 与他人分享它!提交一个 Pull Request,让每个人都能使用它 :)
-
您喜欢这个想法并想做出贡献吗?您是否发现了一个 bug,或者有任何 问题 或 疑惑? 不要犹豫,创建一个问题!
依赖项
~7–22MB
~323K SLoC