3 个不稳定版本

0.1.1 2024 年 2 月 13 日
0.1.0 2023 年 6 月 22 日
0.0.0 2023 年 5 月 11 日

#51 in 电子邮件

Apache-2.0

41KB
890

Crates.io docs.rs Crates.io GitHub Workflow Status (with event)

Mailfred

通过电子邮件基础设施公开服务,将电子邮件作为请求和响应处理。

动机

仅设置自定义服务以供用户使用就非常困难。您需要部署服务器、支付资源、通过公共地址托管它,并提供一个他们可以用来与您的服务交互的客户应用程序。

这是一项大量工作和维护。有时这是有道理的,但有时唯一目的是公开一个他们可以使用的基本服务,而您不希望处理这么多工作。

mailfred试图通过当前电子邮件基础设施解决这个问题。它从电子邮件账户中读取电子邮件,获取它们,处理它们,并将其作为回复发送给发件人。它不充当电子邮件服务器;它充当一个客户端(使用 SMTP 和 IMAP 协议),连接到电子邮件服务提供商。您不需要设置和部署电子邮件服务器。您不需要托管任何内容或购买公共域名地址来使其可访问(如果您想的话,您可以从自己的家中运行它)。更重要的是,您的所有用户都已经在其手机和电脑上拥有您的客户应用程序:他们自己的电子邮件客户端应用程序,他们已经知道如何使用它们。

它是如何工作的?

mailfred受到了 axum 的启发。它作为一个 HTTP 服务器工作,但它通过 IMAP 和 SMTP 协议电子邮件地址 上连接,而不是通过 TCP 传输端口 80 上连接。

发送到该电子邮件地址的每封电子邮件都会被获取并解释为 HTTP 请求。请求电子邮件通过 主题 路由到正确的服务。一旦服务处理完毕,就会发送一封新的电子邮件给发件人,就像它是 HTTP 响应一样。

image

文档

入门

将以下内容添加到您的 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 账户,您需要先设置一些事项。

  1. 创建一个新的账户,不要使用您的常规账户。mailfredIMAP 传输会从收件箱中删除它所读取的消息。
  2. Gmail 配置中启用 IMAP
  3. 为该账户启用 Gmail的应用程序密码

贡献

  • 您是否实现了路由过滤器层或新的传输? 与他人分享它!提交一个 Pull Request,让每个人都能使用它 :)

  • 您喜欢这个想法并想做出贡献吗?您是否发现了一个 bug,或者有任何 问题疑惑 不要犹豫,创建一个问题!

依赖项

~7–22MB
~323K SLoC